懒骨头(http://blog.csdn.net/iamlazybone QQ:124774397 )
旁边一直在放着台湾的金马奖
将了一群人在做喜欢的事情努力拼搏最后实至名归的故事
骨头也希望有天能优秀到被自己钦佩的人所关注
继续吧
来自游戏开发基友群听雨分享的例子,一个横版过关游戏,有带简单ai的敌人,有横版的地图,有操控摇杆,主角的攻击效果,有很多新鲜的东西,开搞!
很多东西看起来简单,真要自己写就觉得无从下手了,比如主角动画。
Hero.cpp
这个主角在静止和走动时都有动画:
CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();
CCSprite::createWithSpriteFrameName("hero_idle_00.png");
this->retain();
char str[64] = {0};
CCArray* animFrames = new CCArray(10);
//Idle
for (int i = 0; i < 6; ++i) {
sprintf(str, "hero_idle_%02d.png", i);
CCSpriteFrame* frame = cache->spriteFrameByName(str);
animFrames->addObject(frame);
}
CCAnimation* idleAnimation = CCAnimation::createWithSpriteFrames(animFrames,1.0f/12.0f);
mIdleAction =
CCRepeatForever::create(CCAnimate::create(idleAnimation));
mIdleAction->retain();
先用动画的第一帧初始化一个CCSprite,然后根据帧数创建一个CCArray。
然后一个循环把 CCSpriteFrame 添加到刚才的CCArray,接着使用CCArray初始化一个CCAnimation,
然后用CCAnimation初始化 CCRepeatForever 。看起来好啰嗦。
Hero.cpp这个主角类就是一些初始化,只在构造函数里,初始化各种动画:站立,跑步,出拳,受伤等。
类似的,Robot.cpp也是只有初始化。
这两个精灵的其他东西都在ActionSprite.cpp里:
ActionSprite.cpp类:
public :
ActionSprite();
virtual bool init();
void idle();
void attack();
void hurtWithDamage(float damage);
void knockout();
void walkWithDirection(CCPoint direction);
virtual void update(float dt);
//protected :
CCAction* mIdleAction;
CCAction* mAttackAction;
CCAction* mWalkAction;
CCAction* mHurtAction;
CCAction* mKnockedOutAction;
ActionState mActionState;
float mWalkSpeed;
float mHitPoints;
float mDamage;
CCPoint mVelocity;
CCPoint mDesiredPosition;
float mCenterToSide;
float mCenterToBottom;
BoundingBox mHitBox;
BoundingBox mAttackBox;
BoundingBox createBoundingBoxWithOrigin(CCPoint origin, CCSize size);
void transformBoxes();
void setPosition(const CCPoint& pos);
方法包括:站立、受伤、行走、被击毙方法等,还有这几个动作相关的CCAction。
属性有:行走速度,攻击,生命。还有速度,目的地,
还有几个矩形,用来判断攻击。
其中的行走方法:
void ActionSprite::walkWithDirection(CCPoint direction)
{
if (mActionState == kActionStateIdle) {
this->stopAllActions();
this->runAction(mWalkAction);
mActionState = kActionStateWalk;
}
if (mActionState == kActionStateWalk) {
mVelocity =
ccp(direction.x * mWalkSpeed, direction.y * mWalkSpeed);
}
if (mVelocity.x >= 0)
//this->setScaleX(1.0f);
this->setFlipX(false);
else
//this->setScaleX(-1.0f);
this->setFlipX(true);
}
如果是站立状态,首先停止所有动作,然后开始行走动作,并把标记位改为行走(kActionStateWalk)
并且计算速度,根据速度的正负值来确定是否水平翻转,这是个横版过关游戏,行走只有两个状态。
受伤方法:
void ActionSprite::hurtWithDamage(float damage)
{
if (mActionState != kActionStateKnockedOut) {
this->stopAllActions();
this->runAction(mHurtAction);
mActionState = kActionStateHurt;
mHitPoints -= damage;
if (mHitPoints <= 0.0f) {
this->knockout();
}
}
}
如果非死亡状态,停止其他动画,开始受伤动画,改状态,减HP,如果HP<0,宣布死亡。
一个比较难理解的方法:
void ActionSprite::transformBoxes()
{
float xfactor = (this->isFlipX() ? -1 : 1);
float xfactor2 = (this->isFlipX() ? 1 : 0);
float yfactor = (this->isFlipY() ? -1 : 1);
float yfactor2 = (this->isFlipY() ? 1 : 0);
mHitBox.actual.origin = ccpAdd(this->getPosition(),
ccp(mHitBox.original.origin.x * xfactor -
mHitBox.original.size.width * xfactor2,
mHitBox.original.origin.y * yfactor -
mHitBox.original.size.height * yfactor2));
mHitBox.actual.size = CCSizeMake(
mHitBox.original.size.width,
mHitBox.original.size.height);
mAttackBox.actual.origin = ccpAdd(this->getPosition(),
ccp(mAttackBox.original.origin.x * xfactor -
mAttackBox.original.size.width * xfactor2,
mAttackBox.original.origin.y * yfactor -
mAttackBox.original.size.height * yfactor2));
mAttackBox.actual.size = CCSizeMake(
mAttackBox.original.size.width,
mAttackBox.original.size.height);
}
更新矩形:根据精灵的方向,来更改受伤矩形,攻击矩形。
如下图,当主角朝前或朝后时,攻击范围的改变如下,上面的方法就是来处理这个问题的。
晚安,明天继续!
------------------- 飞船起飞--------------------
Cocos2dx游戏开发系列笔记13:一个横版拳击游戏Demo-中
Cocos2dx游戏开发系列笔记12:一个横版拳击游戏Demo-上
Cocos2dx游戏开发系列笔记11:解 刨《战神传说》完结篇
Cocos2dx游戏开发系列笔记9:android手机上运行《战神传说》,并解决横竖屏即分辨率自适应问题
Cocos2dx游戏开发系列笔记8:开搞一个射击游戏《战神传说》//就个打飞机的
Cocos2dx游戏开发系列笔记7:一个简单的跑酷游戏《萝莉快跑》的消化(附下载)
Cocos2dx游戏开发系列笔记6:怎样让《萝莉快跑》的例子运行在vs和手机上
Cocos2dx游戏开发系列笔记5:继续润色《忍者飞镖射幽灵》
Cocos2dx游戏开发系列笔记4:怎样新加一个Scene类?
Cocos2dx游戏开发系列笔记3:牛刀小试->忍者飞镖射幽灵的Demo
Cocos2dx游戏开发系列笔记2:一个刚创建的cocos2dx中的demo里都有什么
Cocos2dx游戏开发系列笔记1:一个崭新的开始,cocos2dx2.2+ndkr9+Cygwin+vs2012游戏开发环境搭建
-------------------- 飞船降落--------------------
最后,骨头介绍一下陪在身边的哲哲(右边就是低调的哲哲)