3

有人可以为仅具有“游戏循环”的程序编写源代码,该程序会一直循环直到您按 Esc,并且程序会显示基本图像。这是我现在拥有的源代码,但我必须使用它SDL_Delay(2000);来使程序保持活动状态 2 秒钟,在此期间程序被冻结。

#include "SDL.h"

int main(int argc, char* args[]) {

    SDL_Surface* hello = NULL;
    SDL_Surface* screen = NULL;

    SDL_Init(SDL_INIT_EVERYTHING);

    screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);

    hello = SDL_LoadBMP("hello.bmp");

    SDL_BlitSurface(hello, NULL, screen, NULL);

    SDL_Flip(screen);

    SDL_Delay(2000);

    SDL_FreeSurface(hello);

    SDL_Quit();

    return 0;

}

我只希望程序在我按 Esc 之前一直打开。我知道循环是如何工作的,我只是不知道我是在main()函数内部还是在函数外部实现。我都试过了,两次都失败了。如果你能帮助我,那就太好了:P

4

4 回答 4

5

这是一个完整且有效的示例。您也可以使用 SDL_WaitEvent,而不是使用帧时间规则。

#include <SDL/SDL.h>
#include <cstdlib>
#include <iostream>

using namespace std;

const Uint32 fps = 40;
const Uint32 minframetime = 1000 / fps;

int main (int argc, char *argv[])
{

  if (SDL_Init (SDL_INIT_VIDEO) != 0)
  {
    cout << "Error initializing SDL: " << SDL_GetError () << endl;
    return 1;
  }

  atexit (&SDL_Quit);
  SDL_Surface *screen = SDL_SetVideoMode (640, 480, 32, SDL_DOUBLEBUF);

  if (screen == NULL)
  {
    cout << "Error setting video mode: " << SDL_GetError () << endl;
    return 1;
  }

  SDL_Surface *pic = SDL_LoadBMP ("hello.bmp");

  if (pic == NULL)
  {
    cout << "Error loading image: " << SDL_GetError () << endl;
    return 1;
  }

  bool running = true;
  SDL_Event event;
  Uint32 frametime;

  while (running)
  {

    frametime = SDL_GetTicks ();

    while (SDL_PollEvent (&event) != 0)
    {
      switch (event.type)
      {
        case SDL_KEYDOWN: if (event.key.keysym.sym == SDLK_ESCAPE)
                            running = false;
                          break;
      }
    }

    if (SDL_GetTicks () - frametime < minframetime)
      SDL_Delay (minframetime - (SDL_GetTicks () - frametime));

  }

  SDL_BlitSurface (pic, NULL, screen, NULL);
  SDL_Flip (screen);
  SDL_FreeSurface (pic);
  SDL_Delay (2000);

  return 0;

}
于 2010-06-12T18:03:33.047 回答
2

由于您已经在使用 SDL,您可以使用该SDL_PollEvent 函数运行事件循环,检查按键事件是否为 ESC。看起来这将是沿线的mySDL_Event.key.keysym.sym == SDLK_ESCAPE

于 2010-06-12T17:49:53.167 回答
2

尝试过类似的东西

  SDL_Event e;
  while( SDL_WaitEvent(&e) )
  {
    if (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_ESCAPE) break;
  }

? 您可以在那里找到许多教程和示例;只是一个快速搜索的例子

补充说明:WaitEvent“冻结”程序,所以你不能做任何事情..你只是等待;可能需要其他等待技术(如 PollEvent,或在计时器初始化后再次等待 WaitEvent)。

于 2010-06-12T17:50:59.843 回答
-2
#include <conio.h>

...

while (!kbhit())
{
    hello = SDL_LoadBMP("hello.bmp");

    SDL_BlitSurface(hello, NULL, screen, NULL);

    SDL_Flip(screen);
}

...
于 2010-06-12T17:46:44.497 回答