Проблемы с регистрацией границ экрана для определенных входов (вниз и вправо)
Я создаю скролл-шутер для DMG с использованием gbdk, он основан на некоторых руководствах по YouTube и на этом примере. На самом деле ссылка является основой моей программы. Моя проблема заключается в том, что граничные условия экрана не работают должным образом для входов вниз и вправо. Впрочем, они работают правильно, и код для них практически одинаков. Я также скомпилировал код по ссылке выше, и там он работает правильно. Заранее извиняюсь, у меня детское чувство юмора, поэтому игра основана на пенисе.
Основное различие между моим и моим скелетным кодом состоит в том, что я использую мета-спрайт для игрока и массив для координат 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), поэтому я не понимаю, почему они ведут себя так по-разному.
1 ответ
Здесь может помочь использование беззнакового целого, так как 8-разрядное целое число будет содержать только значения от -128 до 127, что может привести к неопределенному поведению при сравнении с более чем 150, что приведет к отрицательному значению?
Вы определили расположение диска как INT8, когда было бы лучше как UINT8 или даже больше, если вы планируете когда-либо иметь размер экрана больше 255 байт.