我是C语言编程的新手。我只是决定把它拿来取乐。我有Java,Java和其他几种语言的业余爱好者经验。无论出于什么原因,我决定在为Gameboy Classic开发程序的背景下学习C。所以我安装了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语句”之内。具体来说,
if((ballY >= paddleY-8) && (ballX >= paddleX-8) && (ballX <=
paddleX+24)) {
条件。只是不起作用。我换了一个测试变量,该变量在程序的其余部分完全没有改变。失败。它的唯一工作方式是如果我对值进行硬编码(例如96)。但是,这显然很糟糕,因为无论何时桨移动,它都不会改变。
我完全为这个问题感到困惑。我是C语言的新手,但这似乎很简单。我的编译器坏了吗?我是在无意中做错了什么吗?请记住,这是由Gameboy Dev Kit设计的,模仿了经典的Gameboy游戏。
感谢您的帮助。谢谢!
已解决:奇怪的解决方案。我没有在paddleX
上加上24,而是减去-24。无论出于何种原因,都可以按预期运行。