Skip to content


毕业设计 - 手机版泡泡堂

23,640 浏览

4.5 文字换行与分页
游戏的帮助与关于是一个纯文字显示界面,由于只允许使用低级UI,使得文字显示只能通过Graphics.drawChar或Graphics.drawString方法将其绘制在画布上。而市场上的手机有千万种,各机型分辨率、文字大小都有自己的配置,甚至在同一台手机上,拉丁字母的宽度也是不同的,这些差异使得必须有一个全面兼容的方案来解决文字的换行与分页问题。
本项目中的StringLayout便是一个专用于文字布局的类,比较好的解决了上面提到的问题。这是本项目中唯一使用的一个第三方类,原作者将其发布在互联网上并允许他人免费使用或修改。

StringLayout类的原理是在绘制文字前不断测试新加入的字符是否为换行符并根据Font.stringWidth(String str)计算当前行宽度,当检测到当前行宽接近屏宽时则把当前行文字保存在一个Vector中,再继续计算下一行,直至计算完所有文字。
int begin = 0;
fontHeight = font.getHeight();
lineCount = 0;
line = new Vector(5, 2);
for (int i = 0; i < text.length(); i++)
{
char ch = text.charAt(i);

if (font.stringWidth(text.substring(begin, i + 1)) >= layoutWidth
|| i == text.length() - 1 || ch == '\n')
{ // layoutWidth-3中的3为偏移值
if(i == text.length() - 1)
i++;
line.addElement(text.substring(begin, i));
if (ch == '\n')
begin = i + 1;
else
begin = i;
lineCount++;
}
}

在绘制文字的时候则从指定行开始遍历Vector,读出每行内容并将其画在Graphics上。由于文字是先计算好再保存在Vector中的,不用担心超过会屏高的问题。
/**
* 画出字符串
*/
public void draw(Graphics g, int x, int y)
{
int i1 = g.getClipX();
int j1 = g.getClipY();
int k1 = g.getClipWidth();
int l1 = g.getClipHeight();

g.setClip(layoutX, layoutY, layoutWidth, layoutHeight);
g.setFont(font);
for (int i = currLine; i < line.size(); i++)
{
String s = (String) line.elementAt(i);
g.drawString(s, x, y + (i - currLine) * (fontHeight + lineGap),
Graphics.TOP | Graphics.LEFT);
}

g.setClip(i1, j1, k1, l1);
isChange = false;
}

图 4.5 1 自动换行效果
由于采用了先计算再绘制的方式、而且使用了Vector保存文字排版,该类对于大段的文字显示(如电子书阅读器)显示是不适合的,这将使文字第一次显示的时间相当漫长而且会大量消耗内存。但对于本游戏中少量的文字显示,影响并不大,出于时间的考虑,并没有对它进行重写。

Posted in 瞎编乱造.

Tagged with , , , , , , , .


47 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. panda says

    so cool~

  2. 骨头 says

    好详尽的注释
    我上次做项目的时候,开始没写注释
    结果后来交的时候要求30%的注释量
    从头注释那一堆代码的时候
    那个晕啊!

  3. cui says

    确实很酷!
    这样一来我都觉得自己做的设计根本没有任何意义。

  4. Isword says

    很不错,谢谢你的分享了!!

  5. 匿名 says

    谢谢啊

  6. snowtree says

    老大,没有下载版吗?

    我也是在做毕业设计,感觉j2me同j2ee实在差别太大了。快崩溃了。

    还有,你的画面很漂亮呀。

  7. cpiz says

    下载版?
    不是有源程序嘛,deployed目录下的PopTang.jar和PopTang.jad就可以直接传到手机里用了。

  8. 胡光 says

    呵呵,记得我当时实习手机开发上美工课画像素画....
    手那是发麻啊~~~

  9. 白菜 says

    不错啊,非常感谢!!!

  10. 阿七[seven] says

    赞一个

    你的作品和论文写得很好,觉得你做东西真的很认真,佩服

    记得我一年多前做毕业设计,很多都是应付式的,现在觉得真是有点后悔。

    最近想学学j2me,主要是搞个超级玛丽,谢谢你的作品了,有很好的参考价值。

  11. jiajia says

    很好呀!要象你多学点。

  12. zxd says

    真是太伟大了

  13. 匿名 says

    你怎么不搞个大屏的啊
    ?

  14. cpiz says

    因为我自己用的N6070就这么大,方便测试

  15. huyan says

    非常感谢
      正打算做手机游戏的毕业设计,没有头绪一定好好参考.
      就不客气的收下了

  16. 菜鸟长不大! says

    感激不尽!(一百遍) 楼主太好了! 我都不知道用语言了! 总之一句感激不尽! 279636240是我的QQ希望高手们多多指点!

  17. 9527 says

    楼主很不错啊,向你学习钻研和贡献精神

  18. 张康乐 says

    lz强人!张某佩服。小弟现在国外工作,实不如意,打算明年年底回国工作,打算从事J2ME手机游戏的开发工作。因为我喜欢玩游戏,一直都想自己做个游戏,可惜,雷声大,雨点小。
    我的毕业设计是JPG和BMP图片的相互转换,用TurboC2谢谢,最后实现了,可是,程序写得很烂,跟Lz比简直是相差十万八千里啊,一句话,还是佩服!
    昨晚配置J2ME的环境,搞到凌晨3点,没有成功,装好EclipseME后,首选项中的J2me选项出来了,但是Platform Components这个选项始终没有。不知Lz能否指导小弟一下?小弟感激不尽!

  19. cpiz says

    我大半年没写过程序了,刚打开Eclipse看了下,也没找到你说的Platform Components.
    不知道你要做何用?

  20. 张康乐 says

    哦,这个问题已经解决了,Eclipe版本不同,3.2好像没有这个选项,不过系统已经配置好了,helloworld已经运行成功,不过还是谢谢你,呵呵~~

  21. 年轻的大天才 says

    我今年大四了,我跟导师说明年毕业设计换你的这个题目,因为我可能明年会进一家手机游戏公司,打算也做个泡泡堂,不知道你介不介意让我使用你的部分代码和论文,可能还需要你稍微指点一下,谢谢了
    QQ:376773982

  22. cpiz says

    可以,有疑问请联系我QQ,只是代码方面我已经忘得差不多了。。。

  23. sunisi2008 says

    哥们 你真伟大啊 收藏了

  24. 年轻的大天才 says

    老大,你什么时候上QQ啊,给你留言也没用,有没有开题报告之类的资料可以给我参考一下啊?论文有没有DOC版的,我还有几个代码的问题想请教你一下,谢谢了
    QQ:376773982

  25. cpiz says

    不好意思,平时工作非常忙,加我QQ的时请注明身份,否则一般是不通过的。

  26. 年轻的大天才 says

    9931817到底是不是你QQ啊,我用google搜到的
    根本就没有身份验证啊。

  27. cpiz says

    不好意思, 我的QQ是7405440...我也忘了我有没有在Blog上公布过QQ了.

  28. JAR says

    我想玩这款游戏,能告诉我在哪下载吗,我在你的blos里找不到,有源码我也不会用

  29. 过路者 says

    马上要毕业了,课题就是基于J2EE的手机游戏的编程,因为我是学通信的对软件的开发不是很了解,准备毕业论文就这么混过去,看到LZ和各位师哥师姐的留言我决定认真的做玩,要让以后没有遗憾。

  30. zw says

    我也是万老师的学生,他是一个很好的老师,不过我不是一个跟你一样的好学生,呵呵,是他推荐我来的,他说你做的毕业设计是代表了大学生本科的最高水平,佩服。。。师哥~~~

  31. 小暖 says

    做的不错哦..如果是大屏幕的,在模拟器上玩的会更爽的,一个字,强!还有个问题,看了下高手的论文,地图是三维的,那么,这也算一款三维游戏了吧..

  32. Don says

    你好!冒昧打扰了。我现在在做j2me的手机游戏。我是个新手。看了你的程序。我有点搞不懂。关于那个“保存关卡配置”具体是怎么做的啊。是怎么生成的十六进制配置文件的?如果你有空的话,麻烦回答下。谢谢哈!

  33. 匿名 says

    用你目录做参考写另一个游戏的论文,谢谢了

  34. 匿名 says

    你好,我现在是个大四的毕业生,由于Java根基浅薄,看了你的毕业设计关于那个关卡类的设计是怎么完成的?还望指教阿!QQ:61508486

  35. 匿名 says

    bbbbbb

  36. Andy says

    你好,我也是软件学院的学生,万老师上课的时候提过你,在这看到你的东西,很荣幸,呵呵!你的程序做的真的很好,向你学习,也请教下,你的泡泡堂在Jbuilder X里面应该如何运行,我其他的配置应该都没问题,就是运行不了,
    java.io.IOException: CreateProcess: C:\Nokia\Devices\S40_SDK_3rd_Edition_Feature_Pack_2\bin\javaw -classpath D:\ppt\classes;C:\Nokia\Devices\S40_SDK_3rd_Edition_Feature_Pack_2\lib\classes.zip ppt.PopTang error=2
    还望指教,谢谢!

  37. cpiz says

    我读书那会老师用JBuilder教学, 但我还是坚持用自己的Eclipse, 不熟悉JBuilder的配置, 帮不上你了.
    我也向你推荐Eclipse或NetBean.开发工具的选择上大可不必跟着老师走, 想当年我们学C语言时还用Turbo C, 打击了多少人...还不如用Ultra Edit + cl呢!

  38. 匿名 says

    确实不错,比我那时做的强多了!!记得我做手游毕设的时候好像还从没人做过手游毕设~~呵呵
    万老师确实是好老师,如果没有他的指导的话就无法完成游戏了!

  39. 匿名 says

    伟大啊

  40. 爱之家 says

    很强大,谢谢分享,希望能向你请教!谢谢

  41. 红剑 says

    very good
    谢谢分享,希望以后能向你请教!

  42. WellBeing says

    大虾,请较一下,请问你知道J2ME游戏的脚本是怎么写的吗?地图工具用的是什么呢?有没有相关的教程啊?网上关于脚本的东西很少,地图工具也没有教程,自己摸索蛮耗时间的说~~

  43. jerry_zihuai says

    借鉴了下你的这个项目,论文还有部分代码(主要是整体的框架),不知道可行否?谢谢先~

  44. cpiz says

    @jerry_zihuai
    无所谓~

  45. mspop says

    我喜欢玩这个游戏,嘿嘿 !

  46. nitteTraine says

    Find Canon IR2830 Sharp AR-208s

    Buy Sharp MX-M200D
    Canon Image Runner
    Image Runner 2018
    Buy Canon IR-2020
    Review Canon IR-1025IF

    High-Performance Laser All-in-One for your Business or Small Workgroup

    Buy Panasonic
    Panafax UF-7200

    Sharp FO-DC535 REFURB
    Find Brother8480DN
    Canon Canon IR-1025IF
    Sharp FO-2080

Continuing the Discussion

  1. 手机上网应用到很多地方 = 飞龙在天 linked to this post on 2008-06-10

    [...]   1. http://cpiz.com/blog/archives/115/2 [...]



Some HTML is OK

or, reply to this post via trackback.