想要制作一款打飞机的游戏,了解cocosdx和游戏制作,
第一次做游戏,水平有限。这个游戏差不多应该是最简单的了
一,建立一个菜单场景
1.新建一个cocos2dx游戏
2.再新建一个开始菜单场景 (因为没找到好的素材,就新建一个场景加一个按钮)
新建一个开始菜单场景,命名为GameMenu
3.在GameMenu.h文件中做一些函数的声明
#ifndef __Game__GameMenu__ #define __Game__GameMenu__ #include "cocos2d.h" class GameMenu : public cocos2d::CCLayer//表示继承cocos2d 的CCLayer类 { public: static cocos2d::CCScene* scene();//声明静态的 场景函数 virtual bool init(); //初始化方法 CREATE_FUNC(GameMenu); void playIsPressed(CCObject* pSender);//声明playIsPressed函数 }; #endif /* defined(__Game__GameMenu__) */
CCScene* GameMenu::scene() { CCScene *scene = CCScene::create();//创建场景 GameMenu *layer = GameMenu::create();//创建菜单 scene->addChild(layer); //将菜单添加到场景中 return scene; }实现init函数
bool GameMenu::init() { if ( !CCLayer::init() ) { return false; } CCSize size = CCDirector::sharedDirector()->getWinSize();//取的屏幕的大小 //创建图片精灵作为背景 CCSprite *sp = CCSprite::create("background.jpg");//创建图片精灵 sp->setPosition(ccp(size.width/2, size.height/2));//设置图片精灵的位置 this->addChild(sp);//将图片精灵添加到场景中 CCMenuItemImage *pCloseItem = CCMenuItemImage::create( "start.png", "start.png", this, menu_selector(GameMenu::playIsPressed) ); pCloseItem->setPosition( ccp(size.width/2, size.height/2) ); CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);//创建菜单函数 pMenu->setPosition( CCPointZero ); this->addChild(pMenu, 1); return true; }实现playIsPressed函数
//作为菜单按钮的相应函数 void GameMenu::playIsPressed(CCObject* pSender) { //转换到另一个场景中 CCDirector::sharedDirector()->replaceScene(CCTransitionCrossFade::create(1.5, HelloWorld::scene())); }5.修改 AppDelegate.cpp让新建的场景作为进入app的场景
6.根据需求倒入函数
#include "SimpleAudioEngine.h" #include "HelloWorldScene.h" using namespace cocos2d; using namespace CocosDenshion;
实现如下效果
二,定义几个精灵
(1)建立一个飞机
(2)建立子弹,让飞机可以打出子弹
(3)建立敌机,
由于下面代码有的调用了主场景类里的函数说一创建完,不能运行还会报不少错,需要创建完场景类才能正常运行。说明都在程序上注释着
1.建立一个飞机类,命名为player(首字母应该大写的,一开始弄错了)
实现player.h文件
#include "cocos2d.h" using namespace cocos2d; using namespace std; class player:public cocos2d::CCSprite,public CCTouchDelegate//继承精灵 实现CCTouchDelegate协议 { public: static player* createPlayer(const char* fileName);//定义createPlayer函数 可以调用本函数创建player private: void playerInit(); //定义初始化方法 virtual void onEnter();//本精灵创建 调用本函数 virtual void onExit();//本精灵注销 调用本函数 /* 相当于oc里面的 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event等函数 */ virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);//TouchDelegate的协议函数 virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); };实现player.cpp
#include "player.h" using namespace cocos2d; player* player::createPlayer(const char* fileName) { player *player = new class player(); if (player&&player->initWithFile(fileName)) { player->autorelease();//自动管理内存 player->playerInit();//调用初始化函数 return player; } CC_SAFE_DELETE(player); return NULL; } void player::playerInit() { //设置本精灵的初始化位置 CCSize size = CCDirector::sharedDirector()->getWinSize(); this->setPosition(ccp(size.width/2, this->getContentSize().height/2+10)); } void player::onEnter() { CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true); //CCTouchDelegate指向本类 } void player::onExit() { CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this); //移除CCTouchDelegate协议 } bool player::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { this->setPosition(pTouch->getLocation());//本精灵的位置跟着手指移动 return true; } void player::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) { this->setPosition(pTouch->getLocation()); } void player::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) { this->setPosition(pTouch->getLocation()); }
在场景中的调用方法为
player *play =player::createPlayer("Spaceship.png"); this->addChild(play, 1, 100);
实现Bullet.h
#include "cocos2d.h" using namespace cocos2d; class Bullet : public cocos2d::CCSprite//继承精灵 { public: static Bullet* createBullet(const char* _fileName,float _speed,CCPoint _position);//创建子弹类 private: float speed;//速度变量 void bulletInit(float _speed,CCPoint _position);//子弹初始化 void update(float time);//刷新精灵函数 virtual void onExit();//退出本精灵调用的函数 };
实现<span style="font-family: Menlo; font-size: 13px; ">Bullet.m</span>
#include "Bullet.h" #include "HelloWorldScene.h" #include "Enemy.h" Bullet* Bullet::createBullet(const char* _fileName, float _speed, CCPoint _position) { Bullet * bullet = new Bullet(); if (bullet&&bullet->initWithFile(_fileName)) { bullet->autorelease(); bullet->bulletInit(_speed, _position); return bullet; } CC_SAFE_DELETE(bullet); return NULL; } void Bullet::bulletInit(float _speed, CCPoint _position) { speed=_speed; this->setPosition(_position);//初始化位置 this->scheduleUpdate();//线程 中刷新本精灵 } void Bullet::update(float time) { //设置子弹的位置 this->setPosition(ccpAdd(this->getPosition(), ccp(0, speed))); //取得主场景中的的敌机(这部分有的函数,是要在场景函数中实现的 ) CCArray *array =HelloWorld::sharedWorld()->getArrayForEnemy(); for (int i=0; i<array->count(); i++) { Enemy* enemy =(Enemy *) array->objectAtIndex(i); //判断子弹是否与敌机碰撞 if (enemy->boundingBox().intersectsRect(this->boundingBox())) { //如果碰撞就通过cocos2dx的粒子效果制作爆炸效果(这个plist文件可以用ParticleDesigner软件制作) CCParticleSystemQuad *particle = CCParticleSystemQuad::create("boom.plist"); particle->setPosition(enemy->getPosition()); particle->setAutoRemoveOnFinish(true); HelloWorld::sharedWorld()->addChild(particle); //移除敌机和子弹 array->removeObject(enemy); HelloWorld::sharedWorld()->removeChild(enemy,true); HelloWorld::sharedWorld()->removeChild(this,true); } } //子弹出界以后要消除 if (this->getPositionY()<-(this->getContentSize().height)||this->getPositionY()>800) { this->getParent()->removeChild(this,true); } } void Bullet::onExit() { //退出本精灵的时候 停止刷新线程 this->unscheduleUpdate(); CCSprite::onExit(); }
#include "cocos2d.h" using namespace cocos2d; class Enemy :public cocos2d::CCSprite { public: static Enemy* createEnemy(const char* fileName,int _type); private: void enemyInit(const char* fileName,int _type); void update(float time); bool isActed; int type;//可以定义敌机的类型 };
实现.cpp文件
#include "HelloWorldScene.h" Enemy* Enemy::createEnemy(const char* fileName, int _type) { Enemy* enemy = new Enemy(); if (enemy&&enemy->initWithFile(fileName)) { enemy->autorelease(); enemy->enemyInit(fileName, _type); return enemy; } CC_SAFE_DELETE(enemy); return NULL; } void Enemy::enemyInit(const char* fileName, int _type) { type=_type; CCSize size = CCDirector::sharedDirector()->getWinSize(); this->setPosition(ccp(((int)(CCRANDOM_0_1()*size.width))/65*65,this->getContentSize().height+size.height)); //设置位置(在屏幕上随机) this->scheduleUpdate(); } void Enemy::update(float time) { this->setPosition(ccpAdd(this->getPosition(), ccp(0,-3))); //如果敌机出界移除 if (this->getPositionY()<-(this->getContentSize().height)) { HelloWorld::sharedWorld()->getArrayForEnemy()->removeObject(this); this->getParent()->removeChild(this,true); } }
三。设置主场景
将前面自定义的三个精灵,添加到战斗场景中
我直接是修改的系统上自带的HelloWorld类
实现HelloWorldScene.h
<span style="font-size: 14px; ">#include "cocos2d.h" #include "player.h" class HelloWorld : public cocos2d::CCLayer { public: virtual bool init(); static HelloWorld *sharedWorld(); static cocos2d::CCScene* scene(); player* getPlayer();//获取飞机对象 CCArray* getArrayForEnemy();//获取敌机数组(为判断碰撞准备) CREATE_FUNC(HelloWorld); private: CCArray *arrayEnemy;//储存敌机的数组 void autoCreateBullet();//创建子弹 void autoCreateEnemy();//创建敌机 virtual ~HelloWorld(); }; </span>实现 HelloWorldScene.m
#include "HelloWorldScene.h" #include "SimpleAudioEngine.h" #include "player.h" #include "Bullet.h" #include "Enemy.h" #include <unistd.h> using namespace cocos2d; using namespace CocosDenshion; static HelloWorld *sh; HelloWorld * HelloWorld::sharedWorld() { if (sh!=NULL) { return sh; } return NULL; } 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 instance2qa bool HelloWorld::init() { if ( !CCLayer::init() ) { return false; } sh=this; arrayEnemy =CCArray::create();//初始化数组 CC_SAFE_RETAIN(arrayEnemy);//内存管理方式 player *play =player::createPlayer("Spaceship.png");//创建飞机对象 this->addChild(play, 1, 100); this->schedule(schedule_selector(HelloWorld::autoCreateBullet), 0.37); this->schedule(schedule_selector(HelloWorld::autoCreateEnemy), 1); return true; } void HelloWorld::autoCreateEnemy() { int randomCount = CCRANDOM_0_1()*5; for (int i=0; i<randomCount; i++) { Enemy* enemy = Enemy::createEnemy("Icon.png", 0);//创建敌人类 arrayEnemy->addObject(enemy); this->addChild(enemy); } } void HelloWorld::autoCreateBullet() { player *play = (player *)this->getChildByTag(100);//根据tag值获得飞机对象 this->addChild(Bullet::createBullet("bullet.png", 2, ccpAdd(play->getPosition(), ccp(0, play->getContentSize().height*0.5))));//为飞机添加子弹 } player* HelloWorld::getPlayer() { player* play = (player*)HelloWorld::sharedWorld()->getChildByTag(100); return play; } CCArray* HelloWorld::getArrayForEnemy() { return arrayEnemy; } HelloWorld::~HelloWorld() { CC_SAFE_RELEASE(arrayEnemy); }
代码在 http://download.csdn.net/detail/u012282115/7263893