2013-08-07 18 views
6

Ich habe versucht herauszufinden, wie man ein sichtbares Bild diagonal in einem Applet-Fenster bewegt.Wie verschiebe ich ein sichtbares Bild diagonal?

Wenn Sie nach oben, unten, links oder rechts drücken, bewegt sich das Bild (ein GIF) entsprechend, wenn Sie jedoch versuchen, zwei Tasten gleichzeitig zu drücken (oben und rechts gleichzeitig), wird nur das Bild eingezogen die Richtung, in der Sie die Sekunde gedrückt haben (selbst wenn Sie gleichzeitig die Tasten drücken, gibt es noch eine mikroskopische Verzögerung).

Es könnte einen einfachen Weg geben, dies zu beheben, von dem ich nichts weiß, oder vielleicht eine Umgehungslösung, die jemand herausgefunden hat ... Ich schätze jede Hilfe oder jeden Rat, der gegeben werden kann.

Dankes-

Heldenklasse (diese Klasse definiert, was der „Hero“ ist, in diesem Fall ein einfaches Pixel Mann, und was er tun kann)

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

HeroGame Klasse (diese Klasse den „Hero“ erstellt und gibt die Position, sowie welche Tasten verwendet werden, um ihn zu bewegen zu machen)

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

Dankes- einmal mehr für die Zeit nehmen, diese und hoffentlich helfen zu lesen.

Antwort

0

Dies ist eine ziemlich übliche Situation in Spielen, die Tastatureingabe akzeptieren. Das Problem ist, dass Ihr Spiel auf alle Tasten, die derzeit gedrückt werden müssen so weit wie das Spiel betroffen ist (dh alle Schlüssel, für die ein KEY_RELEASE Ereignis noch nicht gefeuert wurde) handeln.

KeyListener werden Sie nur für die zuletzt gedrückte Taste mitteilen (und halten Sie für den gleichen Schlüssel benachrichtigen, wenn Sie gedrückt halten), so müssen Sie den Überblick über den Zustand für den Rest des Schlüssels halten sie.

Um eine Vorstellung zu bekommen, wie das zu tun, für Tastatur Polling (here an example) eine populäre Technik suchen, wo man sofort handelt nicht auf die Eingabe des Spielers, sondern speichert die Tastendrücke in einer Warteschlange und später Umfrage, dass Warteschlange in regelmäßigen Abständen (dh in Ihrem Spiel-Schleife), um zu entscheiden, welche Tasten gedrückt werden oder nicht und entsprechend handeln.

Ich hoffe, das hilft

3

Ich würde vorschlagen, verwenden Sie Swing (JApplet) und Key Bindings. Siehe Motion Using the Keyboard für Probleme mit der Verwendung eines KeyListener zusammen mit einer Lösung für die Behandlung mehrerer Tasten gleichzeitig gedrückt werden.

+0

Ok, danke, ich werde diese auschecken; Wenn ich merke, was es ist, werde ich das sicher posten. – Greywarden

2

Änderung

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

zu

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

Und es sollte auf beiden Tasten reagieren.

+0

Ohne den Rendercode zu sehen, bin ich mir nicht sicher, ob das funktioniert. Wenn der Benutzer nach oben und nach links schlägt, wäre das Bewegungsdelta des Charakters immer noch -5,0 – MadProgrammer

+0

Vielen Dank, aber die Ergebnisse sind gleich geblieben, nachdem ich diese Änderungen vorgenommen habe, obwohl Ihr Vorschlag für mich einen Sinn ergab. – Greywarden

+0

macht 'theHero.move (0,5);' mehrere Anrufe möglich? Wie wäre es, wenn der Spieler sich bewegt, wäre es möglich, die Methode 'move()' für 'theHero' ein zweites Mal aufzurufen? – bas

0

Sie müssen auf die zugrunde liegende AffineTransform-Klasse des Bildes zugreifen und die richtigen Übersetzungsmethoden einstellen. Das würde es Ihnen erlauben, das Bild trotzdem zu verschieben (in jeder beliebigen Gradzahl, in jeder Richtung) mit einem Tastendruck (den Sie an diesen Anruf binden).

lesen dazu: http://docs.oracle.com/javase/7/docs/api/java/awt/geom/AffineTransform.html

+0

Abgesehen von der Rotation, von der ich mir ziemlich sicher bin, dass sie nicht gefragt wird, kann ich nicht sehen, wie AffineTranform helfen wird. Was ist los mit Graphics # drawInage und einfachen Überlagern von Bildern übereinander? – MadProgrammer

+0

.translate() Methode von AffineTransform? –

+0

Immer noch nicht sicher, wie das das OP-Problem beheben wird: P – MadProgrammer

1

Statt Ihre if-else Anweisung für den Schlüssel, sollten Sie eine Reihe von if Aussagen werden.

Statt die Richtung s‘hero der Einstellung sowohl für die x und y Bewegung in diesen if Aussagen, sollten Sie nur die entsprechende Für (sehr vereinfacht) Beispiel delta

Aktualisierung werden ...

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

hero.move(xDelta, yDelta); 

stimme ich auch mit camickr

Verwandte Themen