GBDK - не удается проверить условие «если выписка» - PullRequest
0 голосов
/ 20 декабря 2018

Я новичок в программировании на языке Си.Я просто решил забрать это для удовольствия;У меня есть опыт увлечения Javascript, Java и некоторыми другими языками.По какой-то причине я решил изучить C в контексте разработки программы для Gameboy Classic.Поэтому я установил GBDK, который, как я понимаю, устарел.Поставляется с компилятором LCC.Я использую VisualBoy Advance для эмуляции моей программы.

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

Вот полный код:

#include <gb/gb.h>
#include "Sprites/paddle.c"
#include "Sprites/ball.c"

int paddleX = 72;
int paddleY = 136;
int paddleSpeed = 1;

int ballAngle = 270;
int ballX = 84;
int ballY = 75;

void setSprites() {
    SPRITES_8x8;

    //paddle////////////////////////////

    set_sprite_data(0, 4, paddle);
    set_sprite_tile(0, 0);
    move_sprite(0, paddleX, paddleY);

    set_sprite_tile(1, 1);
    move_sprite(1, paddleX+8, paddleY);

    set_sprite_tile(2, 2);
    move_sprite(2, paddleX+16, paddleY);

    set_sprite_tile(3, 3);
    move_sprite(3, paddleX+24, paddleY);

    //ball////////////////////////////////

    set_sprite_data(4, 1, ball);
    set_sprite_tile(4, 4);
    move_sprite(4, ballX, ballY);

    SHOW_SPRITES;
}

void movePaddle() {
    if(joypad() == J_LEFT) {
        if(paddleX <= 8) {
            paddleX = 8;
        }
        else {
            paddleX -= 1;
        }
    }
    if(joypad() == J_RIGHT) {
        if(paddleX >= 136) {
            paddleX = 136;
        }
        else {
            paddleX += 1;
        }
    }
    move_sprite(0, paddleX, paddleY);
    move_sprite(1, paddleX+8, paddleY);
    move_sprite(2, paddleX+16, paddleY);
    move_sprite(3, paddleX+24, paddleY);
}

void moveBall() {
    if(ballAngle == 270) {
        if((ballY >= paddleY-8) && (ballX >= paddleX-8) && (ballX <= 
                paddleX+24)) {
            ballAngle = 90;
        }
        else {
            ballY += 1;
        }
    }
    if(ballAngle == 90) {
        ballY -= 1;
    }
    move_sprite(4, ballX, ballY);
}

void main() {
    setSprites();
    while(1) {
        movePaddle();
        moveBall();

        delay(20);
    }
}

Проблема лежит в одном "еслизаявление."В частности, условие:

    if((ballY >= paddleY-8) && (ballX >= paddleX-8) && (ballX <= 
            paddleX+24)) {

.Это просто не работает.Я поменял тестовую переменную, которая не менялась в течение остальной части программы;ПОТЕРПЕТЬ ПОРАЖЕНИЕ.Единственный способ это работает, если я жестко закодирую значение (например, 96).Однако это, очевидно, плохо, потому что оно не изменится, когда весло начнет двигаться.

Я полностью озадачен этой проблемой.Я новичок в C, но это кажется простой вещью.Мой компилятор сломан?Я делаю что-то непреднамеренно неправильно?Имейте в виду, что он разработан с набором разработчика Gameboy, эмулированным как классическая игра Gameboy.

Любая помощь приветствуется.Спасибо!

РЕШЕНО: Странное решение.Вместо добавления 24 к paddleX я вычитаю -24.По какой-то причине это работает как задумано.

...