วิธีย้ายสี่เหลี่ยมเมื่อกดปุ่มใน sdl2 โดยใช้วิธีการ

ฉันใช้ไลบรารี SDL เพื่อสร้างเกมปิงปอง ฉันมาถึงจุดที่ฉันต้องการให้ไม้พายเลื่อนขึ้นลงเมื่อกดตัวอักษร w บนคีย์บอร์ด ฉันกำลังพยายามย้ายสี่เหลี่ยมเมื่อกด w แต่มันจะไม่ทำงาน ก่อนหน้านี้มันใช้งานได้ แต่แค่วาดภาพบนตัวเรนเดอร์แทนการขยับสี่เหลี่ยมทั้งหมด

 #include <iostream>
#include<SDL.h>
#include<fstream>
using namespace std;

SDL_Window *window = NULL;
SDL_Surface *screen = NULL;
Uint32 white;
Uint32 black;
SDL_Renderer *renderer;
const int HEIGHT = 700;
const int WIDTH = 800;
const int padH = 95;
const int padW = 25;
SDL_Event e;
SDL_Rect player;
SDL_Rect player2;
SDL_Rect Ball;
void init() 
{
    SDL_Init(SDL_INIT_EVERYTHING);
    window = SDL_CreateWindow("Pong",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,WIDTH,HEIGHT,SDL_WINDOW_SHOWN);
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    screen = SDL_GetWindowSurface(window);
    white = SDL_MapRGB(screen->format, 255, 255, 255);
    black= SDL_MapRGB(screen->format, 0,0,0);
    player.h = padH;
    player.w = padW;
    player2.h = padH;
    player2.w = padW;

    player.x = 20;
    player.y = HEIGHT / 2;
    player2.x = WIDTH-40;
    player2.y = HEIGHT / 2;
    Ball.h = 20;
    Ball.w = 20;
    Ball.x = WIDTH / 2;
    Ball.y = HEIGHT / 2;


}

void draw() 
{
    SDL_SetRenderDrawColor(renderer,0,0,0,255);
    SDL_RenderClear(renderer);

    SDL_SetRenderDrawColor(renderer,255,255,255,255);
    SDL_RenderFillRect(renderer, &Ball);

    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
    SDL_RenderFillRect(renderer, &player);

    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
    SDL_RenderFillRect(renderer, &player2);

    SDL_RenderPresent(renderer);


}

void gamelogic()
{
    while (SDL_PollEvent(&e) !=0) 

    {
        if (e.type = SDL_KEYDOWN)
        {
            switch (e.key.keysym.sym)
            {
            case SDLK_w:
                SDL_RenderFillRect(renderer, &player);
                player.y = player.y + 1;

            }

        }

    }
}
int main(int arg, char*argv[]) {
    bool done = true;

    init();
    draw();
    gamelogic();
    while (done) 
    {
        SDL_PollEvent(&e);
        if (e.type == SDL_QUIT)
        {
            done = false;
        }

    }

    return 0;
}

เมื่อฉันกดปุ่มในขณะที่วนซ้ำ มันก็จะวาดภาพต่อไปแทนที่จะขยับสี่เหลี่ยมแล้วปัดมันไป


person Zach    schedule 10.03.2019    source แหล่งที่มา


คำตอบ (1)


โดยพื้นฐานแล้ว main loop ของคุณไม่มีอยู่จริง - มันแค่ปั๊มคิวเหตุการณ์และออกเมื่อหน้าต่างสุดท้ายถูกปิด (หรือเวลาใดๆ ก่อนหน้านั้น เนื่องจากคุณไม่เคยตรวจสอบว่ามีเหตุการณ์เกิดขึ้นหรือไม่ แต่ยังคงตอบสนองต่อเหตุการณ์นั้น - อาจเป็นอะไรก็ได้) ลูปหลักควรตรวจสอบเหตุการณ์ ตอบสนองต่อเหตุการณ์ และวาดใหม่ในแต่ละรอบซ้ำ คุณไม่จำเป็นต้องวาดสิ่งใดในโค้ดการจัดการเหตุการณ์ และ if (e.type = SDL_KEYDOWN) คือการมอบหมาย ไม่ใช่การเปรียบเทียบ - ฉันขอแนะนำให้เปิดใช้งานคำเตือนของคอมไพเลอร์

โดยสรุปคือตัวอย่างที่สมบูรณ์ (ยังมีพื้นที่เหลืออีกมากสำหรับการปรับปรุง):

#include <iostream>
#include <SDL.h>
#include <fstream>
using namespace std;

SDL_Window *window = NULL;
SDL_Surface *screen = NULL;
Uint32 white;
Uint32 black;
SDL_Renderer *renderer;
const int HEIGHT = 700;
const int WIDTH = 800;
const int padH = 95;
const int padW = 25;
SDL_Event e;
SDL_Rect player;
SDL_Rect player2;
SDL_Rect Ball;
bool done = false;

void init() 
{
    SDL_Init(SDL_INIT_EVERYTHING);
    window = SDL_CreateWindow("Pong",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,WIDTH,HEIGHT,SDL_WINDOW_SHOWN);
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    screen = SDL_GetWindowSurface(window);
    white = SDL_MapRGB(screen->format, 255, 255, 255);
    black= SDL_MapRGB(screen->format, 0,0,0);
    player.h = padH;
    player.w = padW;
    player2.h = padH;
    player2.w = padW;

    player.x = 20;
    player.y = HEIGHT / 2;
    player2.x = WIDTH-40;
    player2.y = HEIGHT / 2;
    Ball.h = 20;
    Ball.w = 20;
    Ball.x = WIDTH / 2;
    Ball.y = HEIGHT / 2;
}

void draw() 
{
    SDL_SetRenderDrawColor(renderer,0,0,0,255);
    SDL_RenderClear(renderer);

    SDL_SetRenderDrawColor(renderer,255,255,255,255);
    SDL_RenderFillRect(renderer, &Ball);

    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
    SDL_RenderFillRect(renderer, &player);

    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
    SDL_RenderFillRect(renderer, &player2);

    SDL_RenderPresent(renderer);
}

void gamelogic()
{
    while (SDL_PollEvent(&e) !=0) 
    {
        if (e.type == SDL_KEYDOWN)
        {
            switch (e.key.keysym.sym)
            {
            case SDLK_w:
                player.y = player.y + 1;

            }
        }
        else if (e.type == SDL_QUIT)
        {
            done = true;
        }
    }
}

int main(int arg, char*argv[]) {
    init();

    while (!done)
    {
        gamelogic();
        draw();
    }

    return 0;
}
person keltar    schedule 11.03.2019