`
abc20899
  • 浏览: 929000 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

cocos2dx 官网的小游戏 2

 
阅读更多
第四节:怎样发射一些子弹


在HelloWorld.cpp文件中的init方法中添加
this->setIsTouchEnabled(true);  //使可触摸


在HelloWorldScene.h文件中声明
void ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent* event); 

在HelloWorldScene.cpp文件中实现该方法

void HelloWorld::ccTouchesEnded(CCSet* touches, CCEvent* event){
     // Choose one of the touches to work with  获取坐标点
     CCTouch* touch = (CCTouch*)( touches->anyObject() );
     CCPoint location = touch->locationInView(touch->view());
     location = CCDirector::sharedDirector()->convertToGL(location);
 
     // Set up initial location of projectile
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    CCSprite *projectile = CCSprite::spriteWithFile("Projectile.png",CCRectMake(0, 0, 20, 20));
    projectile->setPosition( ccp(20, winSize.height/2) );

    // Determinie offset of location to projectile
    int offX = location.x - projectile->getPosition().x;
    int offY = location.y - projectile->getPosition().y;

    // Bail out if we are shooting down or backwards
    if (offX <= 0) return;

    // Ok to add now - we've double checked position
    this->addChild(projectile);

    // Determine where we wish to shoot the projectile to
    int realX = winSize.width
                         + (projectile->getContentSize().width/2);
    float ratio = (float)offY / (float)offX;
    int realY = (realX * ratio) + projectile->getPosition().y;
    CCPoint realDest = ccp(realX, realY);
    // Determine the length of how far we're shooting
    int offRealX = realX - projectile->getPosition().x;
    int offRealY = realY - projectile->getPosition().y;
    float length = sqrtf((offRealX * offRealX) 
                                        + (offRealY*offRealY));
    float velocity = 480/1; // 480pixels/1sec
    float realMoveDuration = length/velocity;

    // Move projectile to actual endpoint
    projectile->runAction( CCSequence::actions(
        CCMoveTo::actionWithDuration(realMoveDuration, realDest),
        CCCallFuncN::actionWithTarget(this, 

        callfuncN_selector(HelloWorld::spriteMoveFinished)), 
        NULL) );
}






第五节:检测碰撞
   我们要为两个精灵添加tag,setTag和getTag
在文件中HelloWorldScene.h添加以下两个方法  两个精灵的集合
protected:
  cocos2d::CCMutableArray<cocos2d::CCSprite*> *_targets;  
  cocos2d::CCMutableArray<cocos2d::CCSprite*> *_projectiles;


// in init()   在init方法中 实例化精灵数组
// Initialize arrays
_targets = new CCMutableArray<CCSprite*>;
 _projectiles = new CCMutableArray<CCSprite*>;    
 
 HelloWorld::~HelloWorld(){   //在析构函数中  释放内存操作
  if (_targets){
    _targets->release();
    _targets = NULL;
  }

  if (_projectiles){
    _projectiles->release();
    _projectiles = NULL;
  }

  // cpp don't need to call super dealloc
  // virtual destructor will do this
}

HelloWorld::HelloWorld():_targets(NULL),_projectiles(NULL){
	
}    


修改 addTarget() to add a new target to targets array, and set its tag to be 1.
// Add to targets array
target->setTag(1);
_targets->addObject(target);

修改ccTouchesEnded()方法  
Modify ccTouchesEnded() to add a new bullet to bullets array, and set its tag to be 2.
// Add to projectiles array
projectile->setTag(2);
_projectiles->addObject(projectile);


modify spriteMoveFinished()
void HelloWorld::spriteMoveFinished(CCNode* sender){
   CCSprite *sprite = (CCSprite *)sender;
   this->removeChild(sprite, true);
 
   if (sprite->getTag() == 1){  // target
     _targets->removeObject(sprite);
   }
  else if (sprite->getTag() == 2){  // projectile
    _projectiles->removeObject(sprite);
  }
}    


在头文件中声明void update(ccTime dt)方法
每一帧检测碰撞
void HelloWorld::update(ccTime dt){
   CCMutableArray<CCSprite*> *projectilesToDelete = new CCMutableArray<CCSprite*>;
   CCMutableArray<CCSprite*>::CCMutableArrayIterator it, jt;
 
   for (it = _projectiles->begin(); it != _projectiles->end(); it++){
    CCSprite *projectile =*it;
    CCRect projectileRect = CCRectMake(
        projectile->getPosition().x 
                          - (projectile->getContentSize().width/2),
        projectile->getPosition().y 		
                          - (projectile->getContentSize().height/2),
        projectile->getContentSize().width,
        projectile->getContentSize().height);

    CCMutableArray<CCSprite*>*targetsToDelete 
                          = new CCMutableArray<CCSprite*>;

    for (jt = _targets->begin(); jt != _targets->end(); jt++){
      CCSprite *target =*jt;
      CCRect targetRect = CCRectMake(
        target->getPosition().x - (target->getContentSize().width/2),
        target->getPosition().y - (target->getContentSize().height/2),
        target->getContentSize().width,
        target->getContentSize().height);

      if (CCRect::CCRectIntersectsRect(projectileRect, targetRect)) {
        targetsToDelete->addObject(target);
      }
    }

    for (jt = targetsToDelete->begin(); jt != targetsToDelete->end(); jt++){
      CCSprite *target =*jt;
      _targets->removeObject(target);
      this->removeChild(target, true);
    }

   if (targetsToDelete->count() >0){
      projectilesToDelete->addObject(projectile);
    }
    targetsToDelete->release();
  }

  for (it = projectilesToDelete->begin(); it != projectilesToDelete->end(); it++){
    CCSprite* projectile =*it;
    _projectiles->removeObject(projectile);
    this->removeChild(projectile, true);
  }
  projectilesToDelete->release();
}    


调用这个方法
this->schedule( schedule_selector(HelloWorld::update) ); 



第六节 怎么播放声音
HelloWorldScene.cpp中添加
#include "SimpleAudioEngine.h"

在init().方法中
CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("background-music-aac.wav", true); 


在in ccTouchesEnded() 方法中
CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("pew-pew-lei.wav");



第七节 :加入场景跳转

GameOverScene.h:

#ifndef _GAME_OVER_SCENE_H_
#define _GAME_OVER_SCENE_H_

#include "cocos2d.h" 
class GameOverLayer : public cocos2d::CCLayerColor{
 public:
     GameOverLayer():_label(NULL) {};
    virtual ~GameOverLayer();
    bool init();
    LAYER_NODE_FUNC(GameOverLayer);

    void gameOverDone();

    CC_SYNTHESIZE_READONLY(cocos2d::CCLabelTTF*, _label, Label);
};

class GameOverScene : public cocos2d::CCScene{
  public:
    GameOverScene():_layer(NULL) {};
    ~GameOverScene();
    bool init();
    SCENE_NODE_FUNC(GameOverScene);

    CC_SYNTHESIZE_READONLY(GameOverLayer*, _layer, Layer);
};
#endif // _GAME_OVER_SCENE_H_



GameOverScene.cpp:

#include "GameOverScene.h" 
#include "HelloWorldScene.h" 
 using namespace cocos2d; 
 bool GameOverScene::init(){
     if( CCScene::init() ){
        this->_layer = GameOverLayer::node();
        this->_layer->retain();
        this->addChild(_layer);

        return true;
    }else{
        return false;
    }
}

GameOverScene::~GameOverScene(){
    if (_layer){
        _layer->release();
        _layer = NULL;
    }
}

bool GameOverLayer::init(){
    if ( CCLayerColor::initWithColor( ccc4(255,255,255,255) ) )    {
        CCSize winSize = CCDirector::sharedDirector()->getWinSize();
        this->_label = CCLabelTTF::labelWithString("","Artial", 32);
        _label->retain();
        _label->setColor( ccc3(0, 0, 0) );
        _label->setPosition(ccp(winSize.width/2, winSize.height/2));
        this->addChild(_label);

        this->runAction( CCSequence::actions(
        CCDelayTime::actionWithDuration(3),
        CCCallFunc::actionWithTarget(this, 
            callfunc_selector(GameOverLayer::gameOverDone)),
            NULL));

        return true;
    }else{
        return false;
    }
}

void GameOverLayer::gameOverDone(){
    CCDirector::sharedDirector()->replaceScene(HelloWorld::scene());
}

GameOverLayer::~GameOverLayer(){
    if (_label){
        _label->release();
        _label = NULL;
    }
}



HelloWorldScene.h:
protected:
   int _projectilesDestroyed;    




And Initialize it in HelloWorld::HelloWorld(),

_projectilesDestroyed = 0;



After removeChild(target) in the targetsToDelete for loop of HelloWorld::update(), add the codes below to check the win condition.

_projectilesDestroyed++;                       
if (_projectilesDestroyed > 30){
  GameOverScene *gameOverScene = GameOverScene::node();
  gameOverScene->getLayer()->getLabel()->setString("You Win!");
  CCDirector::sharedDirector()->replaceScene(gameOverScene);
}


Add the codes below to check the failure condition in the “if (sprite->getTag() == 1)” conditional of spriteMoveFinished(),

GameOverScene *gameOverScene = GameOverScene::node();
gameOverScene->getLayer()->getLabel()->setString("You Lose :[");
CCDirector::sharedDirector()->replaceScene(gameOverScene);    


最好在android.mk文件中加入
LOCAL_SRC_FILES := AppDelegate.cpp \
                   HelloWorldScene.cpp \
                   GameOverScene.cpp



  • 大小: 150.6 KB
分享到:
评论

相关推荐

    cocos2d-x游戏源码

    Cocos2d-x是一款强大的开源游戏开发框架,主要用于构建2D游戏、演示程序和其他图形交互应用。它基于C++,同时提供了Lua和JavaScript的绑定,使得开发者可以选择自己熟悉的语言进行游戏开发。本资源是一个基于cocos2d...

    cocos2d 切水果游戏

    【cocos2d 切水果游戏】是一款基于cocos2d和box2d游戏引擎开发的手机游戏,模仿了流行的“切西瓜”玩法。在这个游戏中,玩家需要通过滑动屏幕来切割屏幕上飞过的各种水果,尽可能多地得分,同时避免切割到炸弹等负面...

    Cocos2d Android的小游戏打飞机

    以上就是使用Cocos2d Android开发“打飞机”小游戏涉及的一些核心知识点。通过深入理解和实践这些概念,你将能够创建出具有专业品质的2D游戏。当然,实际项目可能还需要根据需求涉及更多细节,如UI设计、网络对战...

    精选_基于Cocos2d-x实现的RunOrDie小游戏_源码打包

    《RunOrDie小游戏基于Cocos2d-x的实现详解》 Cocos2d-x是一款开源的游戏开发框架,它采用C++作为主要编程语言,同时支持Lua和JavaScript等脚本语言,使得开发者能够快速构建高性能的2D游戏。本文将深入探讨如何使用...

    cocos2d躲便便小游戏-初学者

    总的来说,"躲便便"小游戏是学习Cocos2d的绝佳起点,它将带你熟悉2D游戏开发的基本流程,并帮助你掌握这个强大框架的一些核心特性。通过这个项目,你可以锻炼自己的编程技巧,为未来开发更复杂的游戏打下坚实基础。

    cocos2d-x-cocos2d-x-2.2.2.zip

    这个压缩包“cocos2d-x-cocos2d-x-2.2.2.zip”包含了cocos2d-x 的2.2.2版本,该版本是cocos2d-x发展中的一个重要里程碑,它提供了许多改进和优化,使得开发者能够更加高效地创建2D游戏和应用。 在cocos2d-x 2.2.2中...

    cocos2d-x小游戏小狗快跑源码

    《cocos2d-x小游戏小狗快跑源码详解》 cocos2d-x是一个开源的、跨平台的游戏开发框架,广泛应用于2D游戏的开发。它基于C++,支持多种编程语言,包括JavaScript和Lua,使得开发者能够在iOS、Android、Windows等多个...

    Cocos2d-x 三消游戏源码

    Cocos2d-x是一款流行的开源跨平台2D游戏开发框架,用C++编写,支持iOS、Android、Windows等多平台。本源码分享是基于Cocos2d-x 3.8版本实现的一个三消游戏,三消游戏,又称消消乐,是一种常见的休闲益智游戏类型,...

    cocos2d-x3.9 数独小游戏

    【cocos2d-x3.9 数独小游戏】是一个基于cocos2d-x 3.9版本开发的经典数独游戏源代码,适用于初学者进行学习和实践。cocos2d-x是一个跨平台的2D游戏开发框架,它采用C++语言,支持多种操作系统,如iOS、Android、...

    别踩白块游戏cocos2d-x3.x实现

    Cocos2d-x是一个广泛使用的开源游戏引擎,尤其适合2D游戏开发,它支持多种编程语言,包括C++、Lua和JavaScript。 首先,我们需要了解Cocos2d-x的基本架构。Cocos2d-x包含了一系列的类,如Scene(场景)、Layer(层...

    Cocos2d-x游戏引擎实战开发炸弹超人

    《Cocos2d-x游戏引擎实战开发炸弹超人》是一个基于Cocos2d-x框架的2D游戏开发教程,旨在帮助开发者深入理解并熟练运用这一强大的游戏引擎。Cocos2d-x是一个开源、跨平台的2D游戏开发工具,它支持iOS、Android、...

    cocos2d-x小游戏Don'tCross可执行文件

    《Cocos2d-x小游戏Don'tCross可执行文件详解》 Cocos2d-x是一款开源的游戏开发框架,它基于C++,广泛应用于2D游戏、交互式图书、演示和其他图形密集型应用的开发。Don'tCross是利用Cocos2d-x引擎开发的一款小游戏,...

    用Cocos2d-x引擎c++语言开发的小游戏 (初学者 , 大学课程设计).zip

    用Cocos2d-x引擎c++语言开发的小游戏 (初学者 , 大学课程设计).zip 用Cocos2d-x引擎c++语言开发的小游戏 (初学者 , 大学课程设计).zip 适合学习/练手、毕业设计、课程设计、期末/期中/大作业、工程实训、相关项目/...

    cocos2d-x 游戏小demo

    【cocos2d-x 游戏小demo】是一款基于cocos2d-x框架开发的简易游戏示例,主要展示了如何运用这个强大的2D游戏引擎来创建一个基础的魔塔类游戏。cocos2d-x是一个跨平台的游戏开发库,支持iOS、Android、Windows等多...

    cocos2d-x源码素材

    首先,cocos2d-x是一个跨平台的2D游戏开发框架,基于C++编写,广泛应用于iOS、Android、Windows等多个操作系统。它的强大之处在于提供了一整套易用的API,简化了游戏开发过程,使得开发者能够专注于游戏逻辑而不是...

    Cocos2d-X 3D跑酷小游戏

    这个压缩包中的“Cocos2d-X 3D跑酷小游戏”提供了游戏的完整代码示例和游戏运行的视频,对于学习Cocos2d-X以及3D游戏开发的开发者来说,是一个宝贵的资源。 Cocos2d-X基于C++,同时也支持Lua和JavaScript,使其具有...

    cocos2d-iphone-2.0.tar.gz

    Cocos2d-iPhone是一个广泛使用的2D游戏开发框架,专为iOS设备(如iPhone和iPad)设计。这个开源项目让开发者能够轻松地创建高质量的游戏、应用和交互式内容,而无需深入理解底层图形和物理编程。"cocos2d-iphone-2.0...

    小鸟闯管道CocosCreator 2D小游戏

    在这个名为“小鸟闯管道”的2D小游戏项目中,我们能够深入理解CocosCreator的核心功能,包括其丰富的组件系统、JavaScript脚本的运用以及2D游戏设计的基本理念。 首先,CocosCreator 2.3.1版本引入了许多优化和新...

    cocos2d初级教程-Cocos2d SimpleGame源码

    Ray Wenderlich的《Cocos2d SimpleGame》,被认为是cocos2d的初学者最好的教程,这本书被Cocos2D-X团队从objective-c转化到了c++版,并发布在了github上。在此感谢Ray Wenderlich的慷慨相助。 源代码是在cocos2d-x ...

    使用cocos2d-x-2.0-2.0.4开发的简单跨平台益智类魔塔小游戏

    《使用cocos2d-x-2.0-2.0.4开发的简单跨平台益智类魔塔小游戏》 cocos2d-x是一个开源的游戏开发框架,它基于C++,支持多平台,包括iOS、Android、Windows以及Mac OS等。在本项目中,开发者利用cocos2d-x 2.0.4版本...

Global site tag (gtag.js) - Google Analytics