Come posso spostare uno sprite nella direzione in cui è rivolto?


11

Sto usando Java / Slick 2D. Sto cercando di usare il mouse per ruotare lo sprite e i tasti freccia per spostare lo sprite. Riesco a far ruotare lo sprite senza problemi, ma non riesco a farlo muovere nella direzione in cui dovrebbe. Quando premo "avanti", lo sprite non si sposta necessariamente verso il mouse. In realtà, si sposterà solo verso la sinistra dello schermo. Sono sicuro che ci deve essere un codice standard per questo poiché molti giochi usano questo stile di movimento. Qualcuno può darmi una mano con quello che dovrebbe essere il grilletto? Grazie

EDIT: ecco il codice di rotazione (che fa qualcos'altro di strano: /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); 

E il codice del movimento. Posso solo spostarmi verso la sinistra dello schermo ...

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

Qual è il punto del codice che hai aggiunto? È un nuovo problema? Se si tratta di un nuovo problema, si prega di aprire una nuova domanda. Aggiorna questa domanda solo con le informazioni relative allo spostamento dello sprite nella direzione in cui è rivolto.
MichaelHouse

No, è il codice che ho usato che ha causato il problema. Vedi i commenti qui sotto. Qualcuno l'ha chiesto.
rphello101,

Non vedo dove calcoli sprite.movespeed?
AturSams,

movepeed è una costante, in questo caso impostata su .3
rphello101

Risposte:


14

Ti consigliamo di ottenere un vettore in base alla velocità e alla direzione correnti. Quindi usa quel vettore per aumentare la tua posizione.

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

Quindi ora conosci la tua velocità in base alla tua rotazione. Puoi aggiornare la tua posizione con tali informazioni.

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

Per una classe (sciatta) che contiene tutto questo, puoi vedere una voce di Ludum Dare 21 che ho messo qui: bitbucket.org/byte56/ld21/src/af3dfc2c4c48/src/Byte56_LD21/…
MichaelHouse

Grazie. Dopo alcune modifiche, ha funzionato. Ho un'altra domanda per te, però, se ti capita di leggere questo: far spostare lo sprite all'indietro è solo - = di quello che hai qui. Come faccio a farlo spostare a sinistra oa destra però?
rphello101,

@ rphello101 Buona domanda, dovresti fare una nuova domanda. Ne trarranno beneficio più persone e potresti avere una risposta migliore di quella che ho.
MichaelHouse

3

Ottieni la posizione del mouse

mouseX = ... 
mouseY = ...

Ottieni la posizione dello sprite

spriteX = ...
spriteY = ...

Trovi l'angolo

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

Il tuo movimento sarà:

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

Come suggerimento: creare una tabella (array) per cos e sin con valori pre-calcolati. quindi puoi semplicemente fare cosTable [(int) angle] * speed * time e sinTable [(int) angle] * speed * time Non è così preciso. Ma ottieni i tuoi valori molto più velocemente.
Sidar,

Questo sposta lo sprite verso il mouse, ma non è la stessa direzione verso cui lo sprite è rivolto. Lo sprite potrebbe ancora girare verso il mouse se la sua velocità di rotazione è limitata o per qualche altro motivo. Fondamentalmente, stai rispondendo alla domanda sbagliata.
MichaelHouse

@ Byte56 ha detto "Quando premo" in avanti ", lo sprite non si sposta necessariamente verso il mouse" Penso che sia quello che mi ha chiesto. Potresti avere ragione però.
AturSams,

È abbastanza ambiguo di sicuro. In questo caso ho appena impostato il titolo predefinito della domanda. Non fraintendermi, la tua risposta è buona. Immagino che scopriremo cosa voleva l'OP quando / se tornassero.
MichaelHouse

2
@Sidar Sarebbe un'ottimizzazione prematura. Costruire tabelle sin / cos senza identificare le operazioni sin / cos come colli di bottiglia è una perdita di tempo.
Bummzack,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.