cocos2d-x开发的第一个小游戏

   大一就要过去了,在这一年我学了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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值