为某些输入注册屏幕边界时出现问题(向下和向右)
Trouble registering screen boundaries for certain inputs (down and right)
我正在使用 gbdk 为 DMG 创建滚动射击游戏,它基于一些 youtube 教程和 this 示例。事实上 link 是我程序的骨架。我的问题是屏幕边界条件对于向下和向右输入无法正常工作。然而,对于向上和向左,它们可以正常工作,并且它们的代码基本上完全相同。我还编译了上面 link 中的代码,它在那里可以正常工作。 提前致歉,我有一个幼稚的幽默感,所以游戏是基于阴茎的。
骨架代码和我的代码之间的主要区别是我为玩家使用元精灵,为玩家的 x 和 y 坐标使用数组。我已经尝试使用单独的整数作为位置并更改屏幕的边界,但似乎没有任何效果。
#include <gb/gb.h>
#include <stdio.h>
#include "gameDicks.c"
#include "DickSprites.c"
#define SCREEN_WIDTH 160
BOOLEAN ishard = TRUE, playing = TRUE;
struct gameDicks flacid;
struct gameDicks hard;
INT8 spritesize = 8, dicklocation[2] = {20, 80};
int i;
void moveGameDicks(struct gameDicks* Dick, UINT8 x, UINT8 y){
move_sprite(Dick->spriteids[0], x, y);
move_sprite(Dick->spriteids[1], x + spritesize, y);
move_sprite(Dick->spriteids[2], x, y + spritesize);
move_sprite(Dick->spriteids[3], x + spritesize, y + spritesize);
}
void setuphard(INT8 dicklocation[2]){
hard.x = dicklocation[0];
hard.y = dicklocation[1];
hard.width = 16;
hard.height = 16;
//load sprites
set_sprite_tile(0,0);
hard.spriteids[0] = 0;
set_sprite_tile(1,1);
hard.spriteids[1] = 1;
set_sprite_tile(2,2);
hard.spriteids[2] = 2;
set_sprite_tile(3,3);
hard.spriteids[3] = 3;
}
void init_screen()
{
SHOW_BKG;
SHOW_SPRITES;
DISPLAY_ON;
}
void init_player()
{
SHOW_SPRITES;
set_sprite_data(0, 8, DickSprites);
setuphard(dicklocation);
}
void input()
{
if (joypad() & J_UP && dicklocation[1])
{
if (dicklocation[1] <= 16){
dicklocation[1] = 16;
}
else{
dicklocation[1]--;
}
}
if (joypad() & J_DOWN && dicklocation[1])
{
if (dicklocation[1] >= 150){
dicklocation[1] = 150;
}
else{
dicklocation[1]++;
}
}
}
void update_sprites()
{
moveGameDicks(&hard, dicklocation[0], dicklocation[1]);
}
int main()
{
init_screen();
init_player();
init_screen();
while(playing)
{
wait_vbl_done(2);
input();
update_sprites();
}
return 0;
}
我期望的是能够将玩家向上移动到 y = 16,向下移动到 y = 150。当它达到这些值时,它会停止移动,直到您转向另一个方向。相反,我看到的是向上方向按预期工作,但只要按下向下键 - 无论 y 位置如何 - 播放器都会立即发送到屏幕底部。从那里,向上按将它发送到最顶部。此外,玩家只能从顶部位置移动到底部,而不能在两者之间滚动。我对此感到困惑,因为条件完全相同(y 值除外),所以我不明白为什么它们的行为如此不同。
使用 unsigned int 可能会有所帮助,因为 8 位整数只能保存 -128 到 127 之间的值,当您将它与超过 150 的值进行比较时,这可能会导致未定义的行为,将其推到负值?
您已将 dicklocation 定义为 INT8,如果您计划使用大于 255 字节的屏幕大小,则将它定义为 UINT8 或什至更长。
我正在使用 gbdk 为 DMG 创建滚动射击游戏,它基于一些 youtube 教程和 this 示例。事实上 link 是我程序的骨架。我的问题是屏幕边界条件对于向下和向右输入无法正常工作。然而,对于向上和向左,它们可以正常工作,并且它们的代码基本上完全相同。我还编译了上面 link 中的代码,它在那里可以正常工作。 提前致歉,我有一个幼稚的幽默感,所以游戏是基于阴茎的。
骨架代码和我的代码之间的主要区别是我为玩家使用元精灵,为玩家的 x 和 y 坐标使用数组。我已经尝试使用单独的整数作为位置并更改屏幕的边界,但似乎没有任何效果。
#include <gb/gb.h>
#include <stdio.h>
#include "gameDicks.c"
#include "DickSprites.c"
#define SCREEN_WIDTH 160
BOOLEAN ishard = TRUE, playing = TRUE;
struct gameDicks flacid;
struct gameDicks hard;
INT8 spritesize = 8, dicklocation[2] = {20, 80};
int i;
void moveGameDicks(struct gameDicks* Dick, UINT8 x, UINT8 y){
move_sprite(Dick->spriteids[0], x, y);
move_sprite(Dick->spriteids[1], x + spritesize, y);
move_sprite(Dick->spriteids[2], x, y + spritesize);
move_sprite(Dick->spriteids[3], x + spritesize, y + spritesize);
}
void setuphard(INT8 dicklocation[2]){
hard.x = dicklocation[0];
hard.y = dicklocation[1];
hard.width = 16;
hard.height = 16;
//load sprites
set_sprite_tile(0,0);
hard.spriteids[0] = 0;
set_sprite_tile(1,1);
hard.spriteids[1] = 1;
set_sprite_tile(2,2);
hard.spriteids[2] = 2;
set_sprite_tile(3,3);
hard.spriteids[3] = 3;
}
void init_screen()
{
SHOW_BKG;
SHOW_SPRITES;
DISPLAY_ON;
}
void init_player()
{
SHOW_SPRITES;
set_sprite_data(0, 8, DickSprites);
setuphard(dicklocation);
}
void input()
{
if (joypad() & J_UP && dicklocation[1])
{
if (dicklocation[1] <= 16){
dicklocation[1] = 16;
}
else{
dicklocation[1]--;
}
}
if (joypad() & J_DOWN && dicklocation[1])
{
if (dicklocation[1] >= 150){
dicklocation[1] = 150;
}
else{
dicklocation[1]++;
}
}
}
void update_sprites()
{
moveGameDicks(&hard, dicklocation[0], dicklocation[1]);
}
int main()
{
init_screen();
init_player();
init_screen();
while(playing)
{
wait_vbl_done(2);
input();
update_sprites();
}
return 0;
}
我期望的是能够将玩家向上移动到 y = 16,向下移动到 y = 150。当它达到这些值时,它会停止移动,直到您转向另一个方向。相反,我看到的是向上方向按预期工作,但只要按下向下键 - 无论 y 位置如何 - 播放器都会立即发送到屏幕底部。从那里,向上按将它发送到最顶部。此外,玩家只能从顶部位置移动到底部,而不能在两者之间滚动。我对此感到困惑,因为条件完全相同(y 值除外),所以我不明白为什么它们的行为如此不同。
使用 unsigned int 可能会有所帮助,因为 8 位整数只能保存 -128 到 127 之间的值,当您将它与超过 150 的值进行比较时,这可能会导致未定义的行为,将其推到负值?
您已将 dicklocation 定义为 INT8,如果您计划使用大于 255 字节的屏幕大小,则将它定义为 UINT8 或什至更长。