2013-08-07 21 views
6

Görünür bir görüntünün bir uygulama penceresinde çapraz olarak nasıl hareket edeceğini anlamaya çalışıyorum.Görünür bir görüntü çapraz olarak nasıl taşınır?

Yukarı, aşağı, sola veya sağa bastığınızda, görüntü (gif) buna göre hareket eder, ancak iki tuşa aynı anda basmaya çalışırsanız (örneğin aynı anda yukarı ve sağa) görüntü yalnızca ikinci bastığınız yön (aynı anda tuşlara bassanız bile hala mikroskobik bir gecikme olur).

Bunu fark etmediğim veya belki de bir kişinin anladığını düşündüğüm bir çözümü düzeltmenin basit bir yolu olabilir ... Verilecek herhangi bir yardım veya öneriyi takdir ediyorum.

Thank-you

Kahraman Sınıfı (bu sınıf "Kahraman" ne tanımlar; bu durumda basit bir piksel adam ve o yapabileceklerini)

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 sınıfı (bu sınıf "Hero" oluşturur ve konumu, hem de tuşları yapmak için kullanılan ne hareket etmesine)

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

Thank-bir kez daha okumak ve umarım yardımcı olmak üzere zaman ayırdığınız için belirtir.

cevap

0

ile katılıyorum Bu, klavye girişini kabul eden oyunlarda oldukça normal bir durumdur. Sorun şu ki oyununuz numaralı oyunda harekete geçmeli ve şu an oyuna göre tuşlarına basmalısınız (bir KEY_RELEASE etkinliğinin henüz tetiklenmediği tüm anahtarlar anlamındadır).

KeyListener sadece basılan son tuşun size bildirir (ve bunu basılı tutarsan aynı anahtar için size bildiren tutacak), böylece anahtarları kendin geri kalanı için devlet izlemek gerekir.

Klavye yoklama ( here an example) Eğer oyuncunun girişine hemen hareket etmekten çok bir sıraya ve sonraki ankette tuşa basma saklamayın popüler bir teknikle aramak, bunu nasıl bir fikir edinmek için bu hangi tuşlara basıldığına karar vermek ve buna göre hareket etmek için düzenli aralıklarla (oyun döngüsünüzde) kuyruk.

Umarım bu yardımcı olur

3

Swing (JApplet) ve Key Bindings kullanmanızı öneririm. Aynı anda birden fazla tuşun basılmasıyla ilgili bir çözümle birlikte bir KeyListener kullanımı ile ilgili sorunlar için bkz. Motion Using the Keyboard.

+0

Tamam, teşekkürler-ben bunları kontrol edeceğim; Eğer ne olduğunu fark edersem, bunu yazacağımdan emin olurum. – Greywarden

2

değişiklik

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

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

Ve her iki tuşları tepki gerekmektedir.

+0

İşleme kodunu görmeden, bunun işe yaramayacağından emin değilim. Eğer kullanıcı isabet ederse ve sola dönerse, karakterler hareket deltası hala -5,0 – MadProgrammer

+0

olurdu. Teşekkürler, ancak bu değişiklikleri yaptıktan sonra sonuçlar aynı kaldı, öneriniz bana anlamlı geldi. – Greywarden

+0

, 'Hero.move (0,5); '' birden fazla çağrıya izin veriyor mu? Mesela, eğer oyuncu hareket ediyorsa, ikinci kez “hero” için 'move()' yöntemini çağırmak mümkün olabilir mi? – bas

0

Yapmanız gereken şey resmin temel AffineTransform sınıfına erişmek ve doğru Çeviri yöntemlerini ayarlamaktır. Bu, bir tuşa (o aramaya bağladığınız) bir kez basarak görüntüyü herhangi bir yönde (herhangi bir yönde, herhangi bir yönde) hareket ettirmenize izin verir. Bu konuda

Okuma: Bunun yerine anahtar için sizin if-else beyanı http://docs.oracle.com/javase/7/docs/api/java/awt/geom/AffineTransform.html

+0

İhtiyacım olmadığından emin olduğum rotasyon dışında, AffineTranform'un nasıl yardımcı olacağını göremiyorum. Grafik # drawInage ve basit üst üste binen resimlerin nesi var? AffineTransform gelen – MadProgrammer

+0

.translate() yöntemi? –

+0

OP'lerin sorununu nasıl düzelteceğinden emin değilsiniz: P – MadProgrammer

1

, sen if tabloların bir dizi kullanarak edilmelidir. Bunun yerine bu if tablolara x ve y hareketi hem hero 'ın yönünü belirleme

, sadece ... (çok basitleştirilmiş) Örneğin uygun delta

güncellenmesi gerektiğini

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

hero.move(xDelta, yDelta); 

Ayrıca, camickr

İlgili konular