Cocos2d-x扣血飘字特效用完你就消失--之游戏开发

来源:互联网 发布:赵公明 知乎 编辑:程序博客网 时间:2024/06/11 20:29

本文这里将要实现的一个功能是怪物受伤血量减少时,会出现一个扣了多少血量的数字从怪物中间飘到头顶,然后消失。然后有两种方式,一种是每次都扣同样的数字,一种是每次在一定范围内的数字随机,本文上接博主的文章www.2cto.com

 

cocos2d-x版本:2.2.5

工程环境:windows7+VS2010

打开方式:将工程放在cocos2d-x安装目录下的project文件夹下用VS打开


 

 

目录

一、自定扣血飘字特效类FlyWord

二、使用方法

三、思路总结

 

 

一、自定扣血飘字特效类FlyWord

其实这里这里就是一个CCLabelTTF的类型来执行动画CCMoveBy的一个过程

下面来看看我自己定义,头文件FlyWord.h

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef __FLYWORD_H__
#define __FLYWORD_H__
#include cocos2d.h
#include cocos-ext.h
USING_NS_CC;
USING_NS_CC_EXT;
classFlyWord: publicCCNode{
public:
    //创建文字飘动,create 和 init 是连在一起的,调用create的时候必然会调用init
    staticFlyWord* create(constchar *word,constint fontSize,CCPoint begin);
    //init方法接受3个参数,分别是飘入的字符串,字体大小,从哪里开始飘入,init方法的作用主要是初始化FloatWord内置的Label
    bool init(constchar *word,constint fontSize,CCPoint begin);
 
 
 
    //文字从下到上飘动
    voidFlying();
    //文字飘动后删除所有对象
    voidFlyend();
 
 
private:
    int_fontSize;//字体大小
    CCPoint _begin;//要添加到的怪物的中心点
    CCLabelTTF* m_plabel;//字体类型
 
};
#endif// __FLYWORD_H__
然后是实现类FlyWord.cpp

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include FlyWord.h
FlyWord* FlyWord::create(constchar *word,constint fontSize,CCPoint begin){
 
    FlyWord* ret = newFlyWord();
    //这样写更安全一些
    if(ret && ret->init(word,fontSize,begin)){
        ret->autorelease();
        returnret;
    }
    CC_SAFE_DELETE(ret);//安全删除
    returnnullptr;
}
 
bool FlyWord::init(constchar *word,constint fontSize,CCPoint begin){
    if(!CCNode::init()){
        returnfalse;
    }
    //初始化
    _begin = begin;
    m_plabel = CCLabelTTF::create(word,Marker Felt,fontSize);
 
    //设置颜色
    ccColor3B RGB;
    RGB.r=255;
    RGB.g=0;
    RGB.b=0;
    m_plabel->setColor(RGB);
 
    this->addChild(m_plabel);
    this->setPosition(ccp(begin.x,begin.y));
    //初始化完成后就开始飘字了
    Flying();
    returntrue;
}
 
//文字从下到上飘动
voidFlyWord::Flying()
{
     
    CCMoveBy* moveact=CCMoveBy::create(0.5f,CCPointMake(0,70));//0.5秒向上移动70
 
    //创建回调动作,文字飘动完后
    CCCallFunc* callFunc=CCCallFunc::create(this,callfunc_selector(FlyWord::Flyend));
    //创建连续动作
    CCActionInterval* act=CCSequence::create(moveact,callFunc,NULL);
    //setVisible(true);
    this->runAction(act);
 
 
}
voidFlyWord::Flyend()
{
    //完成之后把该对象从内存中删除掉
    this->removeAllChildrenWithCleanup(true);
    this->removeFromParentAndCleanup(true);
}
代码里都有非常详细的说明,这里我就不再说明了

 

二、使用方法

在Monster.h或Monster.cpp中添加头文件#include FlyWord.h

下面是每次随机产生10-30的一个要减少的血量,这也是游戏中比较常见的,怪物每次的受伤量可能不一样。

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//受伤动画结束
voidMonster::HurtEnd()
{
    IsHurt=false;
 
    //产生10-30一个随机掉血的量
    srand((UINT)GetCurrentTime());
    intx = rand()%30+10;
    //转成字符
    charszName[100] = {0}; 
    sprintf(szName,-%d,x);
    //怪物掉血
    Monster_xue->setCurrentProgress(Monster_xue->getCurrentProgress()-x);
 
    //扣血飘字
    FlyWord *wen_zi=FlyWord::create(szName,30,CCPointMake(0,0));//放在当前怪物的(0,0)位置,这里的(0,0)是它的中心,具体可以看看锚点
    this->addChild(wen_zi,2);
 
 
    if(Monster_xue->getCurrentProgress()==0)
    {
        //播放怪物死亡动画
        DeadAnimation(monster_dead,2,MonsterDirecton);
    }  
}
如果,想让怪物每次受伤量都一样,很简单,代码为

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//受伤动画结束
voidMonster::HurtEnd()
{
    IsHurt=false;
 
    ////产生10-30一个随机掉血的量
    //srand((UINT)GetCurrentTime());
    //int x = rand()%30+10;
    //转成字符
    charszName[100] = {0}; 
    sprintf(szName,-%d,10);
    //怪物掉血
    Monster_xue->setCurrentProgress(Monster_xue->getCurrentProgress()-10);
 
    //扣血飘字
    FlyWord *wen_zi=FlyWord::create(szName,30,CCPointMake(0,0));//放在当前怪物的(0,0)位置,这里的(0,0)是它的中心,具体可以看看锚点
    this->addChild(wen_zi,2);
 
 
    if(Monster_xue->getCurrentProgress()==0)
    {
        //播放怪物死亡动画
        DeadAnimation(monster_dead,2,MonsterDirecton);
    }  
}

 

1.10-30随机掉血。文字从下到上

加载中...
2.固定掉血,文字从下到上

加载中...

 

三、思路总结

主要是这个文字类的设计,这里我的思路的得到英雄的位置,然后CCLabelTTF对像就从英雄的中间位置开始向上移动,执行动画CCMoveBy的一个过程移动写成后它就自己释放了(removeAllChildrenWithCleanup(true)和removeFromParentAndCleanup(true);)。用完一次就扔了,然后等到怪物掉血了,再用,用完再扔,多方便~游戏开发过程中有时思路真的很重要啊!
0 0
原创粉丝点击