Перш ніж застосувати екстраполяцію до руху мого спрайта, моє зіткнення спрацювало чудово. Однак після застосування екстраполяції до руху мого спрайта (для вирівнювання речей) зіткнення більше не працює.
Ось як працювали до екстраполяції:
Однак після здійснення моєї екстраполяції рутинна колізія порушується. Я припускаю, що це відбувається тому, що він діє за новою координатою, яка була створена методом екстраполяції (що знаходиться в моєму виклику візуалізації).
Після того, як я застосую свою екстраполяцію
Як виправити таку поведінку?
Я спробував поставити додаткову перевірку на зіткнення відразу після екстраполяції - це, мабуть, усуває багато проблем, але я виключив це, оскільки вводити логіку в моє візуалізацію не доводиться.
Я також спробував зробити копію позиції spritesX, екстраполювавши її та намалювавши її, використовуючи, а не оригінал, таким чином, залишивши первинним недоторканим логіку - це здається кращим варіантом, але він все ще створює деякі дивні ефекти при зіткненні зі стінами. Я впевнений, що це також не правильний спосіб боротьби з цим.
Тут я знайшов пару подібних питань, але відповіді не допомогли мені.
Це мій екстраполяційний код:
public void onDrawFrame(GL10 gl) {
//Set/Re-set loop back to 0 to start counting again
loops=0;
while(System.currentTimeMillis() > nextGameTick && loops < maxFrameskip){
SceneManager.getInstance().getCurrentScene().updateLogic();
nextGameTick+=skipTicks;
timeCorrection += (1000d/ticksPerSecond) % 1;
nextGameTick+=timeCorrection;
timeCorrection %=1;
loops++;
tics++;
}
extrapolation = (float)(System.currentTimeMillis() + skipTicks - nextGameTick) / (float)skipTicks;
render(extrapolation);
}
Застосування екстраполяції
render(float extrapolation){
//This example shows extrapolation for X axis only. Y position (spriteScreenY is assumed to be valid)
extrapolatedPosX = spriteGridX+(SpriteXVelocity*dt)*extrapolation;
spriteScreenPosX = extrapolationPosX * screenWidth;
drawSprite(spriteScreenX, spriteScreenY);
}
Редагувати
Як я вже згадував вище, я намагався зробити копію координат спрайта, щоб намалювати .... це має свої проблеми.
По-перше, незалежно від копіювання, коли спрайт рухається, він надто гладкий, коли він зупиняється, він коливається трохи вліво / вправо - оскільки це все ще екстраполює своє положення залежно від часу. Це нормальна поведінка і чи можемо ми її "вимкнути", коли спрайт зупиниться?
Я намагався мати прапорці ліворуч / праворуч і лише екстраполяцію, якщо будь-який із них увімкнено. Я також спробував скопіювати останні та поточні позиції, щоб побачити, чи є різниця. Однак, що стосується зіткнення, вони не допомагають.
Якщо користувач натискає скажіть, права кнопка і спрайт рухається праворуч, коли він вдаряється про стіну, якщо користувач продовжує утримувати праву кнопку вниз, спрайт буде продовжувати анімувати праворуч, зупиняючись стіною ( тому насправді не рухається), однак тому, що правий прапор все ще встановлений, а також тому, що рутина зіткнення постійно переміщує спрайт зі стіни, все одно в коді (а не гравцеві) все одно здається, що спрайт все ще рухається, і тому екстраполяція триває. Отож, що бачив би гравець, - це спрайт "статичний" (так, це анімація, але насправді він не рухається по екрану), і раз у раз він сильно трясеться, коли екстраполяція намагається це зробити ... .. Сподіваюся, що це допоможе