Плиточное движение в C ++ - PullRequest
0 голосов
/ 17 мая 2009

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

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), что я не уверен, как это сделать

1 Ответ

1 голос
/ 17 мая 2009

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

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);

Там, разве не лучше?

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

...