使用C在SDL2中移动一个正方形

时间:2016-01-29 01:58:56

标签: c

我无法移动我在程序中制作的矩形。运行程序时,编译器中没有错误消息。你能告诉我在键盘事件中我错过了什么。我分配给窗口的其他事件工作正常。谢谢(一个例子也很有用)。

#include <SDL.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    SDL_Window *o;
    SDL_Renderer *r;
    SDL_Event e;
    int i = 1;

    SDL_Rect q;

    SDL_Init(SDL_INIT_VIDEO);

    o = SDL_CreateWindow("Game test",
                            SDL_WINDOWPOS_UNDEFINED,
                            SDL_WINDOWPOS_UNDEFINED,
                            1024,
                            800,
                            SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);

    r = SDL_CreateRenderer(o, -1,SDL_RENDERER_ACCELERATED);
    SDL_SetRenderDrawColor(r,0,0,255,255);
    SDL_RenderClear(r);
    //Creating a box
    q.x=475;
    q.y=700;
    q.h=50;
    q.w=50;
    SDL_SetRenderDrawColor(r,0,0,0,255);
    SDL_RenderFillRect(r,&q);
    //SDL_Delay(10);

    SDL_RenderPresent(r);

    while(i)
    {
        while(SDL_PollEvent(&e) !=0)
        {
            if(e.type == SDL_QUIT)
                i=0;
            else if(e.type == SDL_KEYDOWN)
            {
                switch(e.key.keysym.sym)
                {
                case SDLK_ESCAPE:
                case SDLK_q:
                    i=0;
                break;
                case SDLK_UP:
                    q.y -=10;
                    SDL_Delay(11);
                break;
                case SDLK_DOWN:
                    q.y +=10;
                    SDL_Delay(11);
                break;
                case SDLK_RIGHT:
                    q.x +=10;
                    SDL_Delay(11);
                break;
                case SDLK_LEFT:
                    q.x -=10;
                    SDL_Delay(11);
                break;
                default:
                break;
                }
            }
        }
    }


    SDL_DestroyWindow(o);
    SDL_DestroyRenderer(r);
    SDL_Quit();

    return 0;
}

2 个答案:

答案 0 :(得分:2)

在进入事件循环之前,您只渲染窗口的内容。由于您从不重绘事件循环中的内容,因此不会发生任何更改,这并不奇怪。

答案 1 :(得分:1)

在SDL中,您需要不断重绘窗口以查看所做的任何更改。由于您只调用一次重绘功能,因此您只能在窗口创建的第一时间看到正在发生的事情。您只需在循环内添加重绘调用,它将显示您按预期移动矩形。