这篇文章给主角增加了速度的实现
我们从上一章降到的的玩家点击事件回调处开始,通过给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 //地面高度
#define INIT_JUMP_HEIGHT 200 //跳跃最大高度
#define GRAVITY -1400 //重力
#define GROUND_Y 110 //地面高度
增加了运动状态,用来区分player的跳跃状态和奔跑状态,也为以后增加其他状态做好准备。enum class 和 enum的具体区别,可以参考
这里
public:
enum class STATE
{
STATE_RUN,
STATE_JUMP
};
{
STATE_RUN,
STATE_JUMP
};
private:STATE m_state;
关于初速度的设定和计算
在游戏里,我们把速度定义成单位时间内运动的像素(pixels / s)。但因为游戏的player的update方法,是每隔一个时间间隔调用一次(不一定是一秒),所以在计算速度的时候,后面都要乘上间隔时间
dt。
起跳速度的计算:之前定义的常量里定义了跳跃的高度,然后在起跳的时候,通过距离和时间公式,计算出到从跳跃的最高点自由落体的时间 S = Vt + 0.5 * a *t^2 ,落地速度就可以算出来了 v = a * t ;这里的a只有重力一个影响因素,所以直接用正的重力值代入。