您的位置:首页 > 移动开发 > Cocos引擎

基于WiEngine游戏引擎的Sample

2013-02-18 23:09 344 查看
转发,请保持地址: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,会再弹出一个对话框,也就是截图的对话框,这个时候,你可以刷新,旋转,保存或者复制手机的截图了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息