zoukankan      html  css  js  c++  java
  • cocos2dx simplegame 2 添加不同的怪物

    添加不同的怪物,这个是我从其他地方实现的。

    添加Monster.h和Monster.cpp 

    开始的时候我是继承的CCSprite,但是一直出问题。在网上发现可以继承CCNode,就尝试了一下。

     1 //
     2 //  Monster.h
     3 //  cocos2d-x_simpleGame_20131104
     4 //
     5 //  Created by 张学院 on 14-1-13.
     6 //
     7 //
     8 
     9 #ifndef __cocos2d_x_simpleGame_20131104__Monster__
    10 #define __cocos2d_x_simpleGame_20131104__Monster__
    11 
    12 #include <iostream>
    13 #include "cocos2d.h"
    14 class Monster:public cocos2d::CCNode{
    15     public :
    16     int _curHp;
    17     int minMove;
    18     int maxMove;
    19     cocos2d::CCSprite * m_sprite;
    20     public :
    21     Monster();
    22     ~Monster();
    23     void bindSprite(cocos2d::CCSprite * sprite);
    24     
    25     int gethp();
    26     void sethp(int hp);
    27     int getminMove();
    28     void setminMove(int minMove);
    29     int getmaxMove();
    30     void setmaxMove(int maxMove);
    31 
    32 };
    33 class WeakAndFastMoveMonster:public Monster{
    34 
    35 public:
    36     static WeakAndFastMoveMonster * monster();
    37 };
    38 class StrongAndSlowMonster:public Monster{
    39 public :
    40     
    41     static StrongAndSlowMonster * monster();
    42 
    43     
    44 };
    45 #endif /* defined(__cocos2d_x_simpleGame_20131104__Monster__) */
     1 //
     2 //  Monster.cpp
     3 //  cocos2d-x_simpleGame_20131104
     4 //
     5 //  Created by 张学院 on 14-1-13.
     6 //
     7 //
     8 
     9 #include "Monster.h"
    10 Monster::Monster(){
    11     _curHp=0;
    12     minMove=0;
    13     maxMove=0;
    14     m_sprite=NULL;
    15 }
    16 
    17 Monster::~Monster(){
    18 
    19 }
    20 void Monster::bindSprite(cocos2d::CCSprite * sprite){
    21     m_sprite=sprite;
    22     this->addChild(m_sprite);
    23 }
    24 void Monster::sethp(int hp){
    25     this->_curHp=hp;
    26     
    27 }
    28 void Monster::setmaxMove(int maxMove){
    29     this->maxMove=maxMove;
    30     
    31 }
    32 void Monster::setminMove(int minMove){
    33     this->minMove=minMove;
    34     
    35 }
    36 
    37 int Monster::gethp(){return  _curHp;
    38 }
    39 
    40 int Monster::getmaxMove(){ return maxMove;}
    41 int Monster::getminMove(){return minMove;}
    42 
    43 WeakAndFastMoveMonster * WeakAndFastMoveMonster::monster(){
    44     WeakAndFastMoveMonster * target= new WeakAndFastMoveMonster();
    45    
    46     target->bindSprite(cocos2d::CCSprite::create("Target.png"));
    47    
    48         target->sethp(1);
    49         target->setmaxMove(5);
    50         target->setminMove(3);
    51      
    52     
    53     
    54     return target;
    55 }
    56 StrongAndSlowMonster * StrongAndSlowMonster::monster(){
    57     StrongAndSlowMonster * target= new StrongAndSlowMonster();
    58  
    59     target->bindSprite(cocos2d::CCSprite::create("Target2.png"));
    60         target->sethp(3);
    61         target->setmaxMove(6);
    62         target->setminMove(12);
    63         
    64     
    65     return target;
    66 }

    修改HelloWorldScene.cpp 中的addTarget方法

     1 void HelloWorld::addTarget(){
     2     
     3     //CCSprite *target= CCSprite::create("Target.png",CCRectMake(0, 0, 27, 40) );
     4     //Monster *monster;
     5     Monster *target;
     6     
     7     if((rand()%2==0)){
     8         target=WeakAndFastMoveMonster::monster();
     9     }else{
    10         target=StrongAndSlowMonster::monster();
    11     }
    12 
    13     target->setTag(1);
    14     _targets->addObject(target);
    15     
    16     CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    17     
    18     
    19     int minY= target ->getContentSize().height/2;
    20     int maxY=winSize.height-target->getContentSize().height/2;
    21     int rangeY= maxY-minY;
    22     //随机生成y坐标
    23     int actualY = (rand() %rangeY)+minY;
    24     target->setPosition(ccp(winSize.width+(target->getContentSize().width/2),actualY));
    25     this->addChild(target);
    26     
    27     int minDuration = target->getminMove();
    28     int maxDuration = target->getmaxMove();
    29     // Determine speed of the target
    30 //       int minDuration = (int)3.0;
    31 //       int maxDuration = (int)5.0;
    32        int rangeDuration = maxDuration - minDuration;
    33        // srand( TimGetTicks() );
    34     //随机生产移动速度。
    35     int actualDuration = ( rand() % rangeDuration )
    36                                         + minDuration;
    37     
    38      // Create the actions
    39     
    40       CCFiniteTimeAction* actionMove =
    41            CCMoveTo::create( (float)actualDuration,
    42                                ccp(0 - target->getContentSize().width/2, actualY) );
    43     // 增加回掉函数,收回内存
    44        CCFiniteTimeAction* actionMoveDone =
    45             CCCallFuncN::create( this,
    46                          callfuncN_selector(HelloWorld::spriteMoveFinished));
    47     
    48     CCLOG("before runAction");
    49     //target执行动画
    50     target->runAction( CCSequence::create(actionMove,actionMoveDone, NULL) );
    51     
    52     CCLOG("after runAction");
    53 
    54 }

    修改碰撞函数update方法

     1 void HelloWorld::update(float dt){
     2     monsterHit=false;
     3     CCArray *projectilesToDelete = new CCArray;
     4     CCArray* targetsToDelete =new CCArray;
     5     CCObject* it = NULL;
     6     CCObject* jt = NULL;
     7     
     8       CCARRAY_FOREACH(_projectiles, it)
     9       {
    10             CCSprite *projectile = dynamic_cast<CCSprite*>(it);
    11           
    12             CCRect projectileRect = CCRectMake(
    13                 projectile->getPosition().x - (projectile->getContentSize().width/2),
    14                   projectile->getPosition().y - (projectile->getContentSize().height/2),
    15                   projectile->getContentSize().width,
    16                   projectile->getContentSize().height);
    17  
    18              CCARRAY_FOREACH(_targets, jt)
    19            {
    20                 Monster *target = dynamic_cast<Monster*>(jt);
    21                  CCRect targetRect = CCRectMake(
    22                                            target->getPosition().x - (target->getContentSize().width/2),
    23                                            target->getPosition().y - (target->getContentSize().height/2),
    24                                             target->getContentSize().width,
    25                                              target->getContentSize().height);
    26             
    27                       if (projectileRect.intersectsRect(targetRect))
    28                          {
    29                                  // targetsToDelete->addObject(target);
    30                              monsterHit=true;
    31                              target->_curHp--;
    32                              if(target->gethp()<=0){
    33                              targetsToDelete->addObject(target);
    34                              }
    35                              
    36                              projectilesToDelete->addObject(projectile);
    37                              break;
    38                         }
    39                    }
    40             }
    41     
    42         CCARRAY_FOREACH(targetsToDelete, jt)
    43         {
    44               Monster *target = dynamic_cast<Monster*>(jt);
    45             
    46                 _targets->removeObject(target);
    47                 _projectilesDestroyed++;
    48             if (_projectilesDestroyed >= 20)
    49                 {
    50                    GameOverScene *gameOverScene = GameOverScene::create();
    51                   gameOverScene->getLayer()->getLabel()->setString("You Win!");
    52                    CCDirector::sharedDirector()->replaceScene(gameOverScene);
    53                   }
    54                this->removeChild(target, true);
    55         }
    56    
    57        CCARRAY_FOREACH(projectilesToDelete, it)
    58      {
    59          
    60             CCSprite* projectile = dynamic_cast<CCSprite*>(it);
    61                _projectiles->removeObject(projectile);
    62                this->removeChild(projectile, true);
    63       
    64          }
    65  
    66        projectilesToDelete->release();
    67        targetsToDelete->release();
    68 }

    对了,在HelloWorldScene.cpp中添加了一个bool monsterHit.

  • 相关阅读:
    LeetCode15题: 寻找三数和,附完整代码
    LeetCode 11 水池蓄水问题
    分布式初探——分布式事务与两阶段提交协议
    高等数学——讲透求极限两大方法,夹逼法与换元法
    书籍推荐——一本老书,吴军老师《数学之美》
    概率统计——期望、方差与最小二乘法
    算法浅谈——递归算法与海盗分金问题
    机器学习基础——带你实战朴素贝叶斯模型文本分类
    线性代数精华——从正交向量到正交矩阵
    LeetCode10 Hard,带你实现字符串的正则匹配
  • 原文地址:https://www.cnblogs.com/aosting/p/3520943.html
Copyright © 2011-2022 走看看