初学cocos2d-x,正好在网上发现一些素材,试着写了个小游戏,写得稀烂,后面再去优化吧,暂且做个记录。
屌丝七夕只能做个七夕游戏安慰自己了,悟空都有女朋友了 = =
先上图:
主场景代码:
#include "HelloWorldScene.h"
#include "Defines.h"
#include "GameOverScene.h"
USING_NS_CC;
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 instance
bool HelloWorld::init()
{
//
// 1. super init first
if ( !CCLayer::init() )
{
return false;
}
//background init
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
_mapFront = CCSprite::create("stage2mtgogya.png", CCRectMake(4, 0, 2690, 480));
_mapMiddle = CCSprite::create("stage2mtgogya.png", CCRectMake(4, 480, 2000, 400));
_mapBack = CCSprite::create("stage2mtgogya.png", CCRectMake(19, 884, 2047, 500));
_mapFront->setAnchorPoint(ccp(0, 0));
_mapMiddle->setAnchorPoint(ccp(0, 0));
_mapBack->setAnchorPoint(ccp(0, 0));
CCMoveTo *frontAction = CCMoveTo::create(60.0f, ccp(-2050, 0));
CCMoveTo *midMoveTo = CCMoveTo::create(60.0f, ccp(-1200, 0));
CCMoveTo *backMoveTo = CCMoveTo::create(60.0f, ccp(-400, 0));
CCFiniteTimeAction *bossSeq = CCSequence::create(CCDelayTime::create(60.0f),
CCCallFunc::create(this, callfunc_selector(HelloWorld::createBoss)),
NULL);
CCFiniteTimeAction *bossSeq2 = CCSequence::create(CCDelayTime::create(50.0f),
CCCallFunc::create(this, callfunc_selector(HelloWorld::stopSchedule)),
NULL);
this->addChild(_mapFront, -8);
this->addChild(_mapMiddle, -9);
this->addChild(_mapBack, -10);;
this->runAction(bossSeq);
this->runAction(bossSeq2);
_mapFront->runAction(frontAction);
_mapMiddle->runAction(midMoveTo);
_mapBack->runAction(backMoveTo);
//menu init
menuUp = CCSprite::create("hud.png", CCRectMake(0, 0, 512, 66));
menuUp->setAnchorPoint(ccp(0,0));
menuUp->setPosition(ccp(0, visibleSize.height - 66));
this->addChild(menuUp, 10);
menuUp2 = CCSprite::create("hud.png", CCRectMake(0, 587, 128, 66));
menuUp2->setAnchorPoint(ccp(1, 1));
menuUp2->setPosition(ccp(640, 480));
this->addChild(menuUp2, 10);
menuDown = CCSprite::create("hud.png", CCRectMake(0, 384, 512, 48));
menuDown->setAnchorPoint(ccp(0,0));
menuDown->setScaleX(640.0f / 512.0f);
menuDown->setPosition(ccp(0, 0));
this->addChild(menuDown, 10);
//hero init
hero = CCSprite::create();
hero->setPosition(ccp(50, 240));
hero->runAction(CCRepeatForever::create(CCAnimate::create(wkIdleAnimation)));
this->addChild(hero);
cloud = CCSprite::create();
cloud->setPosition(ccp(54, 220));
cloud->runAction(CCRepeatForever::create(CCAnimate::create(cloudIdleAnimation)));
this->addChild(cloud, -1);
//init member
bBoss = false;
bGod = false;
bulletRank = 3;
bulletGap = 0.2f;
bulletSpeed = 1.0f;
hp = 48;
boss = CCSprite::create();
boss->retain();
bulletArr = CCArray::create();
bulletArr->retain();
enemybulletArr = CCArray::create();
enemybulletArr->retain();
enemyArr = CCArray::create();
enemyArr->retain();
colorBar = CCSprite::createWithSpriteFrame(CCSpriteFrame::create("hud.png", CCRectMake(128, 619, 5, 12)));
colorBar->setScaleX(hp);
colorBar->setAnchorPoint(ccp(0, 1));
colorBar->setPosition(ccp(96, 450));
this->addChild(colorBar, 5);
wks = WK_IDLE;
//init effect
SimpleAudioEngine::sharedEngine()->playBackgroundMusic("songshu.mp3", true);
SimpleAudioEngine::sharedEngine()->preloadEffect("fireEffect.mp3");
SimpleAudioEngine::sharedEngine()->preloadEffect("explodeEffect.mp3");
SimpleAudioEngine::sharedEngine()->preloadEffect("boss.mp3");
//schedule
this->scheduleUpdate();
this->schedule(SEL_SCHEDULE(&HelloWorld::enemyUpdate), 1.5f);
this->schedule(SEL_SCHEDULE(&HelloWorld::keyboardUpdate), 0.1f);
return true;
}
void HelloWorld::update(float dt)
{
if(hp <= 0)
{
SimpleAudioEngine::sharedEngine()->stopAllEffects();
CCDirector::sharedDirector()->replaceScene(CCTransitionFade::create(1.5f, GameOver::scene() ));
}
for(int i=0; i<bulletArr->count(); )
{
CCSprite *s = (CCSprite*)(bulletArr->objectAtIndex(i));
float x = s->getPositionX();
float y = s->getPositionY();
if(x<0 || x>640 || y<0 || y>480)
{
this->removeChild(s, true);
bulletArr->removeObjectAtIndex(i);
}
else
i++;
}
for(int i=0; i<enemybulletArr->count(); )
{
CCSprite *s = (CCSprite*)(enemybulletArr->objectAtIndex(i));
float x = s->getPositionX();
float y = s->getPositionY();
if(x<0 || x>640 || y<0 || y>480)
{
this->removeChild(s, true);
enemybulletArr->removeObjectAtIndex(i);
}
else
i++;
}
if((GetAsyncKeyState(0x41) & 0x8000) == 0x8000)
{
hero->setPositionX(hero->getPositionX() - 3);
}
if((GetAsyncKeyState(0x44) & 0x8000) == 0x8000)
{
hero->setPositionX(hero->getPositionX() + 3);
}
if((GetAsyncKeyState(0x57) & 0x8000) == 0x8000)
{
hero->setPositionY(hero->getPositionY() + 3);
}
if((GetAsyncKeyState(0x53) & 0x8000) == 0x8000)
{
hero->setPositionY(hero->getPositionY() - 3);
}
if(hero->getPositionX() < 24)
hero->setPositionX(24);
if(hero->getPositionX() > 620)
hero->setPositionX(620);
if(hero->getPositionY() < 76)
hero->setPositionY(76);
if(hero->getPositionY() > 388)
hero->setPositionY(388);
cloud->setPosition(ccp(hero->getPositionX() + 4, hero->getPositionY() - 20));
for(int i=0; i<enemyArr->count(); i++)
{
for(int j=0; j<bulletArr->count(); )
{
CCSprite *e = (CCSprite*)(enemyArr->objectAtIndex(i));
CCSprite *b = (CCSprite*)(bulletArr->objectAtIndex(j));
CCRect eRect = CCRectMake(e->getPositionX() - e->getContentSize().width / 2, e->getPositionY() - e->getContentSize().height /2,
e->getContentSize().width, e->getContentSize().height);
CCRect bRect = CCRectMake(b->getPositionX() - b->getContentSize().width / 2, b->getPositionY() - b->getContentSize().height /2,
b->getContentSize().width, b->getContentSize().height);
if(eRect.intersectsRect(bRect))
{
e->setTag(e->getTag() - 5);
this->removeChild(b, true);
bulletArr->removeObjectAtIndex(j);
} else
j++;
}
}
for(int i=0; i<enemyArr->count(); )
{
CCSprite *s = (CCSprite*)(enemyArr->objectAtIndex(i));
if(s->getTag() <= 0)
{
this->removeChild(s, true);
CCPoint p = s->getPosition();
enemyArr->removeObjectAtIndex(i);
CCSprite * s = CCSprite::create();
s->setPosition(p);
CCAnimate *animate = CCAnimate::create(explodeAnimation);
this->addChild(s);
CCFiniteTimeAction *seq = CCSequence::create(CCAnimate::create(explodeAnimation),
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteDelete)),
NULL);
s->runAction(seq);
SimpleAudioEngine::sharedEngine()->playEffect("explodeEffect.mp3");
}
else i++;
}
for(int i=0; i<enemybulletArr->count(); )
{
CCSprite* s = (CCSprite*)(enemybulletArr->objectAtIndex(i));
CCPoint bp = s->getPosition();
CCRect hRect = CCRectMake(hero->getPositionX() - hero->getContentSize().width * 0.4f,
hero->getPositionY() - hero->getContentSize().height * 0.4f,
hero->getContentSize().width * 0.8f,
hero->getContentSize().height * 0.8f);
CCRect bRect = CCRectMake(s->getPositionX() - s->getContentSize().width * 0.4f,
s->getPositionY() - s->getContentSize().height * 0.4f,
s->getContentSize().width * 0.8f,
s->getContentSize().height * 0.8f);
if(hRect.intersectsRect(bRect))
{
CCBlink *heroBlink = CCBlink::create(0.3f, 3);
if(!hero->isVisible())
hero->setVisible(true);
hero->runAction(heroBlink);
hp -= 4;
this->removeChild(s, true);
colorBar->setScaleX(hp);
enemybulletArr->removeObjectAtIndex(i);
} else i++;
}
if(bBoss)
{
CCRect bRect = CCRectMake(boss->getPositionX() - boss->getContentSize().width * 0.4f,
boss->getPositionY() - boss->getContentSize().height * 0.4f,
boss->getContentSize().width * 0.8f,
boss->getContentSize().height * 0.8f);
CCRect hRect = CCRectMake(hero->getPositionX() - hero->getContentSize().width * 0.4f,
hero->getPositionY() - hero->getContentSize().height * 0.4f,
hero->getContentSize().width * 0.8f,
hero->getContentSize().height * 0.8f);
if(bRect.intersectsRect(hRect))
{
if(!bGod)
{
bGod = true;
hp -= 4;
colorBar->setScaleX(hp);
CCFiniteTimeAction *hSeq = CCSequence::create(CCBlink::create(0.4f, 2),
CCCallFunc::create(this, callfunc_selector(HelloWorld::godModeExit)),
NULL);
hero->runAction(hSeq);
}
}
}
}
void HelloWorld::keyboardUpdate(float dt)
{
if((GetAsyncKeyState(0x4A) & 0x8000) == 0x8000 && wks == WK_IDLE)
{
wks = WK_SHOOT;
SimpleAudioEngine::sharedEngine()->playEffect("fireEffect.mp3");
CCAnimate *animate = CCAnimate::create(wkShootAnimation);
CCFiniteTimeAction *seq = CCSequence::create(CCDelayTime::create(bulletGap),
CCCallFunc::create(this, callfunc_selector(HelloWorld::resetHeroState)), NULL);
this->runAction(seq);
hero->runAction(animate);
switch(bulletRank)
{
case 0:{
for(int i=0; i<2; i++)
{
CCSprite *bullet = CCSprite::create();
bullet->setPosition(ccpAdd(hero->getPosition(), ccp(20, -7 + i * 14)));
CCMoveBy *moveBy = CCMoveBy::create(bulletSpeed, ccp(640, 0));
CCFiniteTimeAction *repeat = CCRepeatForever::create(CCAnimate::create(bulletOneAnimation));
bullet->runAction(repeat);
bullet->runAction(moveBy);
this->addChild(bullet, 1);
bulletArr->addObject(bullet);
}
}
break;
case 1:
break;
case 2:
break;
case 3:
{
CCSprite *bullet = CCSprite::create();
bullet->setPosition(ccpAdd(hero->getPosition(), ccp(20, 0)));
CCMoveBy *moveBy = CCMoveBy::create(bulletSpeed, ccp(640, 0));
CCFiniteTimeAction *repeat = CCRepeatForever::create(CCAnimate::create(bulletFourAnimation));
bullet->runAction(repeat);
bullet->runAction(moveBy);
this->addChild(bullet, 1);
bulletArr->addObject(bullet);
CCFiniteTimeAction *repeat2;
CCMoveBy *moveBy2;
for(int i=0; i<3; i++)
for(int j=0; j<2; j++)
{
CCSprite *bullet = CCSprite::create();
if(i==0)
{
bullet->setPosition(ccpAdd(hero->getPosition(), ccp(15, -8 + 16 * j)));
moveBy2 = CCMoveBy::create(bulletSpeed, ccp(640, -100 + 200 * j));
repeat2 = CCRepeatForever::create(CCAnimate::create(bulletOneAnimation));
} else if(i==1) {
bullet->setPosition(ccpAdd(hero->getPosition(), ccp(15, -4 + 8 * j)));
moveBy2 = CCMoveBy::create(bulletSpeed, ccp(640, -50 + 100 * j));
repeat2 = CCRepeatForever::create(CCAnimate::create(bulletOneAnimation));
} else {
bullet->setPosition(ccpAdd(hero->getPosition(), ccp(15, -12 + 24 * j)));
moveBy2 = CCMoveBy::create(bulletSpeed, ccp(640, -150 + 300 * j));
repeat2 = CCRepeatForever::create(CCAnimate::create(bulletOneAnimation));
}
bullet->runAction(repeat2);
bullet->runAction(moveBy2);
this->addChild(bullet, 1);
bulletArr->addObject(bullet);
}
}
break;
}
}
}
void HelloWorld::enemyUpdate(float dt)
{
CCSprite *angleEnemy = CCSprite::create();
angleEnemy->setPosition(ccp(670, rand()%200 + 200));
CCRepeat *repeat1 = CCRepeat::create(CCAnimate::create(angleEnemyAnimation[0]), 7);
CCMoveBy *moveBy1 = CCMoveBy::create(3.2f, ccp(-400 - rand()%240, 0));
CCMoveBy *moveBy2 = CCMoveBy::create(1.6f, ccp(640, 0));
this->addChild(angleEnemy);
angleEnemy->runAction(repeat1);
CCFiniteTimeAction *seq = CCSequence::create(moveBy1,
CCAnimate::create(angleEnemyAnimation[1]),
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::createBullet)),
moveBy2,
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteDelete)),
NULL);
angleEnemy->runAction(seq);
angleEnemy->setTag(100);
enemyArr->addObject(angleEnemy);
if(rand()%7 < 3)
{
CCSprite *pigEnemy = CCSprite::create();
pigEnemy->setPosition(ccp(660, 92));
pigEnemy->setScale(0.8f);
CCFiniteTimeAction *pigSeq = CCSequence::create(CCAnimate::create(pigEnemyAnimation[0]),
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::createBullet), (void*)1),
CCDelayTime::create(1.0f),
CCAnimate::create(pigEnemyAnimation[1]),
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::createBullet), (void*)2),
CCDelayTime::create(1.0f),
CCAnimate::create(pigEnemyAnimation[2]),
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::createBullet), (void*)3),
CCDelayTime::create(1.0f),
NULL);
CCRepeatForever *repeat = CCRepeatForever::create((CCActionInterval *)pigSeq);
this->addChild(pigEnemy);
enemyArr->addObject(pigEnemy);
pigEnemy->runAction(repeat);
pigEnemy->setTag(60);
CCFiniteTimeAction *moveSeq = CCSequence::create(CCMoveBy::create(20, ccp(-683.3333f, 0)),
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteDelete)),
NULL);
pigEnemy->runAction(moveSeq);
}
}
void HelloWorld::spriteDelete(CCNode* node)
{
CCSprite *s = (CCSprite*)node;
s->removeFromParentAndCleanup(true);
}
void HelloWorld::resetHeroState()
{
wks = WK_IDLE;
}
void HelloWorld::createBullet(CCNode *node)
{
CCSprite *s = (CCSprite*)node;
CCPoint p = s->getPosition();
CCPoint hp = hero->getPosition();
CCPoint sp = ccpMult(ccpNormalize(ccpSub(hp, p)), 900);
CCRepeatForever *repeat = CCRepeatForever::create(CCAnimate::create(bulletTwoAnimation));
CCSprite *bullet = CCSprite::create();
bullet->setPosition(p);
this->addChild(bullet);
enemybulletArr->addObject(bullet);
bullet->runAction(repeat);
CCMoveTo *moveTo = CCMoveTo::create(6.0f, sp);
bullet->runAction(moveTo);
}
void HelloWorld::createBullet(CCNode *node, void *data)
{
CCSprite *s = (CCSprite*)node;
CCPoint p = s->getPosition();
int bKind = (int)data;
CCSprite *b = CCSprite::create();
this->addChild(b);
CCRepeatForever *repeat = CCRepeatForever::create(CCAnimate::create(bulletTwoAnimation));
switch(bKind)
{
case 1:
{
b->runAction(repeat);
b->setPosition(ccpAdd(p, ccp(-30, 0)));
CCFiniteTimeAction *bSeq = CCSequence::create(CCMoveBy::create(2.0f, ccp(-640, 0)),
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteDelete)),
NULL);
b->runAction(bSeq);
enemybulletArr->addObject(b);
}
break;
case 2:
{
b->runAction(repeat);
b->setPosition(ccpAdd(p, ccp(-20, 15)));
CCFiniteTimeAction *bSeq = CCSequence::create(CCMoveBy::create(2.0f, ccp(-640, 320)),
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteDelete)),
NULL);
b->runAction(bSeq);
enemybulletArr->addObject(b);
}
break;
case 3:
{
b->runAction(repeat);
b->setPosition(ccpAdd(p, ccp(-25, 25)));
CCFiniteTimeAction *bSeq = CCSequence::create(CCMoveBy::create(2.0f, ccp(-640, 640)),
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteDelete)),
NULL);
b->runAction(bSeq);
enemybulletArr->addObject(b);
}
break;
case 4:
{
b->setScaleX(1.5f);
b->setPosition(ccpAdd(p, ccp(- 430.0f / 2.0f - 120, rand()%200 - 50)));
CCFiniteTimeAction *bSeq = CCSequence::create(CCAnimate::create(bulletBossAnimation[0]),
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteDelete)),
NULL);
CCRect bRect = CCRectMake(b->getPositionX() - 215, b->getPositionY() - 25, 430, 50);
CCRect hRect = CCRectMake(hero->getPositionX() - hero->getContentSize().width / 2,
hero->getPositionY() - hero->getContentSize().height / 2,
hero->getContentSize().width,
hero->getContentSize().height);
if(bRect.intersectsRect(hRect))
{
hp -= 10;
colorBar->setScaleX(hp);
CCBlink *heroBlink = CCBlink::create(0.3f, 3);
if(!hero->isVisible())
hero->setVisible(true);
hero->runAction(heroBlink);
}
b->runAction(bSeq);
}
break;
case 5:
{
b->setPosition(ccp(p.x - 150, 240));
float fp = rand()%60 + 210;
for(int i=0; i<3; i++)
{
for(int j=0; j<2; j++)
{
CCSprite *fb = CCSprite::create();
fb->setScale(0.7f);
fb->setPosition(ccp(p.x - 130, fp + (i+1) * 20 * (j==0 ? 1:(-1))));
this->addChild(fb);
CCAnimate* animate = CCAnimate::create(bulletBossAnimation[1]);
CCRotateBy *rotateBy = CCRotateBy::create(0.3f, 60 * (j==0 ? 1:(-1) ) );
CCMoveBy *moveBy = CCMoveBy::create(0.3f, ccp(-64, (i+1) * 6 * (j==0 ? 1:-1 )));
CCFiniteTimeAction *fSp = CCSpawn::create(animate, rotateBy, moveBy, NULL);
CCFiniteTimeAction *fSeq = CCSequence::create(CCRepeat::create(fSp, 10),
CCCallFuncN::create(this, callfuncN_selector(HelloWorld::spriteDelete)),
NULL);
fb->runAction(fSeq);
enemybulletArr->addObject(fb);
}
}
}
break;
}
}
void HelloWorld::createBoss()
{
SimpleAudioEngine::sharedEngine()->stopBackgroundMusic(true);
SimpleAudioEngine::sharedEngine()->playEffect("boss.mp3", true);
bBoss = true;
boss->setPosition(ccp(800, 300));
this->addChild(boss);
CCRepeat *repeat1 = CCRepeat::create(CCAnimate::create(bossOneAnimation[0]), 4);
CCMoveBy *moveBy1 = CCMoveBy::create(4.0f, ccp(-280, 0));
CCAnimate *attackOne = CCAnimate::create(bossOneAnimation[1]);
CCAnimate *attackTwo = CCAnimate::create(bossOneAnimation[2]);
CCMoveBy *moveByLeft = CCMoveBy::create(1.0f, ccp(-400, 0));
CCMoveBy *moveByDown = CCMoveBy::create(1.0f, ccp(0, -100));
CCMoveBy *moveByRight = CCMoveBy::create(1.0f, ccp(400, 0));
CCMoveBy *moveByUp = CCMoveBy::create(1.0f, ccp(0, 100));
CCFiniteTimeAction *oneSeq = CCSequence::create(attackOne,
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::createBullet), (void*)5),
CCDelayTime::create(rand()%10 / 10.0f),
repeat1,
attackOne,
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::createBullet), (void*)5),
CCDelayTime::create(rand()%10 / 10.0f),
repeat1,
CCSpawn::create(moveByLeft, CCRepeat::create(CCAnimate::create(bossOneAnimation[0]), 1), NULL),
CCSpawn::create(moveByDown, CCRepeat::create(CCAnimate::create(bossOneAnimation[0]), 1), NULL),
CCSpawn::create(moveByRight, CCRepeat::create(CCAnimate::create(bossOneAnimation[0]), 1), NULL),
repeat1,
attackTwo,
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::createBullet), (void*)4),
CCDelayTime::create(1.0f),
attackTwo,
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::createBullet), (void*)4),
CCDelayTime::create(1.0f),
attackTwo,
CCCallFuncND::create(this, callfuncND_selector(HelloWorld::createBullet), (void*)4),
CCDelayTime::create(1.0f),
CCSpawn::create(moveByUp, CCRepeat::create(CCAnimate::create(bossOneAnimation[0]), 1), NULL),
repeat1,
NULL);
CCRepeat *totalRepeat = CCRepeat::create(oneSeq, 100);
CCFiniteTimeAction *enterSpawn = CCSpawn::create(repeat1, moveBy1, NULL);
CCFiniteTimeAction *totalSeq = CCSequence::create(enterSpawn, totalRepeat, NULL);
boss->runAction(totalSeq);
}
void HelloWorld::godModeExit()
{
bGod = false;
}
void HelloWorld::stopSchedule()
{
this->unschedule(schedule_selector(HelloWorld::enemyUpdate));
}