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

基于WiEngine游戏引擎的Sample

 
阅读更多

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

最近在开发一款游戏,做demo的时候,使用了Cocos2d和WiEngine游戏引擎。我先做了Cocos2d端的demo,然后移植到android端。在移植的过程中,我使用了WiEngine,由于WiEngine提供了和Cocos2d很相似的API,所以能够很快地从cocos2d迁移。

下面的demo的截图(申明:demo使用的图片资源来源于网络,只是用于学习,如果有版权问题,请联系我:stalendp@gmail.com)



本例子中只是简单地用到了Sprite和SpriteBatchNode等概念,使用TexturePacker进行了图片的处理。WiEngine中读取TexturePacker信息的类为wyZwoptexManager, 代码如下:

wyZwoptexManager* zm = wyZwoptexManager::getInstance();
wyTexture2D* tex = wyTexture2D::makePNG(RES("R.drawable.renzhet"));
zm->addZwoptex("renzhet", RES("R.raw.renzhet"), tex);

这样整个plist文件通过XML解析,被加载到内存(frame对象),就可以生成sprite了(关于引擎的原理性方面,以后有机会再写文章深入吧)。

如果用Cocos2d,类似的代码为:

CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];
[frameCache addSpriteFramesWithFile:@"renzhet.plist"];

使用方法如下:

wyZwoptexManager* zm = wyZwoptexManager::getInstance();
wySprite* sprite = zm->makeSprite("boy1.png");

相应的Cocos2d代码:

 if(self=[super initWithSpriteFrameName:@"boy1.png"]) //别的写法可能更合适

其他请参考完整代码吧。

下面是完整的C++代码:

#ifndef SAMPLE_H_
#define SAMPLE_H_

#include "com_wiyun_engine_skeleton_Skeleton.h"
#include "FirstScene.h"
#include <cstdlib>

#include <android/log.h>

#define  LOG_TAG    "SkeletonProject"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)

void runSample();

class CloudCache;
class ttCloud;
class Background;
class BoyAndDog;

void log(const char* msg);

float genRand() {
	return rand() % 10000 / 10000.0f;
}

wyLabel* m_hint;


class Cloud: public wyLayer {
private:

	wySprite* cloud;
	float speed;

public:
	Cloud() {
		buildCloud();
	}

	virtual ~Cloud() {

	}

	void buildCloud() {
		wyZwoptexManager* zm = wyZwoptexManager::getInstance();

		char buf[50];
		sprintf(buf, "cloud_%d.png", 1);
		cloud = zm->makeSprite(buf);

		cloud->setScale(0.5f);
		addChildLocked(cloud);
		this->setVisible(false);

		wyTimer* timer = wyTimer::make(
				wyTargetSelector::make(this, SEL(Cloud::onUpdateSprite)));
		scheduleLocked(timer);
	}

	void spawn() {
		LOGI("Cloud#spawn");
		this->setVisible(true);
		speed = genRand() * 0.3f + 0.2f;

		cloud->setPosition(wyDevice::winWidth + getContentSize().width / 2,
				genRand() * wyDevice::winHeight / 3 + wyDevice::winHeight / 2);

		char msg[50];
		sprintf(msg, "posy: %f", cloud->getPositionY());
		LOGI(msg);

	}

	void onUpdateSprite(wyTargetSelector* ts) {

		if (cloud->isVisible()) {

			cloud->setPosition(cloud->getPositionX() - speed,
					cloud->getPositionY());
			if (cloud->getPositionX() < 0) {
				this->setVisible(false);
				cloud->stopAllActions(true);
			}
		}

	}
};
class CloudCache: public wyLayer {
private:
	Cloud* clouds[10];
public:
	CloudCache() {
		for (int i = 0; i < 10; i++) {
			clouds[i] = new Cloud();
			clouds[i]->setVisible(false);
			addChildLocked(clouds[i]);
		}
		clouds[0]->spawn();
		wyTimer* timer = wyTimer::make(
				wyTargetSelector::make(this, SEL(CloudCache::onUpdateSprite)));
		scheduleLocked(timer);
	}
	virtual ~CloudCache() {

	}

	void spawn() {

		for (int i = 0; i < 10; i++) {
			Cloud* cloud = clouds[i];
			if (!cloud->isVisible()) {
				cloud->spawn();
				break;
			}
		}

	}

	void onUpdateSprite(wyTargetSelector* ts) {
		float rr = genRand();
		if (rr < 0.001) {
			spawn();
		}
	}
};

class Background: public wyLayer {
private:
	wySprite* bg[4];
public:
	Background() {
		buildbg1();
		buildbg2();
	}

	virtual ~Background() {

	}

	void buildbg1() {
		wySprite* bg = wySprite::make(
				wyTexture2D::makeJPG(RES("R.drawable.bg1")));
		bg->setPosition(wyDevice::winWidth / 2, wyDevice::winHeight / 2 + 50);
		bg->setScale(0.5f);
		addChildLocked(bg);
	}

	void buildbg2() {
		wyZwoptexManager* zm = wyZwoptexManager::getInstance();
		for (int i = 0; i < 4; i++) {
			int id = i / 2;
			char sn[20];
			sprintf(sn, "bg%d.png", id + 2);
			bg[i] = zm->makeSprite(sn);
			bg[i]->setPosition(bg[i]->getContentSize().width * (i%2),
					bg[i]->getContentSize().height / 2);
			addChildLocked(bg[i]);
		}

		// start to update
		wyTimer* timer = wyTimer::make(
				wyTargetSelector::make(this, SEL(Background::onUpdateSprite)));
		scheduleLocked(timer);
	}

	void onUpdateSprite(wyTargetSelector* ts) {
		for (int i = 0; i < 4; i++) {
			if (bg[i]->getPositionX() < -bg[i]->getContentSize().width) {
				bg[i]->setPosition(bg[i]->getContentSize().width-0.3,
						bg[i]->getPositionY());
			}
			int id = i / 2;
			bg[i]->setPosition(bg[i]->getPositionX() - 0.1f - 0.7f * id,
					bg[i]->getPositionY());

		}
	}
};

class BoyAndDog: public wyLayer {
public:
	BoyAndDog() {
		wySprite* boy = buildBoy();
		wySprite* dog = buildDog();
		boy->setPosition(wyDevice::winWidth / 2,
				boy->getContentSize().height / 2);
		dog->setPosition(wyDevice::winWidth / 2 - 80,
				dog->getContentSize().height / 2 - 10);

		addChildLocked(boy);
		addChildLocked(dog);
	}

	virtual ~BoyAndDog() {
	}

	wySprite* buildBoy() {
		wyZwoptexManager* zm = wyZwoptexManager::getInstance();

		// add sprite
		wySprite* sprite = zm->makeSprite("boy1.png");

		// create animation and add it to atlas sprite
		char buf[128];
		wyAnimation* anim = wyAnimation::make(0);
		for (int i = 1; i <= 4; i++) {
			sprintf(buf, "boy%d.png", i);
			wySpriteFrame* f = zm->getSpriteFrame(buf);
			f->setDuration(0.15f);
			anim->addFrame(f);
		}

		wyAnimate* a = wyAnimate::make(anim);
		wyRepeatForever* rp = wyRepeatForever::make(a);
		sprite->runAction(rp);
		return sprite;
	}
	wySprite* buildDog() {
		wyZwoptexManager* zm = wyZwoptexManager::getInstance();

		// add sprite
		wySprite* sprite = zm->makeSprite("0.png");
		sprite->setFlipX(true);

		// create animation and add it to atlas sprite
		char buf[128];
		wyAnimation* anim = wyAnimation::make(0);
		int si = 3 * 4;
		for (int i = si; i < 4 + si; i++) {
			sprintf(buf, "%d.png", i);
			wySpriteFrame* f = zm->getSpriteFrame(buf);
			f->setDuration(0.1f);
			anim->addFrame(f);
		}

		wyAnimate* a = wyAnimate::make(anim);
		wyRepeatForever* rp = wyRepeatForever::make(a);
		sprite->runAction(rp);
		return sprite;
	}
};

void log(const char* msg) {
	if (m_hint != NULL) {
		m_hint->setText(msg);
	}
}

//
void runSample() {

	// init the texture

	wyZwoptexManager* zm = wyZwoptexManager::getInstance();
	wyTexture2D* tex = wyTexture2D::makePNG(RES("R.drawable.renzhet"));
	zm->addZwoptex("renzhet", RES("R.raw.renzhet"), tex);
	tex = wyTexture2D::makePNG(RES("R.drawable.dog"));
	zm->addZwoptex("dog", RES("R.raw.dog"), tex);

	// setup the texture
	wyDirector* director = wyDirector::getInstance();
	director->setShowFPS(true);

	// create scene
	wyScene* scene = new wyScene();

	m_hint = wyLabel::make("display some information here", SP(20));
	m_hint->setPosition(wyDevice::winWidth / 2,
			wyDevice::winHeight - m_hint->getContentSize().height / 2);

	scene->addChildLocked(new Background());
	scene->addChildLocked(new BoyAndDog());
	scene->addChildLocked(new CloudCache());

	scene->addChildLocked(m_hint);

	// run with it
	director->runWithScene(scene);

	// release, the scene and action will be hold by others
	// so this won't destory them
	wyObjectRelease(scene);
}

说明:本例子中没有对内存进行考虑,所以有内存溢出的bug,细心的读者如果能指出来,感激不尽吐舌头


====

最后,记录一个android截图的技巧,防止忘记:

使用Android SDK文件夹下tool文件夹下的ddms,然后点击菜单Device=>Screen Capture..或者直接按组合键,ctrl+S,会再弹出一个对话框,也就是截图的对话框,这个时候,你可以刷新,旋转,保存或者复制手机的截图了


分享到:
评论

相关推荐

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

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

    WiEngine-master

    WiEngine 是一个专门为移动游戏开发设计的开源游戏引擎,它主要针对iOS和Android平台,旨在简化游戏开发过程,提供高效的游戏逻辑和渲染能力。在"WiEngine-master"这个压缩包中,我们很可能是获取到了WiEngine的源码...

    WiEngineDemos 微云游戏引擎示例代码

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

    微云游戏引擎WiEngineDemos_java源代码

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

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

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

    微云游戏引擎文档002

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

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

    - **Angle**:一款敏捷且适合快速开发的2D游戏引擎,基于OpenGLES。 - **Rokon**:虽然已被暂停开发,但其代码简单易懂。 - **AndEngine**:推荐使用,代码简单,适用于中小规模项目。 - **WiEngine**:使用纯...

    微云游戏引擎开发文档001

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

    Cocos2d开发资源大集合

    - **使用Lua脚本**:教授如何在WiEngine中集成Lua脚本来增强游戏逻辑。 - **构建游戏场景和流程**:指导如何组织游戏的不同部分,构建完整的游戏体验。 - **动作的使用与继承**:探讨如何在WiEngine中实现复杂的游戏...

    ParticleDesigner

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

    car2源代码

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

Global site tag (gtag.js) - Google Analytics