Проблемы с регистрацией границ экрана для определенных входов (вниз и вправо)

Я создаю скролл-шутер для 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 байт.

Другие вопросы по тегам