[cocos2d-x]躲蜘蛛游戏设计[初步]
实现一个躲蜘蛛的游戏,具备以下效果:1.玩家精灵在游戏的最下方。2.蜘蛛精灵在游戏的最上方,并且从上往下掉落。效果图:
代码实现:1.创建默认的HelloWorld项目,屏幕默认的是横屏的,如何设置屏幕为竖屏?找到RootViewController.mm文件,修改相应的代码即可:
#include "HelloWorldScene.h"#include "SimpleAudioEngine.h"using namespace cocos2d;using namespace CocosDenshion;CCScene* HelloWorld::scene(){ // 'scene' is an autorelease object CCScene *scene = CCScene::create(); // 'layer' is an autorelease object HelloWorld *layer = HelloWorld::create(); // add layer as a child to scene scene->addChild(layer); // return the scene return scene;}// on "init" you need to initialize your instancebool HelloWorld::init(){ ////////////////////////////// // 1. super init first if ( !CCLayer::init() ) { return false; } //打开加速计 this->setAccelerometerEnabled(true); //获取自身的精灵 player = CCSprite::create("alien.png"); this->addChild(player, 0,1); CCSize screenSize = CCDirector::sharedDirector()->getWinSize(); float imageHeight = player->getTexture()->getContentSize().height; //将玩家精灵添加到屏幕的下方正中央 player->setPosition(CCPointMake(screenSize.width/2, imageHeight/2)); //调用加载蜘蛛精灵的方法 this->initSpiders(); //this->scheduleUpdate(); return true;}//初始化蜘蛛void HelloWorld::initSpiders(){ CCSize size = CCDirector::sharedDirector()->getWinSize(); CCSprite *tempSpider = CCSprite::create("spider.png"); //获取蜘蛛贴图的宽度 float imageWidth = tempSpider->getContentSize().width; //计算一行能显示几个蜘蛛 int numSpiders = size.width / imageWidth; spiders = new CCArray(); //设置一个断言 CCAssert(spiders -> init(), "spiders array is already initialized!");// spiders = CCArray::createWithCapacity(numSpiders); for (int i = 0 ; i < numSpiders; i++) { CCSprite *spider = CCSprite::create("spider.png"); this->addChild(spider, 0, 2); spiders->addObject(spider); } //写一个方法,将蜘蛛移动到其他位置,不然默认的创建的几个蜘蛛精灵就是创建在原点上 this->resetSpiders();}//重新布局蜘蛛代码void HelloWorld::resetSpiders(){ //获取屏幕尺寸 CCSize size = CCDirector::sharedDirector()->getWinSize(); //获取蜘蛛尺寸 CCSprite *tempSpider = (CCSprite *)spiders->lastObject(); CCSize imageSize = tempSpider->getContentSize(); int numSpiders = spiders->count(); for (int i=0; i<numSpiders; i++) { CCSprite *spider = (CCSprite *)spiders->objectAtIndex(i); spider->setPosition(CCPointMake(imageSize.width * i + imageSize.width *0.5f,size.height + imageSize.height)); //将所有的蜘蛛的动作都停止 spider->stopAllActions(); } this->unschedule(schedule_selector(HelloWorld::spidersUpdate)); this->schedule(schedule_selector(HelloWorld::spidersUpdate), 0.6f); //this->schedule(schedule_selector(HelloWorld::spidersUpdate), 0.6f); numSpidersMoved = 0; spiderMoveDuration = 3.0f; }//更新蜘蛛void HelloWorld::spidersUpdate(cocos2d::CCTime delta){ for (int i=0; i < spiders->count(); i++) { int randomSpiderIndex = CCRANDOM_0_1()*spiders->count(); CCSprite * spider = (CCSprite *)spiders->objectAtIndex(randomSpiderIndex); //注意:这个方法表示当前对象是否有动作正在执行 if (spider->numberOfRunningActions() == 0) { if (i > 0) { CCLog("Dropping a Spider after %d retries.",i); } this->runSpiderMoveSequence(spider); break; } }}//蜘蛛移动void HelloWorld::runSpiderMoveSequence(cocos2d::CCSprite *spider){ numSpidersMoved++; //控制难度 if (numSpidersMoved %8 == 0 && spiderMoveDuration > 2.0f) { spiderMoveDuration -= 0.1f; } CCPoint belowScreenPosition = CCPointMake(spider->getPosition().x, -(spider->getTexture()->getContentSize().height)); CCMoveTo *move = CCMoveTo::create(spiderMoveDuration, belowScreenPosition); CCCallFuncN *call = CCCallFuncN::create(this,callfuncN_selector(HelloWorld::spiderBelowSceen)); CCSequence *sequence = CCSequence::create(move,call,NULL); spider->runAction(sequence); }//向下运动void HelloWorld::spiderBelowSceen(void *sender){ //断言 //CCAssert(dynamic_cast<CCSprite *>(this->getChildByTag(3))!=NULL, "非法类型"); CCSprite * spider = (CCSprite*)sender; CCPoint pos = spider->getPosition(); CCSize size = CCDirector::sharedDirector()->getWinSize(); pos.y = size.height+spider->getTexture()->getContentSize().height; spider->setPosition(pos);}HelloWorld::~HelloWorld(){ spiders->release(); CCLog("资源已经回收");}void HelloWorld::menuCloseCallback(CCObject* pSender){ CCDirector::sharedDirector()->end();#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) exit(0);#endif}
float imageHeight =player->getTexture()->getContentSize().height;
CCAssert(dynamic_cast<CCSprite *>(this->getChildByTag(3))!=NULL, "非法类型");