【cocos2d-x游戏开发】 从零单排之(四)

   这篇文章给主角增加了速度的实现

我们从上一章降到的的玩家点击事件回调处开始,通过给Player增加一个 responseTouchControl 方法来做出响应
void SceneGame::clickCallback(cocos2d::Touch*)
{
	m_player->responseTouchControl();
}

下面对照代码,介绍一下Player增加了哪些功能
#pragma once
#include "cocos2d.h"
#define INIT_SPEEDX 400
#define INIT_JUMP_HEIGHT 200
#define GRAVITY -1400
#define GROUND_Y 110

class Player:public cocos2d::Sprite
{
public:
	Player(float posx,float posy);
	virtual ~Player();
	virtual bool init();
	void update(float dt);
	//运动状态
	enum class STATE
	{
		STATE_RUN,
		STATE_JUMP
	};
	//响应玩家控制
	void responseTouchControl();
	static Player* create(float posx,float posy);
private:
	float timelast;
	int m_currentFrame;
	float m_x;
	float m_y;
	float m_speedY;
	float m_speedX;
	STATE m_state;
	void updateViewByCurrentFrame();
};
void Player::update(float dt)
{
	Sprite::update(dt);

	timelast += dt;
	//play movie
	if(timelast > 0.2f)
	{
		timelast -= 0.2f;

		++m_currentFrame;
		if(m_currentFrame > 3)
		{
			m_currentFrame = 1;
		}

		updateViewByCurrentFrame();
	}
	//确定速度
	if(m_state == Player::STATE::STATE_JUMP)
	{
		m_speedY += GRAVITY*dt;
	}
	//位置变化
	float targetX = m_x + m_speedX*dt;
	float targetY = m_y + m_speedY*dt;
	//判断落地
	if(m_state == Player::STATE::STATE_JUMP)
	{
		if(targetY <= GROUND_Y)
		{
			targetY = GROUND_Y;
			m_speedY = 0;
			m_state = Player::STATE::STATE_RUN;
		}
	}

	m_x = targetX;
	m_y = targetY;

	GameCamera* camera = GameCamera::getInstance();
	const Rect trect = camera->getRect();
	this->setPosition(targetX - trect.origin.x,targetY - trect.origin.y);
}

//响应触摸事件
void Player::responseTouchControl()
{
	if(m_state == Player::STATE::STATE_RUN)
	{
		m_state = Player::STATE::STATE_JUMP;
		
		//计算起跳速度
		double time = std::pow(2.0f * INIT_JUMP_HEIGHT / (-GRAVITY),0.5);
		m_speedY = time * -GRAVITY;
	}
}

首先,为了修改调试方便,增加了一些常量(游戏中的数据最好都提到外部xml或json配置中去,这样方便修改和管理)
#define INIT_SPEEDX 400   //x方向初速度(像素/s)
#define INIT_JUMP_HEIGHT 200   //跳跃最大高度
#define GRAVITY -1400   //重力
#define GROUND_Y 110    //地面高度

增加了运动状态,用来区分player的跳跃状态和奔跑状态,也为以后增加其他状态做好准备。enum class  和 enum的具体区别,可以参考 这里
public:
enum class STATE
{
STATE_RUN,
STATE_JUMP
};
private:STATE m_state;

关于初速度的设定和计算
        在游戏里,我们把速度定义成单位时间内运动的像素(pixels / s)。但因为游戏的player的update方法,是每隔一个时间间隔调用一次(不一定是一秒),所以在计算速度的时候,后面都要乘上间隔时间 dt
起跳速度的计算:之前定义的常量里定义了跳跃的高度,然后在起跳的时候,通过距离和时间公式,计算出到从跳跃的最高点自由落体的时间 S = Vt + 0.5 * a *t^2 ,落地速度就可以算出来了 v = a * t ;这里的a只有重力一个影响因素,所以直接用正的重力值代入。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值