Мозаичное движение в C++

вот над чем я сейчас работаю

if (osl_keys->held.down)
{
sprite_position = DOWN;
SpriteAnimate();
sceKernelDelayThread(20000);
sprite->y += 16;
SpriteAnimate();
sceKernelDelayThread(20000);
sprite->y += 16;
}
if (osl_keys->held.up)
{
sprite_position = UP;
SpriteAnimate();
sceKernelDelayThread(20000);
sprite->y -= 16;
SpriteAnimate();
sceKernelDelayThread(20000);
sprite->y -= 16;
}
if (osl_keys->held.right)
{
sprite_position = RIGHT;
SpriteAnimate();
sceKernelDelayThread(20000);
sprite->x += 16;
SpriteAnimate();
sceKernelDelayThread(20000);
sprite->x += 16;
}
if (osl_keys->held.left)
{
sprite_position = LEFT;
SpriteAnimate();
sceKernelDelayThread(20000);
sprite->x -= 16;
SpriteAnimate();
sceKernelDelayThread(20000);
sprite->x -= 16;
}
sceKernelDelayThread(750000);

и я определенно решил, что каждый спрайт должен быть 32x32, поэтому коллизия может быть более применимой.

по lokiare1 вам все равно придется проверять на столкновение с тайлами. Самый тщательный способ сделать столкновение — проверить расположение каждого видимого пикселя спрайта относительно каждого другого пикселя каждого другого спрайта, а затем вернуть указатель на спрайт, с которым произошло столкновение. Это было бы очень медленно. Метод, который я описываю, должен быть медленным и грязным обнаружением столкновений. Если я ошибаюсь, пожалуйста, скажите мне, как я ошибаюсь.

Это та часть, которую мне сложно представить (мне нравится убеждаться, что все работает в моей голове, прежде чем я попробую это таким образом, я не перескакиваю на что-то случайное) Я провел несколько ночей, сидя в душе, пытаясь думать о способ или это проверить, если что-то было там

Я думаю о чем-то, что устанавливает, что плитка x, y является сплошной, поэтому, если перед ней находится твердый объект, не двигайтесь, иначе двигайтесь. Я работаю над своим постом>.>

if (osl_keys->held.down)
{
if (y+1 == bush=>y)
{
sprite_march = 4;
SpriteAnimate();
else
{
sprite_position = DOWN;
SpriteAnimate();
sceKernelDelayThread(20000);
sprite->y += 16;
SpriteAnimate();
sceKernelDelayThread(20000);
sprite->y += 16;
}  

Но опять же, как я могу сократить количество кода, просто спросив (y + 1 == solid), я не уверен, как это сделать.


person Chris Stryker    schedule 17.05.2009    source источник


Ответы (1)


Это не ответ, а примечание общего стиля. Вы заметили, что ваш код повторяется? Потому что это так. Ваш первый пост с кодом можно сильно сократить:

int down_direction = 0, right_direction = 0;
if (osl_keys->held.down)
{
    down_direction = 16;
    sprite_position = DOWN;
}
else if (osl_keys->held.up)
{
    down_direction = -16;
    sprite_position = UP;
}
else if (osl_keys->held.right)
{
    right_direction = 16;
    sprite_position = RIGHT;
}
else if (osl_keys->held.left)
{
    right_direction = -16;
    sprite_position = LEFT;
}

for (int i = 0; i < 2; ++i)
{
    SpriteAnimate();
    sceKernelDelayThread(20000);
    sprite->x += right_direction;
    sprite->y += down_direction;
}
sceKernelDelayThread(750000);

Вот, разве не лучше?

Чтобы ответить на ваш вопрос, вы не хотите отслеживать положение пикселя вашего спрайта. Вы хотите отслеживать позицию строки и столбца. Затем просто проверьте в сторону, прежде чем двигаться, если целевая плитка сплошная.

person rlbond    schedule 17.05.2009
comment
вот что я пытаюсь понять, но я сам не понимаю целые числа - person Chris Stryker; 18.05.2009