懒骨头(http://blog.csdn.com/iamlazybone)


0.添加自己的FPS统计类:

本来Rokon有自己的FPScounter类,可只能通过debug打印显示出来,而且由于包的访问权限,无法自由的调用。于是添加一个自己的FPS统计类:

public class MyFPSCounter { public static int FPS = 0; protected static final int FPS_AVG = 5; protected static int frameCount = 0; protected static long secondStart = 0; public static void onFrame() { if (Config.IsMonitoringFPS == false) { return; } if (secondStart == 0) { secondStart = Time.getTicks(); frameCount++; return; } frameCount++; if (Time.getTicks() - secondStart >= 1000 * FPS_AVG) { secondStart += 1000 * FPS_AVG; FPS = (int) (frameCount / FPS_AVG); frameCount = 0; return; } } }

用法是在你的Scene类的onGameLoog()方法里调用MyFPSCounter.onFrame()方法。MyFPSCounter.FPS即是当前的游戏帧数。

1.设置背景图片无法显示:(From:woohyuknrg)

setBackground(new FixedBackground(Textures.background));

有些时候在Scene的构造函数中调用setBackground,竟然不会显示背景图片,有人说是图片问题,其实不然,若该方法不起作用,试试:

GameObject bg = new GameObject(0, 0, 320, 480); bg.setTexture(Textures.background); add(bg);

2.本无法显示,也就是TextSprite不起作用,已有不少人提交了这个bug,不过目前作者还没改好,我写的代码如下:(From:woohyuknrg)

TextSprite scoreSprite = new TextSprite(232, 430, 5, 10); Typeface face = Typeface.defaultFromStyle(Typeface.NORMAL); Font font = new Font(face); TextTexture text = font.createTexture("0") scoreSprite.setTexture(text); scoreSprite.setText("0"); add(scoreSprite);

我的解决方法:activity里调用createEngine(true),看过源代码的应该知道传参数true创建的引擎还包括一个RelativeLayout实例,通过getInterface()方法获取

那我可以这么作:

LayoutInflater.from(this).inflate(R.layout.score_text, getInterface()); TextView scoreText = (TextView)findViewById(R.id.scoreText); scoreText.setText("0");

其中score_text.xml就是一个AbsoluteLayout包含TextView,你可以设置这个TextView的坐标放置在界面任意地方,这样就解决了游戏中分数等文本的显示。

3.灵异bug:显示的图片发生“穿越”:(From:woohyuknrg)

至少我在开发过程中遇到不止一次了~~即使显示一个背景图,却发现这个背景图上多了一截其它图,估计跟TextureAtlas的使用有关。作者的示例教程中这样用的:

TextureAtlas atlas = new TextureAtlas(); atlas.insert(background = new Texture("bg.png")); atlas.complete();

当然我添加的图片不止一张,其中有若干insert函数的调用,并且我有多少个图片需要添加,在TextureAtlas构造函数我是传了参数的,如:new TextureAtlas(11);
解决方法:直接background = new Texture("bg.png"));不把这个Texture插入到TextureAtlas

4.Scene构造函数或者onReady函数中初始化sprite后立即执行animate函数不起作用:(From:woohyuknrg)

这个bug我也提交了的,结果后来发现有个人跟我一样也提交了这个bug,只有寄希望于作者早日修改。这个bug很奇怪,我游戏运行起来黑屏,什么都没显示,但是背景音乐还在播放,logcat也没输出什么异常错误,说明游戏还在正常运行~~~~只是黑屏

这个问题的补充,我才发现:我附件的demo由于是一启动游戏就进入了游戏界面,游戏Scene类构造函数里执行animate会黑屏。 后来我用在其他正规游戏里,进入时先是菜单按钮界面,点击开始游戏按钮后进入游戏主界面,这时在scene的构造函数里执行animate就没有问题,sprite正常播放帧动画!

5.调用scene.clearLayer(0)不起作用:(From:woohyuknrg)

clearLayer函数是清除某一层上的所有sprites,我在游戏里调用不起作用!

不过改成执行getLayer(0).clear()却起作用了~~~~~~~查看源码,clearLayer其实就是去调用的layer.clear(),为什么clearLayer不起作用,相当古怪~~~~~~希望大家也试试,看是否和我一样的情况

6.box2d的FixtureDef.filter不起作用:(From:woohyuknrg)

用过或学过box2d的应该都知道FixtureDef的filter是用来精确控制游戏里哪些sprite可以碰撞,哪些不碰撞。可是我设置其groupIndex或categoryBits和maskBits均不起作用,我已提交了这个bug,有兴趣的朋友也可以自己试下验证是否有该bug

看了下World类源代码,这个函数是控制碰撞筛选的:

rivate boolean contactFilter( long fixtureA, long fixtureB ) { if( contactFilter != null ) return contactFilter.shouldCollide( fixtures.get(fixtureA), fixtures.get(fixtureB)); else return true; }

else里直接return true了,当然设置filter不起作用!我又把Libgdx引擎源代码从svn down下来,对比一看,实际函数体应该是这样的:

private boolean contactFilter(long fixtureA, long fixtureB) { if (contactFilter != null) return contactFilter.shouldCollide(fixtures.get(fixtureA), fixtures.get(fixtureB)); else { Filter filterA = fixtures.get(fixtureA).getFilterData(); Filter filterB = fixtures.get(fixtureB).getFilterData(); if (filterA.groupIndex == filterB.groupIndex && filterA.groupIndex != 0) { return filterA.groupIndex > 0; } boolean collide = (filterA.maskBits & filterB.categoryBits) != 0 && (filterA.categoryBits & filterB.maskBits) != 0; return collide; } }

只是Rokon引擎作者个人把else的函数体去掉了。不过不用filter也罢,因为明显还可以实现contactFilter这个接口的shouldCollide方法来控制我游戏里哪些精灵碰撞和不碰撞~

从网上下载最新的2.1.0自己打包出来的jar很多人运行都会遇到黑屏,其实是VBO在作怪,因为貌似很多机型都不支持VBO,偏偏作者还专门写了利用VBO绘制,只要在你的子类activity的onCreate里加上setDrawPriority(DrawPriority.PRIORITY_NORMAL); 应该就可以了,如果还是没有背景图片显示,请参照问题1

问题3的灵异bug,图片穿越:任何灵异事件都有根有据,不可能平白无故发生,我debug找到问题所在,TextureAtlas类的findRightSpot函数126行:

if(checkX + texture.width > atlasWidth) 改成if(checkX + texture.width >= atlasWidth)即可,不要问我为什么,自己去钻研rokon这源代码并打出一些info你就明白了;顺便提一句:TextureAtlas的insert方法应该从最大尺寸图开始添加,作者的新手教程里也有说~~~

7.重力感应控制的问题:(From:woohyuknrg)

rokon里有Accelerometer类,其中的函数stopListening是用来停止感应事件监听的,我从游戏界面返回菜单界面调用了这个方法,再次进入游戏界面会又调用startListening函数启动监听,不过这是游戏却不响应重力感应了。最后找到问题解决:stopListening函数里解除监听后添加一句sensorEventListener = null;

8.背景音乐播放问题:(From:woohyuknrg)

第一次游戏没问题,退出游戏再次进入发现背景音乐没有播放! 解决办法:在RokonMusic类里添加一个函数:

public static void releasePlayer() { mediaPlayer.release(); mediaPlayer = null; }

退出游戏时调用下该函数即可

9.Layer的clear函数:(From:woohyuknrg)

删除某层中的全部sprite,这个问题我向作者反应过,他确实改过,不过我觉得还是不对,我就自己改成这样了:

public void clear() { for (int i = 0; i < gameObjects.getCount(); i++) { if (gameObjects.get(i) != null) { // gameObjects.remove(i); ((GameObject) gameObjects.get(i)).remove(); } } }

后话:最初发文时已注明原作者woohyuknrg,见被推荐不敢抢功,再次声明,原帖传送带。

===============您可以乘坐飞船到骨头的其他Rokon教程===============

Android游戏引擎《Rokon》学习笔记一:为你的项目添加Rokon框架

Android游戏引擎《Rokon》学习笔记二:HelloWorld

Android游戏引擎《Rokon》学习笔记三:精灵类Sprites的使用

Android游戏引擎《Rokon》学习笔记四:添加触摸控制

Android游戏引擎《Rokon》学习笔记五:Modifiers修饰类的使用

Android游戏引擎《Rokon》学习笔记六:一个使用Box2D的Rokon小例子:Rokon Donate

Android游戏引擎《Rokon》:主要类和方法的介绍文档

更多相关文章

  1. Android布局文件的加载过程分析:Activity.setContentView()源码
  2. android SQLite 优化(三)使用事务 优化 insert
  3. 使用SQLiteOpenHelper 和使用ContentProvider。
  4. Android(安卓)访问WebService
  5. Android(安卓)UI- 对话框 (AlertDialog & ProgressDialog)
  6. 使用android画布的save()和restore()方法
  7. android studio中的so库调用
  8. Android磁盘管理-之vold源码分析(4)
  9. Android之回调函数

随机推荐

  1. Google Android(安卓)文档笔记-Training-
  2. 获取android联系人信息
  3. Android(安卓)闹钟源码
  4. Android(安卓)process
  5. android attr.xml
  6. android重写Dialog(接上文)
  7. android版本更新代码
  8. ProgressBar 样式
  9. android:persistentDrawingCache 的含义
  10. android java获取当前时间的总结