基于WiEngine游戏引擎--物理引擎
2013-02-20 10:42
417 查看
转发,请保持地址:/article/7718231.html
游戏中,物理引擎能够增加游戏的真实感。在WiEngine中集成了Box2d和Chipmunk两款物理引擎。物理引擎中提供了位置,速度,冲量,力等概念,能够方便地操作物体,当然也有更高级的特性(比如joint等)。在做demo程序集成物理引擎的时候,我只是用到了冲量和碰撞的特性。由于对Box2d熟悉,所以只介绍Box2D在游戏中的使用。
类似于TexturePacker工具,我这里将使用PhysicalEditor来定义游戏中body(Box2d中赋予body物理学中“刚体”的含义,属于基本单位)。TextureEditor的编辑过程,截图如下:
由于是动画,各帧有所不同,所以我只是粗略地定义了Fxiture(这样也减少了Fxiture的点的数目,提高效率)。其他密度,摩擦系数等随便设置,我这里暂且默认,以后在代码中也可以重新定义的。然后导出为plist文件(这里保存为herope.plist文件),截图如下:
这样plist中就包含了用于创建body的一些属性了,如上图所示的有:密度,摩擦系数,恢复,fixture等。
然后就是在WiEngine中使用物理引擎了,先载入plist文件。
接着是Sprite和Body的绑定,其中用到了Body的userData来绑定sprite
为了让物体能够跳跃,我在屏幕上放置了Jump按钮。点击Jump按钮,就会给Hero一个向上的Impulse(冲量,即力随时间的积累效应,用来改变Hero的速度)。
另外按钮的代码如下:
游戏运行截图如下:
=======
另外附
NDK的错误堆栈的翻译
1)在Application.mk文件中指定debug,如下:
APP_OPTIM := debug
这样编译之后,在工程的目录/obj/local/armeabi/下会生成objs-debug目录,这里面包含编译的符号表
2)把要分析的log保存到log.txt文件中
运行命令:ndk-stack -sym $PROJECT_PATH/obj/local/armeabi -dump log.txt
或者直接分析logcat中的日志:
adb logcat | $NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi
游戏中,物理引擎能够增加游戏的真实感。在WiEngine中集成了Box2d和Chipmunk两款物理引擎。物理引擎中提供了位置,速度,冲量,力等概念,能够方便地操作物体,当然也有更高级的特性(比如joint等)。在做demo程序集成物理引擎的时候,我只是用到了冲量和碰撞的特性。由于对Box2d熟悉,所以只介绍Box2D在游戏中的使用。
类似于TexturePacker工具,我这里将使用PhysicalEditor来定义游戏中body(Box2d中赋予body物理学中“刚体”的含义,属于基本单位)。TextureEditor的编辑过程,截图如下:
由于是动画,各帧有所不同,所以我只是粗略地定义了Fxiture(这样也减少了Fxiture的点的数目,提高效率)。其他密度,摩擦系数等随便设置,我这里暂且默认,以后在代码中也可以重新定义的。然后导出为plist文件(这里保存为herope.plist文件),截图如下:
这样plist中就包含了用于创建body的一些属性了,如上图所示的有:密度,摩擦系数,恢复,fixture等。
然后就是在WiEngine中使用物理引擎了,先载入plist文件。
m_bodyLoader = new wyBox2DPELoader(RES("R.raw.herope"));
接着是Sprite和Body的绑定,其中用到了Body的userData来绑定sprite
hero_body = m_bodyLoader->createBodyByName(m_box2d, "boyrun"); wyPoint anchorPercent = m_bodyLoader->getAnchorPercent("boyrun"); hero->setAnchor(anchorPercent.x, anchorPercent.y); hero_body->SetUserData(hero);最后就是游戏运行中更新物理世界,以及相应Sprite,以便WiEngine正确绘制。
void onUpdate() { m_box2d->getWorld()->Step(1.0f / 60, 10, 10); m_box2d->getWorld()->ClearForces(); b2Vec2 pos = hero_body->GetPosition(); float angle = hero_body->GetAngle(); //从UserData中取出相应的Sprite wySprite* sprite = (wySprite*) hero_body->GetUserData(); sprite->setPosition(m_box2d->meter2Pixel(pos.x), m_box2d->meter2Pixel(pos.y)); sprite->setRotation(-wyMath::r2d(angle)); }
为了让物体能够跳跃,我在屏幕上放置了Jump按钮。点击Jump按钮,就会给Hero一个向上的Impulse(冲量,即力随时间的积累效应,用来改变Hero的速度)。
void jump() { hero_body->ApplyLinearImpulse(b2Vec2(0, 30.0f), hero_body->GetWorldCenter()); }这样我们的Hero就会跳动了。
另外按钮的代码如下:
class Buttons: public wyLayer { private: MyScene* scene; public: Buttons(MyScene* s) { this->scene = s; myButton* btnJump = new myButton("Jump"); btnJump->setPosition(wyDevice::winWidth / 2 - DP(60), wyDevice::winHeight / 2); addChildLocked(btnJump); btnJump->setMyUS(wyTargetSelector::make(this, SEL(Buttons::onJump))); this->m_positionY += DP(150); } void onJump(wyTargetSelector* ts) { log("Jump button clicked!"); scene->hero->changeAction(BOY_JUMP); scene->jump(); } };
游戏运行截图如下:
=======
另外附
NDK的错误堆栈的翻译
1)在Application.mk文件中指定debug,如下:
APP_OPTIM := debug
这样编译之后,在工程的目录/obj/local/armeabi/下会生成objs-debug目录,这里面包含编译的符号表
2)把要分析的log保存到log.txt文件中
运行命令:ndk-stack -sym $PROJECT_PATH/obj/local/armeabi -dump log.txt
或者直接分析logcat中的日志:
adb logcat | $NDK/ndk-stack -sym $PROJECT_PATH/obj/local/armeabi
相关文章推荐
- 基于WiEngine游戏引擎--角色基本效果
- 基于WiEngine游戏引擎--战斗场景之技能
- 基于JBox2d物理引擎和canvas的游戏开发实例
- (2011-12-11 旧博文搬运)[基于BOX2D引擎]物理切割游戏:猫狗照相馆
- 如何制作一款像超级玛丽兄弟一样基于平台的游戏-第二部分 (xcode,物理引擎,TMXTiledMap相关应用)
- 基于WiEngine游戏引擎--角色基本效果 .
- 基于egret引擎、P2物理库的搭积木游戏
- 基于WiEngine游戏引擎--背景移动
- 基于WiEngine游戏引擎--战斗场景之boss
- 基于WiEngine游戏引擎的Sample
- 转:高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
- 游戏中帧函数调用的顺序问题——基于HGE引擎的打砖块游戏
- 【技术讨论】从弹弹堂说起,如何用2D物理引擎编写一个游戏<一>2011-11-05 10:36
- 基于Unity3d 引擎的Android游戏优化
- 游戏引擎--基于安卓平台对J2ME游戏代码的移植
- 游戏中基于物理的环境光渲染(一):基本框架
- AtomCat:可以做“软”物体的游戏物理引擎
- html5移动开发制作基于模拟现实物理效果的游戏
- 使用cocos2d-x3.0和物理引擎制作简单的platformer游戏
- Cocos2d-js官方完整项目教程翻译:六、添加Chipmunk物理引擎在我们的游戏世界里