Я новичок в программировании на языке Си.Я просто решил забрать это для удовольствия;У меня есть опыт увлечения 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.По какой-то причине это работает как задумано.