《Android游戏开发实践指南》内容讨论及勘误索引贴


本帖更新记录
2013年7月27日21:06
PXEditor代碼如何編譯運行?

  • 該項目用到了兩個jar文件,一個是「appframework-1.0.3.jar」,下載地址為:http://repo1.maven.org/maven2/org/jdesktop/appframework/1.0.3/appframework-1.0.3.jar,另一個是「swing-worker-1.1.jar」,下載地址為:http://repo1.maven.org/maven2/org/jdesktop/swing-worker/1.1/swing-worker-1.1.jar
  • 在Netbeans中新建Java Application型項目,然後把PXEditor的src目錄下所有源碼複製過去,並且令項目引用上述兩個庫。另外,還需令項目引用Netbeans自帶的「Absolute Layout」庫,若無該庫,則需先安裝名為「GUI Builder」的插件。
  • 經小愛測試,PXEditor軟件在Ubuntu 13.04 64位、Netbeans 7.3、Java 1.7.0_25-b15環境下運行有問題。新建文件後無法另存為。建議解壓縮「chapter_10_code.zip」文件,然後用PXEditor打開「/ParticlePlayer/assets/gfx/particles/」目錄下的某個.px文件,據此修改後保存。
  • 打開既有的.px文件後,Netbeans控制檯會報錯,並且軟件界面下方的Alpha、Color、Rotation、Scale區域均空白。此時只需按下對應區域下的「加號」按鈕,即可令此區域的控件正常顯示了。
  • 我截取了兩張圖,供大家參考。Netbeans項目配置PXEditor運行界面

2013年5月28日16:32
第10章10.4.2小節說到的PXEditor於何處下載?


2012年10月9日01:03
如何将andengine.jar增加至项目编译路径中?

  • 先执行2.4.2小节所述前4步。
  • 在Eclipse的Package Explorer视图中定位到项目lib目录下的andengine.jar文件,右击鼠标,选择Build Path菜单下的Add to Build Path菜单项。(此步骤对应原书第5步,我的译文说得不够周详,此处重新组织了一下语言,向读者们致歉。)
  • 执行完这5步后,还要再进行如下操作:右击项目本身,选择Properties菜单项,打开项目属性对话框。在对话框左侧树状列表中选择Java Build Path项,然后在右侧单击Order and Export分页。选中andengine.jar选项左侧的复选框(如有其它.jar文件,也应一并选中,例如第12章的范例代码就用到了andenginephysicsbox2dextension.jar等程序库),按OK按钮。(此步骤原书未讲明,如果不执行,可能会导致模拟器运行应用程序时报告“java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{…}: java.lang.ClassNotFoundException: … in loader dalvik.system.PathClassLoader[xxx.apk]”异常)

Eclipse的Problems视图报告范例代码含有“BaseGameActivity cannot be resolved to a type”等形式的错误。

Eclipse的Problems视图报告范例代码含有“The method onLoadComplete() of type StartActivity must override a superclass method”等形式的错误。

  • Eclipse默认的Java编译器兼容性级别为1.5,该版本的@Override指令仅可用于覆写父类接口,而不可用于实现接口方法,所以IDE会报此错误。在Eclipse的Package Explorer视图中右击项目本身,选择Properties菜单项,打开项目属性对话框。在左侧树状列表中选择Java Compiler,在右侧Compiler compliance level:下拉列表框中选择1.6,按OK按钮。在弹出的Compiler Setting Changed扁平对话框中按下Yes按钮。然后整个项目属性对话框消失,项目会重新编译,然后此类错误即消失。

模拟器运行程序时LogCat控制台报告java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{…}: java.lang.ClassNotFoundException: … in loader dalvik.system.PathClassLoader[xxx.apk]”异常,模拟器屏幕有时显示含有“Force Close"的程序错误对话框。

  • 按照“如何将andengine.jar增加至项目编译路径中?”所述的第6步将andengine增至项目编译路径。
  • 在Eclipse的Package Explorer视图中单击项目本身,然后选择Eclipse的Project菜单下的Clean…菜单项。选择Clean all projects单选按钮,按OK按钮。再次运行模拟即可。

排除其他错误后,反复运行范例程序,模拟器仍然无法将其显示。

  • 模拟器隔一段时间会锁定屏幕,请先解除屏幕锁,然后再次运行程序。

如何将下载的范例项目直接引入Eclipse中?


2012年10月7日23:43
andengine.jar的下载问题。


2013年11月27日02:15更新
java.nio.BufferOverflowException错误的解决办法。


2013年11月27日02:39更新
第12章範例遊戲。


本书勘误提交及整理:
http://agilemobidev.com/eastarlee/book/learning_android_game_programming_errata/

本书内容讨论及建议:
http://agilemobidev.com/eastarlee/book/learning_android_game_programming_discussion/

china-pub信息页面:
http://product.china-pub.com/3683638
卓越亚马逊信息页面:
http://www.amazon.cn/dp/B0090CM3F4
豆瓣信息页面:
http://book.douban.com/subject/11614306/
当当网信息页面:
http://product.dangdang.com/product.aspx?product_id=22855388
京东商城信息页面:
http://book.360buy.com/11073798.html

以下是英文原版书的相关信息:
名称:《Learning Android Game Programming——A Hands-On Guide to Building Your First Android Game》
作者:Richard A. Rogers
出版社:Addison-Wesley Professional

Amazon信息页面:http://www.amazon.com/Learning-Android-Game-Programming-Hands-On/dp/0321769627
豆瓣信息页面:http://book.douban.com/subject/7070551/

廣告

《Android游戏开发实践指南》内容讨论及勘误索引贴 有 “ 47 則迴響 ”

  1. 这本书什么时候有货呢?在京东上订了,京东说的是25号有货,但是到现在了都还没货呢

  2. 你好, 书中的源码编译通过后 在Virtual Device 和 真实Device上运行有错误, 请问应该如何解决?错误信息如下: 10-07 12:49:44.005: E/AndroidRuntime(811): FATAL EXCEPTION: main10-07 12:49:44.005: E/AndroidRuntime(811): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.pearson.lagp.v3/com.pearson.lagp.v3.StartActivity}: java.lang.ClassNotFoundException: com.pearson.lagp.v3.StartActivity10-07 12:49:44.005: E/AndroidRuntime(811): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1983)10-07 12:49:44.005: E/AndroidRuntime(811): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)10-07 12:49:44.005: E/AndroidRuntime(811): at android.app.ActivityThread.access$600(ActivityThread.java:130)10-07 12:49:44.005: E/AndroidRuntime(811): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)10-07 12:49:44.005: E/AndroidRuntime(811): at android.os.Handler.dispatchMessage(Handler.java:99)10-07 12:49:44.005: E/AndroidRuntime(811): at android.os.Looper.loop(Looper.java:137)10-07 12:49:44.005: E/AndroidRuntime(811): at android.app.ActivityThread.main(ActivityThread.java:4745)10-07 12:49:44.005: E/AndroidRuntime(811): at java.lang.reflect.Method.invokeNative(Native Method)10-07 12:49:44.005: E/AndroidRuntime(811): at java.lang.reflect.Method.invoke(Method.java:511)10-07 12:49:44.005: E/AndroidRuntime(811): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)10-07 12:49:44.005: E/AndroidRuntime(811): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)10-07 12:49:44.005: E/AndroidRuntime(811): at dalvik.system.NativeStart.main(Native Method)10-07 12:49:44.005: E/AndroidRuntime(811): Caused by: java.lang.ClassNotFoundException: com.pearson.lagp.v3.StartActivity10-07 12:49:44.005: E/AndroidRuntime(811): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)10-07 12:49:44.005: E/AndroidRuntime(811): at java.lang.ClassLoader.loadClass(ClassLoader.java:501)10-07 12:49:44.005: E/AndroidRuntime(811): at java.lang.ClassLoader.loadClass(ClassLoader.java:461)10-07 12:49:44.005: E/AndroidRuntime(811): at android.app.Instrumentation.newActivity(Instrumentation.java:1053)10-07 12:49:44.005: E/AndroidRuntime(811): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974)10-07 12:49:44.005: E/AndroidRuntime(811): … 11 more

  3. 感谢回复, 昨天的问题已经解决, 似乎是因为下载的代码的文本格式的问题, 后来新建android project后这个问题就没有了. 不过按照书中第二章的例子 新建项目后运行还是会crash, 错误信息如下: 编译SDK为Android 4.1, 在AVD和android 2.3 设备上运行结果类似, 还请帮忙分析下,  10-08 20:12:34.169: I/Process(18963): Sending signal. PID: 18963 SIG: 910-08 20:12:46.623: D/libEGL(19039): loaded /system/lib/egl/libGLES_android.so10-08 20:12:46.646: D/libEGL(19039): loaded /system/lib/egl/libEGL_POWERVR_SGX530_125.so10-08 20:12:46.646: D/libEGL(19039): loaded /system/lib/egl/libGLESv1_CM_POWERVR_SGX530_125.so10-08 20:12:46.646: D/libEGL(19039): loaded /system/lib/egl/libGLESv2_POWERVR_SGX530_125.so10-08 20:12:46.685: D/AndEngine(19039): onSurfaceCreated10-08 20:12:46.685: D/AndEngine(19039): RENDERER: PowerVR SGX 53010-08 20:12:46.693: D/AndEngine(19039): VERSION: OpenGL ES-CM 1.110-08 20:12:46.693: D/AndEngine(19039): EXTENSIONS: GL_OES_byte_coordinates GL_OES_fixed_point GL_OES_single_precision GL_OES_matrix_get GL_OES_read_format GL_OES_compressed_paletted_texture GL_OES_point_sprite GL_OES_point_size_array GL_OES_matrix_palette GL_OES_draw_texture GL_OES_query_matrix GL_OES_texture_env_crossbar GL_OES_texture_mirrored_repeat GL_OES_texture_cube_map GL_OES_blend_subtract GL_OES_blend_func_separate GL_OES_blend_equation_separate GL_OES_stencil_wrap GL_OES_extended_matrix_palette GL_OES_framebuffer_object GL_OES_rgb8_rgba8 GL_OES_depth24 GL_OES_stencil8 GL_OES_compressed_ETC1_RGB8_texture GL_OES_mapbuffer GL_OES_EGL_image GL_EXT_multi_draw_arrays GL_OES_required_internalformat GL_IMG_read_format GL_IMG_texture_compression_pvrtc GL_IMG_texture_format_BGRA8888 GL_EXT_texture_format_BGRA8888 GL_IMG_texture_stream GL_OES_egl_sync GL_IMG_vertex_array_object10-08 20:12:46.693: D/AndEngine(19039): EXTENSIONS_VERXTEXBUFFEROBJECTS = true10-08 20:12:46.693: D/AndEngine(19039): EXTENSIONS_DRAWTEXTURE = true10-08 20:12:46.693: D/AndEngine(19039): onSurfaceChanged: pWidth=720 pHeight=48010-08 20:12:46.740: D/dalvikvm(19039): GC_EXTERNAL_ALLOC freed 110K, 48% free 2667K/5123K, external 2357K/2773K, paused 47ms10-08 20:12:46.826: D/dalvikvm(19039): GC_EXPLICIT freed 9K, 49% free 2658K/5123K, external 2357K/2957K, paused 36ms10-08 20:12:46.834: W/dalvikvm(19039): threadid=10: thread exiting with uncaught exception (group=0x40018560)10-08 20:12:46.834: E/AndroidRuntime(19039): FATAL EXCEPTION: GLThread10-08 20:12:46.834: E/AndroidRuntime(19039): java.lang.NullPointerException10-08 20:12:46.834: E/AndroidRuntime(19039): at org.anddev.andengine.engine.Engine.onDrawScene(Engine.java:507)10-08 20:12:46.834: E/AndroidRuntime(19039): at org.anddev.andengine.engine.Engine.onDrawFrame(Engine.java:499)10-08 20:12:46.834: E/AndroidRuntime(19039): at org.anddev.andengine.opengl.view.RenderSurfaceView$Renderer.onDrawFrame(RenderSurfaceView.java:148)10-08 20:12:46.834: E/AndroidRuntime(19039): at org.anddev.andengine.opengl.view.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:617)10-08 20:12:46.834: E/AndroidRuntime(19039): at org.anddev.andengine.opengl.view.GLSurfaceView$GLThread.run(GLSurfaceView.java:549)

    1. 抱歉打扰了, 好像可以运行了, 只是图片位置似乎还不对。 虽然是一个简单的例子, 但是要正确运行还是挺不容易啊。   Thanks for the help again.

      1. 另外原书上的代码应该加入 似乎 AndEngine里需要得到PowerManager, 所以如果没有这个权限许可, 会有点异常。  

      2. 嗯,我最近也調試一下書中的代碼看看。因爲原作者寫書的時候,Android的情況與現在的情況相比,還是有一些不同的。這中間肯定有一些技術問題要解決。感謝您回報的這幾個問題。我研究清楚之後,回報給出版社,以便下次改版時更新。

  4. 译者是否尝试过china-pub上此书的e-book版本? 拙劣的排版,看不到图片,aireader极差的体验,希望译者让china-pub取消此书的e-book, 糟蹋了好东西啊!!!

    1. 您好,非常感謝您關注此書並發現問題。我還未閱讀過china-pub上的e-book版本。近期嘗試一下,如果遇到同樣問題,我會回報給china-pub客服。

  5. 你好,我从你的链接下载PXEditor,运行时发现缺少包org.jdesktop.application.*,其中有些类要用到,比如org.jdesktop.application.SingleFrameApplication,去那下载呢?

  6. 我提的问题没显示出来,再提交一次,运行PXEditor时缺少包org.jdesktop.*去哪下载呢?

    1. 您好,感謝指出該問題。由於我給博客加了留言審核機制,所以評論顯示有延遲,非常抱歉。相關辦法更新到帖子正文了,請參考。

    1. 您好,經測試,第12章中的範例遊戲可以運行。測試環境:Ubuntu 13.10操作系統+Eclipse 4.3.1+Android 2.3.3+Nexus 10平板電腦。請於 http://ptgmedia.pearsoncmg.com/imprint_downloads/informit/downloads/chapter_12_code.zip 下載源碼並引入Eclipse之中。相關注意事項請參考「如何将andengine.jar增加至项目编译路径中?」、「模拟器运行程序时LogCat控制台报告……」、「java.nio.BufferOverflowException错误的解决办法」等條目。我將第12章的三個項目打包,放在Box網盤空間 https://app.box.com/s/0lo18ezk98a0q4xxcjll 之中,您可以參考。

      1. 您好,我说的是AndEngineExample中的例子,不是本书中的例子,https://github.com/nicolasgramlich/AndEngine,麻烦了~~在我手机上显示如下,截图:http://v1.freep.cn/3tb_13112713190658wb512293.pnghttp://v2.freep.cn/3tb_131127131908kkdj512293.pnghttp://v1.freep.cn/3tb_1311271319034lw0512293.png

      2. 您好,我在Nexus 10平板電腦上運行了AndEngineExample中的Physics例子,並未發現您第三張截圖中那種顯示不全的情況。我把自己的項目打包放在 https://app.box.com/s/bcxmod3hlu1tdu4to656 供您參考。若還不能解決問題,麻煩您在AndEngine的論壇 http://www.andengine.org/forums/ 上發帖。或者試試在Play商店裡下載並安裝AndEngineExample程序:https://play.google.com/store/apps/details?id=org.anddev.andengine.examples 這個頁面上留有開發者Nicolas Gramlich的電子郵件nicolasgramlich@andengine.org,您也可以聯繫Gramlich先生。

  7. 问个问题:我想换一个精灵的贴图,首先clearTextureSources(),然后TextureRegionFactory.createFromAsset,在有的米2上运行正常,在我的魅族mx2上最后一个更换的精灵显示一片白色,这是什么原因呢?

    1. 非常抱歉,我对这个问题研究得不是很多。个人猜测如下:Texture的大小是否足够;这些贴图的大小与图片格式是否完全一致;可以换用一系列大小与图片格式完全一致的贴图测试一下。

    2. 今天試了試,貌似在我的Nexus 5和Nexus 10上面都可以通過這個方法更換精靈。兩張截圖請參見: https://raw.githubusercontent.com/jeffreybaoshenlee/AndEngineTest/master/AndEngineTest/screenshots/sprite0.jpghttps://raw.githubusercontent.com/jeffreybaoshenlee/AndEngineTest/master/AndEngineTest/screenshots/sprite1.jpg 。我把最新版AndEngine在自己的github帳號下面做了個分支( https://github.com/jeffreybaoshenlee/AndEngine ),然後把這個測試項目放在了 https://github.com/jeffreybaoshenlee/AndEngineTest ,您也可以試試哈。另外,現在AndEngine的某些用法和舊版稍有不同。

      1. 谢谢,之前的情况也只是偶尔出现,现在我用过setTexturePosition把问题解决了

  8. 为了实现动态刷新不同个数精灵的纹理图像我先定义全局变量了Sprite tmp[],然后 for(int i=0;i

  9. 为了实现动态刷新不同精灵组的纹理图像我先定义全局变量了Sprite tmp[],然后 for(int i=0;i

  10. 为了实现动态刷新不同精灵组的纹理图像我先定义全局变量了Sprite tmp[],然后 for(int i=0;i《number;i++){ tmp =new Sprite(i*10,10,10,10,sp ); scene.getLastChild().attachChild(tmp );}//然后改变number的值,换掉sp的纹理;for(int i=0;i《number;i++){ tmp =new Sprite(i*10,10,10,10,sp ); scene.getLastChild().attachChild(tmp );}则会出现贴图重叠现象于是我想到把之前的tmp删除或者让它不可见for(int i=0;i《number;i++){ tmp .setVisible(false);}//然后改变number的值,换掉sp的纹理;for(int i=0;i《number;i++){ tmp .setVisible(true); tmp =new Sprite(i*10,10,10,10,sp ); scene.getLastChild().attachChild(tmp );}这次纹理重叠没有,但是有时候tmp 会出现没有纹理透明的现象,我不知道为什么?于是我又想直接把之前的tmp 删掉,再改变于是我先执行for(int i=0;i《number;i++){ tmp .detachSelf()}//然后改变number的值,换掉sp的纹理;for(int i=0;i《number;i++){ tmp .setVisible(true); tmp =new Sprite(i*10,10,10,10,sp ); scene.getLastChild().attachChild(tmp );}但是这次又会报indexoutofboundsexception错误,各种改也不行,谁能帮帮我??

      1. 我想也許可以這樣。假設能預估到可能出現的最大精靈數,比如10,那我們就創建含有10個元素的tmp數組。然後先用某個sp材質把這10個精靈都創建好。下次改變的時候,假設只需要用8個精靈,那就直接更換sp材質,並把數組裡最後兩個精靈設為不可見。

      2. 多谢,用你的方法解决这个问题了,请问怎么样解决进入页面之前短暂的黑屏情况呢?

  11. 一般不是启动的第一个界面加载资源嘛,要是这样的话,在以后的Activity中怎么引用第一个页面加载的资源呢??

    1. 如果要在多個Activity之間切換,那可以把資源放在某個其它的類裡面,比如創建MyResource類專門用來放資源。這樣的話,切換過去之後,就可以在新的Activity裡通過MyResource.xxx來使用資源了。另外,我在網上查了一下,很多人都只用一個Activity開發,也就是用多個scene來表示分別表示啟動畫面、菜單、遊戲主畫面等等不同場景,這樣自然就簡單了。可以參考 http://www.matim-dev.com/splash-screen—easy-way.html

      1. 辛苦啦,我再实验实验,提前加载资源就是为了使游戏更加流畅一些嘛,中间不会有卡顿的现象。给你点个赞 ,哈哈。

      2. 如何把分数截屏分享到微博啊,空间啊,我把屏幕截图下来,用intent发送,但是太大了,无法发送,有没有方便快捷一点的办法呢?

    2. 另外,除了剛說的這兩種之外,其實最簡單的辦法就是在第一個Activity裡面做個非常簡單的Loading畫面,這個畫面大概就一個精靈而已。它通過startActivity(…)來請求系統切換到第二個Activity。而第二個Activity只負責加載它自己用到的資源,它有它自己的精靈、貼圖、Scene等等。這樣各是各的,更清晰。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s