C++ SDL事件-can';不要让精灵向下或向右移动
我偶然发现了一个问题,当我使用箭头键移动我的精灵时,它只会向上或向左移动,但当我尝试在屏幕上向右或向下移动它时,它根本不会移动 我尝试在事件循环中替换:“SDLK_RIGHT:”与SDLK_LEFT的情况相同,当它确实工作并且工作完美时,移动仍然向左移动,因为代码显示了它,但只要我尝试删除负数,它就不会移动 据我所知,浮动也应接受正值:/ 方法代码:C++ SDL事件-can';不要让精灵向下或向右移动,c++,events,sdl,C++,Events,Sdl,我偶然发现了一个问题,当我使用箭头键移动我的精灵时,它只会向上或向左移动,但当我尝试在屏幕上向右或向下移动它时,它根本不会移动 我尝试在事件循环中替换:“SDLK_RIGHT:”与SDLK_LEFT的情况相同,当它确实工作并且工作完美时,移动仍然向左移动,因为代码显示了它,但只要我尝试删除负数,它就不会移动 据我所知,浮动也应接受正值:/ 方法代码: // Updates the sprites position in the game void Sprite::tick( SDL_Ev
// Updates the sprites position in the game
void Sprite::tick( SDL_Event event )
{
if( event.type == SDL_KEYDOWN )
{
switch( event.key.keysym.sym )
{
case SDLK_LEFT:
{
velocityX = -0.1f;
break;
}
case SDLK_RIGHT:
{
velocityX = 0.5f;
break;
}
case SDLK_UP:
{
velocityY = -0.1f;
break;
}
case SDLK_DOWN:
{
velocityY = 0.5f;
break;
}
}
}
else if( event.type == SDL_KEYUP )
{
switch (event.key.keysym.sym)
{
case SDLK_LEFT: velocityX = 0.0f; break;
case SDLK_RIGHT: velocityX = 0.0f; break;
case SDLK_UP: velocityY = 0.0f; break;
case SDLK_DOWN: velocityY = 0.0f; break;
default: break;
}
}
if(alive)
{
setBoundingbox(x_pos, y_pos, width, height);
// if( inMidAir )
// {
// velocityX += 0.1f;
//}
x_pos += velocityX;
if( ( x_pos < 0 ) || ( x_pos + width > 870 ))
{
x_pos -= velocityX;
}
y_pos += velocityY;
if( ( y_pos < 0 ) || ( y_pos + height > 480 ) )
{
y_pos -= velocityY;
}
}// End of alive statement
}
我希望有人能明白为什么我不能随心所欲地移动如果你的
x_pos
和y_pos
是整数,那么从中减去一个小的浮点(甚至0.1f
)大致相当于减去1,因为截断后的int
实际上是四舍五入
也就是说,如果x_pos
等于100,那么100-0.1f
将计算为99.9f
,但会被截断为99
,作为int
但是,当您尝试向右移动时,会出现100+0.5f
,其计算结果为100.5f
,但会被截断回100
,作为int
这就是为什么您可以向上和向左移动(都是递减坐标),但不能向下或向右移动(递增坐标)
您需要使您的类型保持一致。1。您是否检查了如果。。。(x_位置+宽度>870)
不触发?2.你能给出x_pos
,y_pos
,velocityX
,velocityY
,get_xpos()
和get_ypos()
的定义吗?多谢了,我觉得很愚蠢,我没有看到那个简单的数学错误。。。但是它一次只移动一步有什么原因吗?例如,如果我向上按,它会向上移动一步,然后什么也没有,我必须重复向上按,它才会移动:/@sandmaster:你应该在每一帧的玩家位置上加上速度值。在向上键事件中,应使用向下键事件的反转值更改速度。确保以某种方式将其与帧时间相乘,以使移动速度独立于帧速率。@Skalli:非常感谢,我将该方法分成两个方法,一个用于处理事件,另一个用于更新位置,现在我真的需要一个fps限制hehe走得很快:)@sandmaster:这就是为什么你必须测量帧时间的原因。如果有类似于PositionX+=VelocityX*FrametimeInSeconds的内容,则对象以恒定速度移动,与帧速率无关。一个常见的陷阱是很多FPS(导致FrameTimeInSeconds变为0,这意味着没有移动)。这可以通过使用高精度定时器和小数来避免。顺便说一句:通常有一种渲染方法和一种移动方法,所以你的思路是正确的。我现在实现了一个fps计时器来阻止精灵移动太快,我发现问题是它在一段时间后“跳跃”,似乎没有加速,这很好,但当我按下键时,精灵会慢慢移动,然后立即移动屏幕的70%。我找不到代码会在哪里执行类似的操作,尝试将fps降低到1,这就是我看到它的地方。
// Game loop
while( quit == false )
{
while( SDL_PollEvent( &event ))
{
player.tick( event );
if( event.type == SDL_QUIT )
{
quit = true;
}
}
applySurface(0, 0, background, screen);
applySurface(player.get_xpos(), player.get_ypos(),
player.get_Surface(), screen);
SDL_Flip(screen);
}