Управление классом для разграничения ключей игрока

Создание клона понг и проблемы с движением и уроками. Итак, у меня есть класс Game который управляет двумя экземплярами класса Paddle и в конструкторе Game класс инициирует переменные в двух разных классах весла и устанавливает переменную player в 1 или же 2 на основе каких клавиш класс будет отвечать за движение. Тогда внутри Paddle функция событий класса я использую if(player == 1) или же if(player == 2) указать, когда проверять клавиши для изменения скорости вращения лопасти. У меня проблема в том что Game Функция событий класса выглядит следующим образом:

void Game::events()
{
PlayerOne.events();
PlayerTwo.events();
Game_Ball.events();
}

И функция событий и определение класса Paddle класс выглядит так:

class Paddle
{
public:
int player;
SDL_Surface *sprite = NULL;
float x, y, w, h;
float yVel;
SDL_Rect *clip;
void events();
void logic(Uint32 deltaTicks);
void render();
Paddle();
~Paddle();
};

void Paddle::events()
{
while (SDL_PollEvent(&event))
{
Uint8 *keystates = SDL_GetKeyState(NULL);
if (player == 1)
{
if (keystates[SDLK_o] == 1)
{
yVel -= 100;
}
if (keystates[SDLK_k] == 1)
{
yVel += 100;
}
}
else
{
if (keystates[SDLK_o] == 0)
{
yVel += 100;
}
if (keystates[SDLK_k] == 0)
{
yVel -= 100;
}
}
if (player == 2)
{
if (keystates[SDLK_w] == 1)
{
yVel -= 100;
}
if (keystates[SDLK_s] == 1)
{
yVel += 100;
}
}
else
{
if (keystates[SDLK_w] == 0)
{
yVel += 100;
}
if (keystates[SDLK_s] == 0)
{
yVel -= 100;
}
}
}
}

Что-то происходит, что смешивает ключи. Обычно PlayerOne использует «O / K» для перемещения, а PlayerTwo использует «W / S» для перемещения, но иногда я нажимаю любую из них, и другой класс перемещается. Кажется, это не имеет смысла. Здесь Game конструктор класса и определение

class Game : public GameState
{
private:
int server;
TTF_Font *score = NULL;
Paddle PlayerOne;
Paddle PlayerTwo;
Ball Game_Ball;
public:
SDL_Rect clip[2];
void events();
void logic();
void render();
Game();
~Game();
};

Game::Game()
{
//RESOURSES
PlayerOne.sprite = load_image("Game_sprite.png");
PlayerTwo.sprite = load_image("Game_sprite.png");
clip[0].x = 0;
clip[0].y = 0;
clip[0].w = 20;
clip[0].h = 20;
clip[1].x = 0;
clip[1].y = 20;
clip[1].w = 20;
clip[1].h = 100;
//PLAYER ONE
PlayerOne.x = 420;
PlayerOne.y = 100;
PlayerOne.w = 60;
PlayerOne.h = 100;
PlayerOne.clip = &clip[1];
PlayerOne.yVel = 0;
PlayerOne.player = 1;
//PLAYER TWO
PlayerTwo.x = 60;
PlayerTwo.y = 100;
PlayerTwo.w = 60;
PlayerTwo.h = 100;
PlayerTwo.clip = &clip[1];
PlayerTwo.yVel = 0;
PlayerTwo.player = 2;
//BALL
Game_Ball.Ball_Bound.x = 190;
Game_Ball.Ball_Bound.y = 190;
Game_Ball.Ball_Bound.w = 60;
Game_Ball.Ball_Bound.h = 60;
Game_Ball.clip = &clip[0];
}

player четко установлен как в объектах, так и в разделе событий Paddle класс четко различает их, так почему же ключи перепутаны? Я мог бы легко написать другой класс для второго игрока, но это было бы неэффективно, я бы предпочел использовать две копии одного и того же класса, которые делают все то же самое, за исключением состояний клавиш. Так что я не совсем уверен, что случилось.

-1

Решение

На первый взгляд кажется, что вы можете просто использовать:

    if (player == 1)
{
if (keystates[SDLK_o] == 1)
{
yVel -= 100;
}
if (keystates[SDLK_k] == 1)
{
yVel += 100;
}
}
else // player == 2
{
if (keystates[SDLK_w] == 1)
{
yVel -= 100;
}
if (keystates[SDLK_s] == 1)
{
yVel += 100;
}
}

Буду ли я прав, предполагая, что когда неправильный курсор перемещается, O, например, переместит неправильный курсор вниз?

0

Другие решения

Проблема, кажется, в том, что у вас есть

if (player == 1) {
check keys O K pressed
}
else {
check keys O K released
}

что не имеет смысла, так как это изменяет значения, связанные с ключами O K, выпущенными на player2.

В любом случае вы не должны позволять игровому объекту опрашивать события. Основной игровой цикл должен объединить их один раз и передать их соответствующим элементам игры, например:

void gameLoop() {
while (true) {
draw();
updatePositions();
handleEvents();
}
}

void handleEvents() {
while (SDL_PollEvent(&event)) {
Uint8 *keystates = SDL_GetKeyState(NULL);

if (keystates[SDLK_o]) paddle1->startMovingUp();
else if (keystates[SDLK_k]) paddle1->startMovingDown();
else paddle1->stopMoving();

// same thing for player2
}
}

Paddle::startMovingUp() {
uvelY = -100;
}

Paddle::startMovingDown() {
uvelY = 100;
}

Paddle::stopMoving() {
uvelY = 0;
}

Paddle::updatePosition() {  // called on each frame
positionY += uvelY;
}

Вы можете упростить дизайн и просто обновить позиции в handleEvents() функции, но хорошо бы отделить обновление позиции от управления событиями.

0

По вопросам рекламы [email protected]