2013-08-07 11 views
6

Ho cercato di capire come far muovere un'immagine visibile in diagonale in una finestra dell'applet.Come spostare un'immagine visibile in diagonale?

Se si preme su, giù, sinistra o destra l'immagine (una gif) si sposta di conseguenza, tuttavia se si tenta di premere due tasti contemporaneamente (in alto e a destra contemporaneamente, ad esempio) l'immagine si sposta solo in la direzione che hai premuto per secondo (anche se premi i tasti allo stesso tempo c'è ancora un ritardo microscopico).

Potrebbe esserci un modo semplice per risolvere ciò di cui non sono a conoscenza, o forse una soluzione alternativa che qualcuno ha capito ... Apprezzo qualsiasi aiuto o consiglio che possa essere dato.

di ringraziamento

eroe della classe (questa classe definisce ciò che il "Hero" è, in questo caso un uomo semplice di pixel, e quello che può fare)

import objectdraw.*; 
import java.awt.*; 

public class Hero extends ActiveObject { 

private DrawingCanvas canvas; 
private VisibleImage player; 

public Hero(Location initLocation, Image playerPic, DrawingCanvas aCanvas) { 
canvas = aCanvas; 

player = new VisibleImage(playerPic, canvas.getWidth()/3, 
     canvas.getWidth()/3, canvas); 
start(); 

} 
public void run() 
{ 

} 

public void move(double dx, double dy) 
{ 
player.move(dx, dy); 
} 
} 

classe HeroGame (questa classe crea la "Hero" e specifica la posizione, così come quello che le chiavi sono usate per farlo muovere)

import objectdraw.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class HeroGame extends WindowController implements KeyListener { 
private Hero theHero; 
private Image playerPic; 
private Location initLocation; 
public void begin() { 
    playerPic = getImage("player.gif"); 
    canvas.addKeyListener (this); 
    this.addKeyListener (this); 
    requestFocusInWindow(); 
    theHero = new Hero(initLocation, playerPic, canvas); 
    } 
public void keyTyped(KeyEvent e) { } 
public void keyReleased(KeyEvent e) { } 
public void keyPressed(KeyEvent e) { 

    if (e.getKeyCode() == KeyEvent.VK_UP) { 
     theHero.move(0,-5); 
    } 
    else if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
     theHero.move(0,5); 
    } 
    else if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
     theHero.move(-5,0); 
    } 
    else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
     theHero.move(5,0); 
    } 
    } 
} 

di ringraziamento, una volta di più per prendere il tempo di leggere questo e spera aiuterà.

risposta

0

Questa è una situazione piuttosto normale nei giochi che accettano l'input da tastiera. Il problema è che il tuo gioco deve agire su tutte le chiavi che sono correntemente pronte per quanto riguarda il gioco (ovvero tutte le chiavi per le quali non è stato ancora attivato un evento KEY_RELEASE).

KeyListener solo vi notifica per premuto l'ultimo tasto (e vi terrà notifica per lo stesso tasto, se si tiene premuto) quindi è necessario tenere traccia dello stato per il resto delle chiavi soli.

per avere un'idea su come farlo, cercare tastiera polling (here an example) una tecnica popolare in cui non si agisce immediatamente all'input del giocatore, ma piuttosto di memorizzare i tasti premuti in una coda e sondaggio in seguito che fare la coda a intervalli regolari (ad es. nel tuo ciclo di gioco) per decidere quali tasti sono premuti o meno e agire di conseguenza.

Spero che questo aiuti

3

Suggerisco di utilizzare Swing (JApplet) e associazioni di tasti. Vedere Motion Using the Keyboard per problemi relativi all'utilizzo di KeyListener insieme a una soluzione per la gestione contemporanea di più chiavi.

+0

Ok, grazie controllerò quelli fuori; se noterò di cosa si tratta, scriverò sicuramente. – Greywarden

2

cambiamento

if (e.getKeyCode() == KeyEvent.VK_UP) { 
    theHero.move(0,-5); 
} 
else if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
    theHero.move(0,5); 
} 
else if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
    theHero.move(-5,0); 
} 
else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
    theHero.move(5,0); 
} 

a

if (e.getKeyCode() == KeyEvent.VK_UP) { 
    theHero.move(0,-5); 
} 
if (e.getKeyCode() == KeyEvent.VK_DOWN) { 
    theHero.move(0,5); 
} 
if (e.getKeyCode() == KeyEvent.VK_LEFT) { 
    theHero.move(-5,0); 
} 
if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
    theHero.move(5,0); 
} 

E dovrebbe reagire a entrambi i tasti.

+0

Senza vedere il codice di rendering, non sono sicuro che funzionerà. Se l'utente colpisce e se ne va, il movimento delta dei caratteri sarebbe comunque -5,0 – MadProgrammer

+0

Grazie, tuttavia i risultati sono rimasti gli stessi dopo aver apportato tali modifiche, sebbene il tuo suggerimento avesse senso per me. – Greywarden

+0

fa 'theHero.move (0,5);' consente più chiamate? Come se il giocatore fosse in movimento, sarebbe possibile chiamare il metodo 'move()' per 'theHero' una seconda volta? – bas

0

È necessario accedere alla classe AffineTransform sottostante dell'immagine e impostare i giusti metodi di conversione. Ciò consentirebbe comunque di spostare l'immagine (di qualsiasi # di gradi, in qualsiasi direzione) con una sola pressione di un tasto (che si lega a quella chiamata).

Leggi su questo: http://docs.oracle.com/javase/7/docs/api/java/awt/geom/AffineTransform.html

+0

Oltre alla rotazione, che sono abbastanza sicuro che non venga chiesto, non vedo come AffineTranform ti aiuterà. Cosa c'è di sbagliato in Graphics # drawInage e semplicemente sovrapponendo le immagini l'una sull'altra? – MadProgrammer

+0

.translate() metodo da AffineTransform? –

+0

Ancora non si è sicuri di come risolvere il problema degli OP: P – MadProgrammer

1

Invece di vostro if-else economico per la chiave, si dovrebbe utilizzare una serie di if dichiarazioni.

Invece di impostare la direzione s il hero' sia per il movimento x e y in queste if affermazioni, si dovrebbe essere l'aggiornamento solo l'appropriata delta

Per (molto semplificato) esempio ...

if (up) yDelta = -5; 
if (down) yDelta = 5; 
if (left) xDelta = -5; 
if (right) xDelta = 5; 

hero.move(xDelta, yDelta); 

Sono d'accordo anche con camickr