Cocos2dx游戏开发系列笔记12:一个横版拳击游戏Demo-上

懒骨头(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游戏开发系列笔记10:解刨《战神传说》

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游戏开发环境搭建

-------------------- 飞船降落-------------------- 

最后,骨头介绍一下陪在身边的哲哲(右边就是低调的哲哲)




 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值