chapter7 实验手册文档格式.docx
- 文档编号:16620228
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:37
- 大小:566.80KB
chapter7 实验手册文档格式.docx
《chapter7 实验手册文档格式.docx》由会员分享,可在线阅读,更多相关《chapter7 实验手册文档格式.docx(37页珍藏版)》请在冰豆网上搜索。
图6-9添加动画帧
在时间轴上做如下操作:
a.鼠标左键点击选中第15帧关键帧,此时把p1移动到C点,p2移动到A点,p3移动到E点;
b.然后再选中时间轴第30帧关键帧,此时把p1移动到D点,p2移动到B点,p3移动到F点;
到此动画设定完成,可以点击动画帧区播放键预览动画。
4.导出动画
选择文件->
导出项目使用默认参数即可导出动画,打开发布目录,文件结构如下图,需要使用时需要将所有文件放在同一路径。
(二)本实例的骨骼动画
本例使用的素材资源来源于cocos2d-x官方提供的cpptest中的资源,打开引擎中cpptest下的Resources目录可以找到
人物现有的动作可以不经过修改就能满足项目的需求,但是需要在一些动作的末尾添加帧事件:
1.在loading动作的最后一帧,选中该帧,在右侧属性栏的帧事件写入loading_end
2.相同方法在攻击动画最后一帧加上帧事件:
attack_end
以同样的方式对怪物也做相同的处理。
(三)程序的实现
头文件包含及常量的定义放在单独的文件config_set.h内:
#ifndef__CONFIG_SET_H__
#define__CONFIG_SET_H__
#include"
cocos2d.h"
cocostudio/CocoStudio.h"
ui/CocosGUI.h"
USING_NS_CC;
usingnamespacecocos2d;
usingnamespacecocostudio;
usingnamespacecocos2d:
:
ui;
enumState
{
STAND,
MOVELEFT,
MOVERIGHT,
ATTACK,
DEATH,
SMITTEN
};
#endif
封装英雄类:
Hero
英雄类的内部实现需要注意的地方是处理受到攻击后播放受攻击动画的末尾,应该触发帧事件,然后让英雄回归到正常的待机状态;
同样,在英雄跑动结束时,也应该回归正常的待机状态,具体实现:
#ifndef__HERO_H__//Hero.h
#define__HERO_H__
config_set.h"
classHero:
publicSprite
public:
Hero();
~Hero();
staticHero*create(Vec2position);
voidupdate(floatdelta);
voidplay(Statestate);
voidhurt();
//被击中
voidshowBloodTips(ints);
//显示扣血数字
voidflyend(Label*label);
//扣血数字移动并消失
virtualboolinit(Vec2position);
voidonFrameEvent(cocostudio:
Bone*bone,conststd:
string&
evt,intoriginFrameIndex,intcurrentFrameIndex);
//setandget
Armature*getArmature(){returnm_armature;
}
boolisAttack(){returnm_isAttack;
voidsetAttack(boolattack){m_isAttack=attack;
intgetLife(){returnm_life;
voidsetLife(intlife){m_life=life;
boolisDeath(){returnm_isdead;
intgetMaxLife(){returnm_max_life;
private:
Armature*m_armature;
Statem_state;
boolm_isrunning;
boolm_isdead;
boolm_isAttack;
//是否正在攻击
boolm_ishurt;
//被击状态
intm_life;
//生命值
intm_max_life;
//最大生命值
实现文件为Hero.cpp
Hero.h"
Hero:
Hero()
m_isrunning=false;
m_isdead=false;
m_isAttack=false;
m_ishurt=false;
m_max_life=500;
m_life=m_max_life;
}
~Hero()
Hero*Hero:
create(Vec2position)
Hero*pRet=new(std:
nothrow)Hero();
if(pRet&
&
pRet->
init(position))
{
pRet->
autorelease();
returnpRet;
}else
deletepRet;
pRet=NULL;
returnNULL;
boolHero:
init(Vec2position)
if(!
Sprite:
init())
returnfalse;
ArmatureDataManager:
getInstance()->
addArmatureFileInfo("
Chapter06/AnimationScene/animation/Hero/Hero.ExportJson"
);
m_armature=Armature:
create("
Hero"
if(m_armature==NULL)
CCLOG("
heroloaderror!
"
m_armature->
setPosition(Vec2:
ZERO);
getAnimation()->
play("
loading"
setFrameEventCallFunc(CC_CALLBACK_0(Hero:
onFrameEvent,this,std:
placeholders:
_1,std:
_2,std:
_3,std:
_4));
this->
addChild(m_armature);
setPosition(position);
scheduleUpdate();
returntrue;
voidHero:
update(floatdelta)
if(m_life<
=0)
play(DEATH);
switch(m_state)
caseSTAND:
if((m_isrunning==true)&
(m_isdead==false)&
(m_ishurt==false))//跑动结束只执行一次loading动画,避免点击attack动作无法播放
{
m_armature->
m_isrunning=false;
}
break;
caseMOVELEFT:
if((this->
getPositionX()>
0)&
(m_ishurt==false)&
(m_isAttack==false))
if(m_isrunning==false)
{
m_armature->
run"
m_isrunning=true;
}
if(m_armature->
getScaleX()!
=-1)
setScaleX(-1);
this->
setPositionX(this->
getPositionX()-4);
caseMOVERIGHT:
if((m_isAttack==false)&
(this->
getPositionX()<
Director:
getVisibleSize().width)&
(m_ishurt==false))
if(m_isrunning==false)//m_isrunning控制变量防止update时不断执行play("
)则永远显示run动画第一帧
=1.0)
setScaleX
(1);
getPositionX()+4);
caseATTACK:
if(m_isdead==false&
m_isAttack=true;
attack"
caseDEATH:
if(m_isdead==false)
m_isdead=true;
death"
caseSMITTEN:
if(m_ishurt==true)
smitten"
m_ishurt=false;
onFrameEvent(cocostudio:
evt,intoriginFrameIndex,intcurrentFrameIndex)
if(strcmp(evt.c_str(),"
attack_end"
)==0)
m_armature->
m_isAttack=false;
smitten_end"
play(Statestate)
if(state==SMITTEN)//控制被击中时颤抖动画只播放一次
m_ishurt=true;
m_state=state;
hurt()
//根据基础伤害造成随机伤害
showBloodTips(30);
play(SMITTEN);
//显示扣血
showBloodTips(ints)
inthitCount=1;
inthitRand=rand()%10;
if(hitRand>
3&
hitRand<
8)
hitCount=2;
}elseif(hitRand>
7)
hitCount=3;
for(inti=0;
i<
hitCount;
i++)
inthurt_blood=s+rand()%8;
setLife(m_life-hurt_blood);
//扣血
autolabel=Label:
createWithBMFont("
fonts/futura-48.fnt"
StringUtils:
format("
-%d"
hurt_blood));
label->
setColor(Color3B:
RED);
this->
addChild(label,5);
setPosition(Vec2(0,0)+Vec2(20+rand()%80,10+rand()%80));
runAction(Sequence:
create(
MoveBy:
create(0.7f,Vec2(0,30)),
CallFunc:
create(CC_CALLBACK_0(Hero:
flyend,this,label)),
NULL
));
flyend(Label*label)
label->
setVisible(false);
removeFromParent();
接下来怪物类的封装和英雄类类似:
#ifndef__ENEMY_H__//Ememy.h
#define__ENEMY_H__
classEnemy:
Enemy();
~Enemy();
staticEnemy*create(Vec2position);
//播放动画
//人物动画状态
//是否正在跑动
//是否死亡
//攻击状态
实现文件为:
Enemy.h"
//Emeny.cpp
Enemy:
Enemy()
~Enemy()
Enemy*Enemy:
Enemy*pRet=new(std:
nothrow)Enemy();
boolEnemy:
Chapter06/AnimationScene/animation/tauren/tauren.ExportJson"
tauren"
taurenloaderror!
setFrameEventCallFunc(CC_CALLBACK_0(Enemy:
voidEnemy:
(m_isrunning==true)&
(m_isdead==false)&
=1)
getPositionX()-3);
getVisibleSize(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- chapter7 实验手册 实验 手册