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.

原文地址:https://www.cnblogs.com/aosting/p/3520943.html