铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 2000|回复: 8

文字放大之后,好难看啊

[复制链接]
发表于 2011-12-9 13:59 | 显示全部楼层 |阅读模式
本帖最后由 蓝烟清 于 2011-12-9 14:53 编辑

感觉好像营养不良

怎么处理得柔和一点啊。 加了阴影,发现阴影是颗粒状的。。。




来张苍炎的,咋差别这么大


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-12-9 14:48 | 显示全部楼层
字体显示不对~
SDL 显示TTF字体有分多种显示模式的
Pascal下
TTF_RenderUNICODE_blended
TTF_RenderUNICODE_Solid
TTF_RenderUNICODE_Shaded

C下:
TTF_RenderText_blended
TTF_RenderText_Solid
TTF_RenderText_Shaded

你看一下引用的函数有没有用错吧
_blended才是带柔和的字体~

点评

Good. 还是win神强力。 用blended来渲染果然可以了,阴影再设置透明度,很好  发表于 2011-12-9 14:53
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2011-12-9 14:56 | 显示全部楼层
纠结了很久,终于把它搞定了
  1. // 写字符串
  2. // x,y 坐标
  3. // str 字符串
  4. // color 颜色
  5. // size 字体大小,字形为宋体。
  6. // fontname 字体名
  7. // charset 字符集 0 GBK 1 big5
  8. // OScharset 0 简体显示 1 繁体显示
  9. int JY_DrawStr(int x, int y, const char *str,int color,int size,const char *fontname,
  10.                            int charset, int OScharset)
  11. {
  12.     SDL_Color c,c2;   
  13.         SDL_Surface *fontSurface=NULL, *fontSurface1=NULL;
  14.         int w,h;
  15.         SDL_Rect rect1,rect2,rect_dest;
  16.         SDL_Rect rect;
  17.         char tmp1[256],tmp2[256];
  18.     TTF_Font *myfont;
  19.         SDL_Surface *tempSurface;


  20.         if(strlen(str)>127){
  21.                 JY_Error("JY_DrawStr: string length more than 127: %s",str);
  22.             return 0;
  23.         }

  24.     myfont=GetFont(fontname,size);
  25.         if(myfont==NULL)
  26.                 return 1;

  27.     c.r=(Uint8) ((color & 0xff0000) >>16);
  28.         c.g=(Uint8) ((color & 0xff00)>>8);
  29.         c.b=(Uint8) ((color & 0xff));

  30.         c2.r=c.r>>1;   //阴影色
  31.         c2.b=c.b>>1;
  32.         c2.g=c.g>>1;


  33.     if(charset==0 &&  OScharset==0){//GBK -->unicode简体
  34.          JY_CharSet(str,tmp2,3);      
  35.         }
  36.         else if(charset==0 &&  OScharset==1){//GBK -->unicode繁体
  37.         JY_CharSet(str,tmp1,1);
  38.         JY_CharSet(tmp1,tmp2,2);
  39.         }
  40.     else if(charset==1 &&  OScharset==0){ //big5-->unicode简体
  41.         JY_CharSet(str,tmp1,0);
  42.         JY_CharSet(tmp1,tmp2,3);
  43.         }
  44.         else if(charset==1 &&  OScharset==1){  ////big5-->unicode繁体
  45.         JY_CharSet(str,tmp2,2);
  46.         }
  47.         else{
  48.         strcpy(tmp2,str);
  49.         }

  50.          
  51.         if(g_Rotate==0){
  52.                 rect=g_Surface->clip_rect;
  53.         }
  54.         else{
  55.             rect=RotateReverseRect(&g_Surface->clip_rect);
  56.         }

  57.     TTF_SizeUNICODE(myfont, (Uint16*)tmp2, &w, &h);
  58.        
  59.         if( (x>=rect.x+rect.w) || (x+w+1) <=rect.x ||
  60.                 (y>=rect.y+rect.h) || (y+h+1) <=rect.y){      // 超出裁剪范围则不显示
  61.         return 1;
  62.         }

  63.     fontSurface=TTF_RenderUNICODE_Blended(myfont, (Uint16*)tmp2, c);  //生成表面

  64.         fontSurface1=TTF_RenderUNICODE_Blended(myfont, (Uint16*)tmp2, c2);        //生成阴影
  65.    
  66.     if(fontSurface==NULL)
  67.                 return 1;
  68.    
  69.         rect1.x=(Sint16)x;
  70.         rect1.y=(Sint16)y;
  71.         rect1.w=(Uint16)fontSurface->w;
  72.         rect1.h=(Uint16)fontSurface->h;

  73.         if(g_Rotate==0){


  74.             rect2=rect1;

  75.                 SDL_SetAlpha(fontSurface1,SDL_SRCALPHA,56);                //设置阴影透明度
  76.                 rect_dest.x=rect2.x-1;
  77.                 rect_dest.y=rect2.y-1;
  78.                 SDL_BlitSurface(fontSurface1, NULL, g_Surface, &rect_dest);    //表面写到游戏表面--阴影色

  79.                 rect_dest.x=rect2.x-1;
  80.                 rect_dest.y=rect2.y+1;
  81.                 SDL_BlitSurface(fontSurface1, NULL, g_Surface, &rect_dest);    //表面写到游戏表面--阴影色

  82.                 rect_dest.x=rect2.x+1;
  83.                 rect_dest.y=rect2.y-1;
  84.                 SDL_BlitSurface(fontSurface1, NULL, g_Surface, &rect_dest);    //表面写到游戏表面--阴影色

  85.                 rect_dest.x=rect2.x+1;
  86.                 rect_dest.y=rect2.y+1;
  87.                 SDL_BlitSurface(fontSurface1, NULL, g_Surface, &rect_dest);    //表面写到游戏表面--阴影色
  88.                

  89.                 rect_dest.x=rect2.x;
  90.                 rect_dest.y=rect2.y;
  91.                 SDL_BlitSurface(fontSurface, NULL, g_Surface, &rect_dest);    //表面写到游戏表面



  92.         }
  93.         else if(g_Rotate==1){
  94.         tempSurface=RotateSurface(fontSurface);
  95.         SDL_FreeSurface(fontSurface);
  96.                 fontSurface=tempSurface;
  97.                 rect2=RotateRect(&rect1);

  98.                 SDL_SetAlpha(fontSurface1,SDL_SRCALPHA,56);                //设置阴影透明度
  99.                 rect_dest.x=rect2.x-1;
  100.                 rect_dest.y=rect2.y-1;
  101.                 SDL_BlitSurface(fontSurface1, NULL, g_Surface, &rect_dest);    //表面写到游戏表面--阴影色

  102.                 rect_dest.x=rect2.x-1;
  103.                 rect_dest.y=rect2.y+1;
  104.                 SDL_BlitSurface(fontSurface1, NULL, g_Surface, &rect_dest);    //表面写到游戏表面--阴影色

  105.                 rect_dest.x=rect2.x+1;
  106.                 rect_dest.y=rect2.y-1;
  107.                 SDL_BlitSurface(fontSurface1, NULL, g_Surface, &rect_dest);    //表面写到游戏表面--阴影色

  108.                 rect_dest.x=rect2.x+1;
  109.                 rect_dest.y=rect2.y+1;
  110.                 SDL_BlitSurface(fontSurface1, NULL, g_Surface, &rect_dest);    //表面写到游戏表面--阴影色
  111.                

  112.                 rect_dest.x=rect2.x;
  113.                 rect_dest.y=rect2.y;
  114.                 SDL_BlitSurface(fontSurface, NULL, g_Surface, &rect_dest);    //表面写到游戏表面

  115.         
  116.         }

  117.     SDL_FreeSurface(fontSurface);   //释放表面
  118.         SDL_FreeSurface(fontSurface1);   //释放阴影表面
  119.     return 0;
  120. }
复制代码



【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2011-12-9 15:02 | 显示全部楼层
回复 winson7891 的帖子

英文操作系统下,游戏中文显示有问题不知道win神知不知道怎么回事




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-12-9 15:09 | 显示全部楼层
回复 蓝烟清 的帖子

代码40到56行是什么意思?

点评

把简体和繁体的Unicode编码存到数组中.....再去匹配....很原始的方法  发表于 2011-12-9 15:15
文字转码,鱼写的  发表于 2011-12-9 15:12
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2011-12-9 15:12 | 显示全部楼层
回复 winson7891 的帖子
  1. // 汉字字符集转换
  2. // flag = 0   Big5 --> GBK     
  3. //      = 1   GBK  --> Big5   
  4. //      = 2   Big5 --> Unicode
  5. //      = 3   GBK  --> Unicode
  6. // 注意要保证dest有足够的空间,一般建议取src长度的两倍+2,保证全英文字符也能转化为unicode
  7. int  JY_CharSet(const char *src, char *dest, int flag)
  8. {

  9.     Uint8 *psrc,*pdest;
  10.     Uint8 b0,b1;
  11.         int d0;
  12.         Uint16 tmpchar;

  13.         psrc=(Uint8*)src;
  14.         pdest=(Uint8*)dest;

  15.     for(;;){
  16.         b0=*psrc;
  17.                 if(b0==0){       //字符串结束
  18.                         if( (flag==0) || (flag==1) ){
  19.                                 *pdest=0;
  20.                                 break;
  21.                         }
  22.                         else{    //unicode结束标志 0x0000?
  23.                                 *pdest=0;
  24.                                 *(pdest+1)=0;
  25.                                 break;               
  26.                         }
  27.                 }
  28.                 if(b0<128){      //英文字符
  29.                         if( (flag==0) || (flag==1) ){  //不转换
  30.                                 *pdest=b0;
  31.                                 pdest++;
  32.                                 psrc++;
  33.                         }
  34.                         else{                //unicode 后面加个0
  35.                                 *pdest=b0;
  36.                                 pdest++;
  37.                                 *pdest=0;
  38.                                 pdest++;
  39.                                 psrc++;               
  40.                         }
  41.                 }
  42.                 else{              //中文字符
  43.                         b1=*(psrc+1);
  44.             if(b1==0){     // 非正常结束
  45.                 *pdest='?';
  46.                                 *(pdest+1)=0;
  47.                                 break;
  48.                         }
  49.                         else{
  50.                                 d0=b0+b1*256;
  51.                                 switch(flag){
  52.                                 case 0:   //Big5 --> GBK   
  53.                          tmpchar=big5_gbk[b0-128][b1];
  54.                                         break;
  55.                                 case 1:   //GBK  --> Big5  
  56.                                         tmpchar=gbk_big5[b0-128][b1];
  57.                                         break;
  58.                                 case 2:   //Big5 --> Unicode
  59.                                         tmpchar=big5_unicode[b0-128][b1];
  60.                                         break;
  61.                                 case 3:   //GBK  --> Unicode
  62.                                         tmpchar=gbk_unicode[b0-128][b1];
  63.                                         break;               
  64.                                 default:
  65.                                         tmpchar=0;
  66.                                 }
  67.                
  68.                                 if(tmpchar !=0){
  69.                     *(Uint16*)pdest=tmpchar;
  70.                                 }
  71.                                 else{
  72.                     *pdest='?';
  73.                                         *(pdest+1)='?';
  74.                                 }

  75.                                 pdest=pdest+2;
  76.                                 psrc=psrc+2;
  77.                         }
  78.         }
  79.         }

  80.     return 0;
  81. }


  82. //加载码表文件
  83. //码表文件顺序: 按GBK排列,unicode,big5。然后按big5排列,unicode和gbk。
  84. int LoadMB(const char* mbfile)
  85. {
  86.         FILE *fp;
  87.         int i,j;

  88.         Uint16 gbk,big5,unicode;

  89.         fp=fopen(mbfile,"rb");
  90.     if(fp==NULL){
  91.                 JY_Error("cannot open mbfile");
  92.                 return 1;
  93.         }

  94.         for(i=0;i<128;i++){
  95.                 for(j=0;j<256;j++){
  96.                         gbk_unicode[i][j]=0;
  97.                         gbk_big5[i][j]=0;
  98.                         big5_gbk[i][j]=0;
  99.                         big5_unicode[i][j]=0;
  100.                 }
  101.         }

  102.         for(i=0x81;i<=0xfe;i++){
  103.                 for(j=0x40;j<=0xfe;j++){
  104.                         if( j != 0x7f){
  105.                                 fread(&unicode,2,1,fp);
  106.                                 fread(&big5,2,1,fp);
  107.                                 gbk_unicode[i-128][j]=unicode;
  108.                                 gbk_big5[i-128][j]=big5;
  109.             }
  110.                 }
  111.         }

  112.    for(i=0xa0;i<=0xfe;i++){
  113.                 for(j=0x40;j<=0xfe;j++){
  114.                         if( j <= 0x7e || j>=0xa1){
  115.                                 fread(&unicode,2,1,fp);
  116.                                 fread(&gbk,2,1,fp);
  117.                                 big5_unicode[i-128][j]=unicode;
  118.                                 big5_gbk[i-128][j]=gbk;
  119.                         }
  120.                 }
  121.    }

  122.         fclose(fp);
  123.    
  124.     return 0;
  125. }
复制代码


【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-12-9 15:14 | 显示全部楼层
楼上的帖子都是15:12分了

为什么我电脑才14:58???

点评

论坛穿越了....  发表于 2011-12-9 15:17
你穿越了,恭喜恭喜  发表于 2011-12-9 15:15
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-12-9 15:22 | 显示全部楼层
没看出来问题根源。原则上MOD不依靠系统字体,是可以在英文操作系统下正常游戏的
但:
1. 首先,鱼大写的代码,那些字符串的来源是哪里?是在游戏的对话文件里面,也就是里面的数据是16进制保存的,读取不会出现问题
2. Lua脚本文件里面,那些东东是可以用记事本打开的,如果系统没有中文支持,打开中文全部会变问号或者方框,所以游戏打开就会全部都显示同一个字
3. 还是没看出来drawstr的意义何在……

点评

好像确实和系统没有关系的, 奇怪了。 再测试看看啊  发表于 2011-12-9 15:28
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2011-12-9 15:46 | 显示全部楼层
回复 winson7891 的帖子

原来少了这个hzmb.dat

10. 字符显示由于采用了SDL_ttf,以unicode方式显示truetype文件中的字符。为了进行与os无关的汉字字符转换,预先产生了hzmb.dat文件,放在bin目录下,保存gbk-big5-unicode的转换表。

点评

那解决了吧~自己改为“已解决”吧  发表于 2011-12-9 15:50
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-5-17 15:15

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表