Як я можу рухати спрайт у напрямку, з яким він стикається?


11

Я використовую Java / Slick 2D. Я намагаюся використовувати мишу для обертання спрайту та клавіші зі стрілками для переміщення спрайту. Я можу змусити спрайт обертатися без проблем, але я не можу змусити його рухатись у напрямку, в якому він повинен. Коли я натискаю "вперед", спрайт не обов'язково рухається до миші. Насправді він дійсно рухатиметься лише вліво від екрана. Я впевнений, що для цього повинен бути якийсь стандартний код, оскільки багато ігор використовують цей стиль руху. Хтось може мені допомогти з тим, яким повинен бути триггер? Дякую

EDIT: Ось код повороту (який ще щось дивно: /programming/12610320/why-is-my-image-rotating-off-center )

int mX = Mouse.getX();
        int mY = HEIGHT - Mouse.getY();
        int pX = sprite.x;
        int pY = sprite.y;
        int tempY, tempX;
        double mAng, pAng = sprite.angle;
        double angRotate=0;

        if(mX!=pX){
            mAng = Math.toDegrees(Math.atan2(mY - pY, mX - pX));
            if(mAng==0 && mX<=pX)
                mAng=180;
        }
        else{
            if(mY>pY)
                mAng=90;
            else
                mAng=270;
        }

        sprite.angle = mAng;
        sprite.image.setRotation((float) mAng); 

І код руху. Я можу рухатись лише вліво від екрана ...

double ang = sprite.angle;
            Input input = gc.getInput();

            if(input.isKeyDown(sprite.up)){
                sprite.x += Math.cos(ang)*sprite.moveSpeed;
                sprite.y += Math.sin(ang)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.down)){
                sprite.x += -1*Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y += -1*Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.left)){
                sprite.x -= Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y += Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }if (input.isKeyDown(sprite.right)){
                sprite.x += Math.cos(ang*Math.PI/180)*sprite.moveSpeed;
                sprite.y -= Math.sin(ang*Math.PI/180)*sprite.moveSpeed;
            }

Який сенс доданого вами коду? Це нова проблема? Якщо це нова проблема, будь ласка, відкрийте нове питання. Будь ласка, оновіть це запитання лише інформацією, що стосується переміщення спрайту у напрямку, з яким він стикається.
MichaelHouse

Ні, це код, який я використав, викликав проблему. Дивіться коментарі нижче. Хтось просив цього.
rphello101

Я не бачу, де ви обчислюєте спрайт.movespeed?
AturSams

movepeed - це константа, в цьому випадку встановлено на .3
rphello101

Відповіді:


14

Ви хочете отримати вектор на основі вашої поточної швидкості та рубрики. Потім використовуйте цей вектор, щоб збільшити свою позицію.

//first get the direction the entity is pointed
direction.x = (float) Math.cos(Math.toRadians(rotation));
direction.y = (float) Math.sin(Math.toRadians(rotation));
if (direction.length() > 0) {
    direction = direction.normalise();
}
//Then scale it by the current speed to get the velocity
velocity.x = direction.x * speed;
velocity.y = direction.y * speed;

Отже, тепер ви знаєте свою швидкість на основі обертання. Ви можете оновити свою позицію за допомогою цієї інформації.

//Update the position based on our current speed
//This is basic s = vt physics
position.x += velocity.x * timeElapsed;
position.y += velocity.y * timeElapsed;

Для (неохайного) класу, який містить все це, ви можете побачити запис Ludum Dare 21, який я зібрав тут: bitbucket.org/byte56/ld21/src/af3dfc2c4c48/src/Byte56_LD21/…
MichaelHouse

Дякую. Після кількох модифікацій це спрацювало. У мене є ще одне питання до вас, хоча якщо вам трапляється читати це: змусити спрайт рухатись назад - це просто - = те, що у вас тут. Як змусити його рухатись вліво або вправо?
rphello101

@ rphello101 Добре запитання, вам слід задати нове запитання. Більше людей піде на користь, і ви можете отримати кращу відповідь, ніж я.
MichaelHouse

3

Ви отримуєте положення миші

mouseX = ... 
mouseY = ...

Ви отримуєте позицію спрайту

spriteX = ...
spriteY = ...

Ви знаходите кут

angle = Math.atan2(mouseY - spriteY, mouseX - spriteX);

Ваш рух буде:

moveX = Math.cos(angle) * speed * time;
moveY = Math.sin(angle) * speed * time;

Як підказка: Створіть таблицю (масив) для cos і sin з попередньо обчисленими значеннями. тож ви можете просто зробити cosTable [(int) кут] * швидкість * час та sinTable [(int) кут] * швидкість * час Це не так точно. Але ви отримуєте свої цінності швидше.
Сидар

Це перемістить спрайт у напрямку миші, але це не те саме, як напрямок спрайта спрямований. Спрайт все ще може повернутись до миші, якщо швидкість обертання обмежена або з якоїсь іншої причини. В основному ви відповідаєте на неправильне запитання.
MichaelHouse

@ Byte56 він сказав: "Коли я натискаю" вперед ", спрайт не обов'язково рухається до миші" Я думаю, що саме про це він запитав. Ти можеш мати рацію, хоча.
AturSams

Це напевно неоднозначно. Я просто дефолтував на назву питання в цій справі. Не зрозумійте мене неправильно, ваша відповідь хороша. Я думаю, ми дізнаємось, чого хотів ОП, коли / якщо вони повернуться.
MichaelHouse

2
@Sidar Це була б передчасна оптимізація. Створення таблиць greh / cos без ідентифікації операцій sin / cos як вузьке місце - це марна трата часу.
bummzack
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.