nor*_*108 1 c++ mouse events sdl visual-c++
最近我一直在尝试使用SDL编写我自己的游戏(Space Invaders的克隆),但是我遇到了一些问题...我有2个事件,一个是我的计时器发出的,我用它来绘制移动的敌舰.第二个事件是我用来移动我的船的键盘事件.当我开始游戏时,敌舰开始完全按照我的预期移动,但如果我按下键或移动鼠标,它们移动得更慢.移动我的船时遇到同样的问题,如果我试图移动鼠标,帧速率会慢下来.我的事件循环:
while(!exit)
{
while(SDL_PollEvent(&event));
{
if(event.type == SDL_QUIT) exit=true;
if(event.type == SDL_KEYDOWN)
{
switch(event.key.keysym.sym)
{
case SDLK_LEFT:
pship.move(pship.getPosition().x - 1, pship.getPosition().y);
break;
case SDLK_RIGHT:
pship.move(pship.getPosition().x + 1, pship.getPosition().y);
break;
}
}
if(event.type == SDL_USEREVENT)
{
switch(event.user.code)
{
case 1:
static int xOffset, yOffset;
xOffset++;
yOffset++;
drawEnemyShips(eship,xOffset,yOffset);
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我使用Visual c + + + 2010 Express和SDL 1.2.15
while(SDL_PollEvent(&event));
Run Code Online (Sandbox Code Playgroud)
你绝对不希望;那里!你拥有它的方式,你正在吃事件.如果您收到活动,请SDL_PollEvent返回一个活动,SDL_PollEvent然后再次致电.如果没有事件,你就会突破while循环并处理它.但如果有第二个事件,你永远不会处理第一个事件.
但无论如何,一个旋转的轮询循环被打破了.这就像那个孩子每分钟都在问"我们在哪里"而且不让父母开车.使用SDL_WaitEvent等待的事件,而不是纺CPU轮询之一.
一个简单的方法是改变:
while(SDL_PollEvent(&event));
Run Code Online (Sandbox Code Playgroud)
对此:
while (SDL_WaitEvent(&event) != 0)
Run Code Online (Sandbox Code Playgroud)
这将使你的代码有点笨拙(while循环仍然是不必要的,当你突破它,你只是重新输入它),但至少它不会被打破.
| 归档时间: |
|
| 查看次数: |
458 次 |
| 最近记录: |