gpt4 book ai didi

C++如何使各个方向的速度相等?

转载 作者:太空狗 更新时间:2023-10-29 23:05:51 25 4
gpt4 key购买 nike

我觉得这是一个很难表达的问题,所以我在这张图上做了说明(我在 C++ 中使用 SDL)。每个方 block 代表屏幕上的一个像素,我希望红色像素无论方向如何都以相同的速度移动。

如果速度为 8 像素/秒,则 1 秒后:

  • 如果用户输入正确或向下,像素将到达标记为蓝色的位置
  • 如果用户输入正确且向下,它将到达标记为绿色的位置。

pixels

然而,在这两种情况下,像素都偏移了 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, &currentClip);
}

所以这是我的问题,我是编程游戏的新手,我不确定这是否是进行运动的正确方法。这似乎有点低效,我是否应该尝试根据以下内容推断位置一个角度和斜边的长度呢?我不太了解三角函数,但我当然很想学习。

最佳答案

将逻辑位置与显示位置分开。

逻辑位置可能需要使用浮点坐标,您会将它们四舍五入为显示位置的整数像素坐标。如果你想平滑运动,你甚至可以用它来消除锯齿。

所以:

  • right 将有逻辑单位 vector (x,y)=(1.0,0.0)
  • down 将具有逻辑单位 vector (x,y)=(0.0,-1.0)
  • down+right 将有逻辑单位 vector (x,y)=(1/sqrt(2),-1/sqrt(2))

每 1/8 秒,将单位 vector 添加到当前逻辑位置,并选择要绘制的像素。显然,您可以选择不同的单位和更新频率,但这会给出您要求的数字。

关于C++如何使各个方向的速度相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17698113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com