【问题标题】:Issues making two paddles in Pong clone SDL2在 Pong 克隆 SDL2 中制作两个桨的问题
【发布时间】:2015-07-10 06:47:31
【问题描述】:

所以我开始 SDL2 并浏览了一些教程并决定尝试制作一个简单的游戏,而 Pong 的克隆似乎是最简单的。但我似乎无法让右手边的桨在窗户上画。目前我正在使用 SDL_FillRenderRect,每个桨一个,但这似乎只是让左侧出现而不是右侧。这是我当前的代码:

#include <iostream>

#include "Pong.h"
#include "Paddle.h"

//Screen size
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

bool quit = false;//Has user quit?

Paddle paddleLeft;
Paddle paddleRight;

int Pong::setup(){

    //Initilize SDL
    SDL_Init(SDL_INIT_EVERYTHING);

    window = SDL_CreateWindow("Pong",
                              SDL_WINDOWPOS_UNDEFINED,
                              SDL_WINDOWPOS_UNDEFINED,
                              SCREEN_WIDTH,
                              SCREEN_HEIGHT,
                              SDL_WINDOW_SHOWN);

    if (window == nullptr){
        std::cout<<"SDL_CreateWindow error: "<<SDL_GetError()<<std::endl;
        SDL_Quit();
        return -1;
    }

    SDL_ShowCursor(0);

    renderer = SDL_CreateRenderer(window,
                                  -1,
                                  SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

    if (renderer == nullptr){
        std::cout<<"SDL_CreateRenderer error: "<<SDL_GetError()<<std::endl;
        SDL_Quit();
        return -1;
    }

    int wH, wW;

    //Setting the paddle to the centre of the left hand side of the screen.
    SDL_GetWindowSize(window, &wW, &wH);
    paddleLeft.setY((wH / 2) - (paddleLeft.getPaddleHeight() / 2));
    paddleRight.setY((wH / 2) - (paddleLeft.getPaddleHeight() / 2));

    //Setting the x, y, height and width of the left paddle
    leftR.x = 20;
    leftR.y = paddleLeft.getY();
    leftR.h = paddleLeft.getPaddleWidth();
    leftR.w = paddleLeft.getPaddleHeight();

    //Setting the x, y, height and width of the right paddle
    rightR.x = 620;
    rightR.y = paddleLeft.getY();
    rightR.h = paddleLeft.getPaddleWidth();
    rightR.w = paddleLeft.getPaddleHeight();

    return 1;//If setup fails then return -1 otherwise return 1
}

void Pong::updateGame(){
    SDL_Event event;

    while (SDL_PollEvent(&event)){
        if (event.type == SDL_QUIT){
            quit = true;
        }
        if (event.type == SDL_KEYDOWN){
            switch (event.key.keysym.sym){
                case SDLK_w:        paddleLeft.setY(paddleLeft.getY() - paddleLeft.getSpeed()); break;
                case SDLK_s:        paddleLeft.setY(paddleLeft.getY() + paddleLeft.getSpeed()); break;
            }
        }
    }
}

void Pong::render(){
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);

    SDL_RenderClear(renderer);

    leftR.x = paddleLeft.getX();
    leftR.y = paddleLeft.getY();

    rightR.x = paddleRight.getX();
    rightR.y = paddleRight.getY();

    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);

    SDL_RenderFillRect(renderer, &leftR);

    SDL_RenderFillRect(renderer, &rightR);

    SDL_RenderPresent(renderer);
}

void Pong::cleanup(){
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
}

void Pong::run(){
    while (!quit){
        updateGame();
        render();
    }
    cleanup();
}

有人可以指出正确的方向来绘制正确的桨吗?如果我的代码中还有任何其他错误或使其更有效的方法,我也将不胜感激,如果还可以指出这一点,我将不胜感激。提前致谢。

【问题讨论】:

    标签: c++ sdl-2 pong


    【解决方案1】:

    仔细阅读:

    rightR.x = 620;
    rightR.y = paddleLeft.getY();
    rightR.h = paddleLeft.getPaddleWidth();
    rightR.w = paddleLeft.getPaddleHeight();
    

    由于复制粘贴编程,左右混淆。我不是说它不好,我也这样做是为了减少对我手的伤害。你应该检查两次这样的事情。

    此外,在您的情况下,您应该开始使用 OOP 概念。不要在非成员函数中执行所有操作,而是让成员函数在实例上执行。我不知道getYgetPaddleWidthgetPaddleHeight 的值是从哪里来的,但我很清楚,除了SDL_Rect 之外不应该有任何东西持有它们。

    我什至认为 SDL 是在浪费时间,而且我不记得它的 C++ 是什么。它是纯 C 语言,你不会学到任何有用的东西。 SFML 是更好的选择。

    【讨论】:

    • 非常感谢!我可能从未见过。我很愚蠢,但我应该再检查一次。再次感谢! :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2015-10-24
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多