`
mmdev
  • 浏览: 13300700 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

基于WiEngine游戏引擎--物理引擎

 
阅读更多

转发,请保持地址:http://blog.csdn.net/stalendp/article/details/8593256

游戏中,物理引擎能够增加游戏的真实感。在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-master

    WiEngine 是一个专门为移动游戏开发设计的开源...通过深入研究WiEngine-master的源代码,开发者不仅可以了解WiEngine的工作原理,还能学习到游戏开发的最佳实践,这对于提升个人技能或者团队开发效率都是极其有价值的。

    一个用wiEngine写的非常简单的游戏

    这是一个使用wiEngine手机游戏引擎写的一个非常简单的游戏。游戏只有两个场景,一个是欢迎场景,一个是游戏场景。欢迎场景只有一个背景图,一张游戏logo和一个开始游戏的按钮,点击开始游戏按钮,会进入游戏场景。在...

    WiEngineDemos 微云游戏引擎示例代码

    WiEngineDemos是一款基于微云游戏引擎开发的示例代码集合,主要面向Android平台,旨在帮助开发者更好地理解和应用微云游戏引擎。微云游戏引擎(WiEngine)是一款强大的跨平台游戏开发工具,它允许开发者使用Java语言...

    微云游戏引擎WiEngineDemos_java源代码

    微云游戏引擎WiEngine是一款专为移动设备设计的游戏开发框架,尤其适用于Android和iOS平台。它为开发者提供了高效、易用的工具集,用于构建2D游戏,支持丰富的图形渲染、音频处理、物理模拟等功能。这个...

    WiEngine入门笔记(1)学习源码

    1. **图形渲染**:基于OpenGL ES,WiEngine提供了高效的2D图形渲染能力,可以轻松创建复杂的场景和游戏画面。开发者可以通过API控制精灵(Sprite)、纹理(Texture)和图层(Layer)来构建游戏世界。 2. **物理引擎...

    Android游戏开发步骤及相关引擎解析

    2. **物理引擎**:基于Box2D,能够模拟真实的物理效果,如碰撞检测、重力等。 3. **系统模块**:包括角色系统、地图系统、任务系统等,支持游戏逻辑的构建。 4. **编辑器工具**:提供了角色分析设计器、地图编辑器等...

    微云游戏引擎文档002

    微云游戏引擎(WiEngine)通过其核心组件`EventDispatcher`进行事件的分发与管理,这一机制确保了引擎内部对用户交互、硬件输入和其他系统级事件的高效响应。所有事件处理器需在`EventDispatcher`上注册,以便接收并...

    Cocos2d开发资源大集合

    - **Chipmunk基础**:介绍如何在WiEngine中集成Chipmunk物理引擎。 - **Box2D基础**:指导如何在WiEngine中使用Box2D物理引擎。 #### 八、零散入门教程 - **欢迎来到cocos2d的世界**:简短的介绍文章,适合初次...

    微云游戏引擎开发文档001

    ### 微云游戏引擎开发文档001:深入了解Actions概念及用法 #### 前言 微云游戏引擎开发文档001介绍了微云游戏引擎中的动作(Actions)概念及其实现方式,这对于理解如何在游戏中实现动画效果非常重要。本文将详细...

    ParticleDesigner

    对于WiEngine这个跨平台的游戏引擎,ParticleDesigner的导出设置至关重要。WiEngine目前只支持PNG格式的内嵌图片,因此在设计过程中,我们需要确保所有粒子图片都以PNG格式保存并内嵌在.plist文件中。这样,当游戏...

    car2源代码

    棺材笔记一 大于你妹的20个字符啊

Global site tag (gtag.js) - Google Analytics