大一就要过去了,在这一年我学了C和C++,我们社长推荐我们学习cocos2d-x,所以我就学了,学习cocos2d-x游戏引擎不久,对它却情有独钟,真的觉得很有意思,真希望自己能长久坚持学习它,能把它学的很好,成为这方面的大牛。
这是我做的第一个小游戏,虽然做的很简陋,但我还是很高兴,所以在此和大家分享一下我的心情和我的小游戏。
这个游戏是我看叫小韩的哥们视频学着做的,也添加了一些我的想法,而且在做的时候也遇到一些错误,不过都及时改正了,这次实践让我对cocos2d-x框架更加熟悉。
}
游戏简陋,但我还是很开心,我会继续努力,相信我会学的更好!
相关代码:
menu.cpp文件:
do
{
CC_BREAK_IF(! CCScene::init());
CCSprite *bg = CCSprite::create("blue-shooting-stars.png");
bg->setAnchorPoint(CCPointZero);
bg->setPosition(CCPointZero);
this->addChild(bg);
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(MenuScene::menuCloseCallback));
CC_BREAK_IF(! pCloseItem);
pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
pMenu->setPosition(CCPointZero);
CC_BREAK_IF(! pMenu);
this->addChild(pMenu, 1);
CCLabelTTF* pLabel = CCLabelTTF::create("Main Menu", "Arial", 30);
CC_BREAK_IF(! pLabel);
CCSize size = CCDirector::sharedDirector()->getWinSize();
pLabel->setPosition(ccp(size.width / 2, size.height - 50));
pLabel->setColor(ccc3(0,0,0));
this->addChild(pLabel, 1);
CCMenuItemImage *myItems = CCMenuItemImage::create(
"newgameA.png",
"newgameB.png",
this,
menu_selector(MenuScene::menuNewGameCallback));
CC_BREAK_IF(!myItems);
myItems->setPosition(ccp(size.width/2, size.height/2));
CCMenu* myMenu = CCMenu::menuWithItems(myItems, NULL);
myMenu->setScale(0.5);
myMenu->setPosition(CCPointZero);
CC_BREAK_IF(!myMenu);
this->addChild(myMenu, 1);
CCSprite *about = CCSprite::create("aboutA.png");
about->setAnchorPoint(CCPointZero);
about->setScale(0.5);
about->setPosition(ccp(size.width/2 - 55, size.height/2 - 50));
this->addChild(about);
CCSprite *cat = CCSprite::create("cat.png");
cat->setAnchorPoint(CCPointZero);
cat->setScale(0.5);
cat->setPosition(ccp(size.width/2 - 150, size.height/2 - 40));
this->addChild(cat);
CCSprite *enemy = CCSprite::create("enemy.png");
enemy->setAnchorPoint(CCPointZero);
enemy->setScale(0.5);
enemy->setPosition(ccp(size.width/2 + 75, size.height/2 - 40));
this->addChild(enemy);
SimpleAudioEngine::sharedEngine()->playBackgroundMusic("background.mp3",true);
bRet = true;
} while (0);
return bRet;
void MenuScene::menuNewGameCallback(CCObject* pSender){
CCScene* scene = CCScene::node();
GameScene *scene1 = GameScene::create();
scene->addChild(scene1);
CCDirector::sharedDirector()->replaceScene(CCTransitionFlipX::transitionWithDuration (0.3, scene));
}
GameScene.cpp文件:
if(CCLayerColor::initWithColor(ccc4(255,255,255,255)))
{
projectilesDestroyed = 0;
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
arrayProjectile = CCArray::create();
arrayTarget = CCArray::create();
CCSprite *bg = CCSprite::create("bg.png");
bg->setAnchorPoint(CCPointZero);
bg->setPosition(CCPointZero);
this->addChild(bg,0);
CCSprite *player = CCSprite::create("cat.png");
player->setScale(0.3);
player->setPosition(ccp(player->getContentSize().width/2-40,winSize.height/2));
this->addChild(player);
arrayProjectile->retain();
arrayTarget->retain();
this->schedule(schedule_selector(GameScene::gameLogic),1.0);
this->schedule(schedule_selector(GameScene::update));
this->setTouchEnabled(true);
return true;
}
else
{
return false;
}
}
void GameScene::update(float dt)
{
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
for(int i = 0; i < arrayTarget->count();i++)
{
CCSprite *target = (CCSprite*)arrayTarget->objectAtIndex(i);
for(int j = 0; j < arrayProjectile->count();j++)
{
CCSprite *projectile = (CCSprite*)arrayProjectile->objectAtIndex(j);
if(target->boundingBox().intersectsRect(projectile->boundingBox()))
{
arrayTarget->removeObject(target);
arrayProjectile->removeObject(projectile);
this->removeChild(target);
this->removeChild(projectile);
projectilesDestroyed++;
if(projectilesDestroyed >= 10)
{
GameOverScene *scene = GameOverScene::create();
scene->getLayer()->getLabel()->setString("You beat back 10 enemies");
CCLabelTTF* pLabel = CCLabelTTF::create("YOU WIN", "Arial", 35);
CC_BREAK_IF(! pLabel);
pLabel->setColor(ccc3(0,0,0));
pLabel->setPosition(ccp(winSize.width/2,winSize.height/2));
scene->addChild(pLabel);
CCDirector::sharedDirector()->replaceScene(CCTransitionShrinkGrow::transitionWithDuration(0.5, scene));
}
break;
}
}
}
}
void GameScene::ccTouchesEnded(cocos2d::CCSet *touches,cocos2d::CCEvent *event)
{
CCTouch *touch =(CCTouch*)touches->anyObject();
CCPoint location = touch->getLocationInView();
location = this->convertTouchToNodeSpace(touch);
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSprite *projectile = CCSprite::create("YuGuZD.png");
projectile->setScale(0.5);
projectile->setPosition(ccp(30,winSize.height/2));
float offX = location.x - projectile->getPositionX();
float offY = location.y - projectile->getPositionY();
if(offX <= 0)
{
return;
}
projectile->setTag(2);
this->addChild(projectile);
arrayProjectile->addObject(projectile);
float angle = offY / offX;
float realX = winSize.width + projectile->getContentSize().width/2 + 20;
float realY = realX * angle +projectile->getPositionY();
CCPoint finalPosition = ccp(realX, realY);
float length = sqrtf(realX * realX + realY * realY);
float velocity = 480;
float realMoveDuration = length / velocity;
projectile->runAction(CCSequence::create(CCMoveTo::create(realMoveDuration,finalPosition),
CCCallFuncN::create(this, callfuncN_selector(GameScene::spriteMoveFinished)),NULL));
}
void GameScene::spriteMoveFinished(CCNode *sender)
{
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSprite *sprite = (CCSprite*)sender;
if(sprite->getTag() == 1)
{
arrayTarget->removeObject(sprite);
GameOverScene *scene = GameOverScene::create();
scene->getLayer()->getLabel()->setString("YOU LOSE");
CCSprite *gameover = CCSprite::create("gameover.png");
gameover->setScale(0.3);
gameover->setPosition(ccp(winSize.width/2,winSize.height/2));
scene->getLayer()->getGameover()->addChild(gameover);
CCDirector::sharedDirector()->replaceScene(CCTransitionFlipX::transitionWithDuration(0.5, scene));
}
else if(sprite->getTag() == 2)
{
arrayProjectile->removeObject(sprite);
}
}
void GameScene::addTarget()
{
CCSize winSize = CCDirector::sharedDirector()->getWinSize();
CCSprite *target = CCSprite::create("enemy.png");
int minY = target->getContentSize().height/2;
int maxY = winSize.height - target->getContentSize().height/2;
int rangeY = maxY - minY;
int actualY = rand()%rangeY + minY;
target->setScale(0.3);
target->setPosition(ccp(((winSize.width) + (target->getContentSize().width/2)),actualY));
target->setTag(1);
this->addChild(target);
arrayTarget->addObject(target);
//float actrualDuration = 3.0;//只有一个速度
float minDuration = 2;
float maxDuration = 4;
int rangeDuration = maxDuration - minDuration; //随机速度
float actrualDuration = rand()%rangeDuration + minDuration;
CCFiniteTimeAction *actionMove = CCMoveTo::create(actrualDuration,ccp(0 - target->getContentSize().width/2, actualY));
CCFiniteTimeAction *actionMoveDone = CCCallFuncN::create(this,callfuncN_selector(GameScene::spriteMoveFinished));
target->runAction(CCSequence::create(actionMove,actionMoveDone,NULL));
}
void GameScene::finishShoot()
{
this->addChild(projectile);
arrayProjectile->addObject(projectile);
SimpleAudioEngine::sharedEngine()->playEffect("pew-pew-lei.mp3", false);
projectile->release();
projectile = NULL;
}