我是 C 语言编程的新手。我只是决定把它捡起来玩;我有 Javascript、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 游戏。
任何帮助表示赞赏。谢谢!
已解决:奇怪的解决方案。我没有将 24 添加到paddleX
,而是减去 -24。无论出于何种原因,这都按预期工作。