我正在使用gbdk为DMG创建一个滚动射手,它是基于youtube的一些教程和这示例。事实上,链接是我的程序的骨架。我的问题是,屏幕边界条件不适合向下和正确的输入。然而,对于向上和左边,它们的工作方式是正确的,这些代码基本上是完全相同的。我也从上面的链接编译了代码,它在那里正确工作。提前道歉,我有一种幼稚的幽默感,所以游戏是以阴茎为基础的。
框架代码和我的代码之间的主要区别是,我对播放器使用了一个meta,对于播放器的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-值),所以我不明白它们为什么表现得如此不同。
发布于 2019-07-11 09:11:46
在这里使用无符号int可能会有所帮助,因为8位整数只包含-128到127之间的值,这可能会导致与超过150的值比较时未定义的行为,将其推到负值吗?
您已经将dicklocation定义为一个INT8,如果您计划屏幕大小超过255个字节,它将更好地作为一个UINT8,甚至更长。
https://stackoverflow.com/questions/56983518
复制相似问题