我觉得这是一个很难说清楚的问题,所以我在这张图上做了说明(我在 C++ 中使用 SDL)。每个方块代表屏幕上的一个像素,我希望红色像素以相同的速度移动而不管方向。
如果速度为 8 像素/秒,则 1 秒后:
- 如果用户输入正确或向下,像素将到达标记为蓝色的位置
- 如果用户输入正确且向下,它将到达标记为绿色的位置。
然而,在这两种情况下,像素都移动了 8 个像素。红色和蓝色之间的欧几里得距离 = 8.00,红色和绿色 = 11.31。我希望像素变为黄色。
所以我试图通过声明一个恒定的速度来纠正这个问题,然后我将它除以实际位移,给我一个用于将 X 和 Y 坐标相乘并沿着轨迹返回的数字,从而限制了我的速度。
代码看起来有点像这样(我已经评论了感兴趣的领域):
float velX = 0, velY = 0, currentX, currentY;
int time = 0, speed = 300;
//Events
void handleInput(){
if( event.type == SDL_KEYDOWN ){
switch( event.key.keysym.sym ){
case SDLK_UP: {velY -= speed;} break;
case SDLK_DOWN: {velY += speed;} break;
case SDLK_LEFT: {velX -= speed;} break;
case SDLK_RIGHT: {velX += speed;} break;
}
}
else if( event.type == SDL_KEYUP ){
//do the opposite
}
}
//Logic
void move(){
//float dist = sqrt( (velX*velX) + (velY*velY) );
//
//if(dist > 0){
// velX *= speed / dist;
// velY *= speed / dist;
//}
currentX += velX * (get_delta_ticks(&time) / 1000.f);
currentY += velY * (get_delta_ticks(&time) / 1000.f);
set_delta_ticks(&time);
}
//Render
void Player::render(){
apply_surface(currentX, currentY, spriteSheet, screen, ¤tClip);
}
所以这是我的问题,我是编程游戏的新手,我不确定这是否是进行运动的正确方式。在方式上似乎有点低效,我是否应该尝试根据角度推断位置和而是斜边的长度?我对三角学不太了解,但我当然很想学习。