2013-08-07 10 views
6

私は、可視イメージをアプレットウィンドウ内で斜めに動かす方法を理解しようとしています。可視画像を斜めに移動するにはどうすればいいですか?

上、下、左または右を押すと画像(GIF)が動きますが、一度に2つのキーを同時に押すと(たとえば、同時に上下に移動)、画像は移動します(たとえあなたが同時にキーを押しても、まだ微視的な遅れがあります)を押した方向です。

これを解決する簡単な方法があるかもしれませんが、私は気づいていないかもしれませんし、誰かが考え出した解決策かもしれません...私は何か助けや助言をいただきありがとうございます。

お礼

ヒーロークラス(このクラスは、「ヒーロー」が何であるかを定義し、この場合、単純なピクセルの男と、彼は何ができるのか)

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クラス(このクラス「ヒーロー」と場所を指定するだけでなく、鍵は彼が移動するために使用しているもの)

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

はこれを読んで、うまくいけば、助けるために時間を割いてお礼をもう一度作成します。

答えて

0

これは、キーボード入力を受け入れるゲームではかなり普通の状況です。問題は、あなたのゲームがに現時点で押されているすべてのキー(ゲームに関して)(KEY_RELEASEイベントがまだ開始されていないすべてのキーを意味する)を実行する必要があるということです。

KeyListenerは最後に押されたキーのためにあなたを通知します(そして、あなたはそれが押された保持している場合、同じキーのためにあなたを通知し続ける)ので、あなたは自分キーの残りの状態を追跡する必要があります。

キーボードポーリングhere an example)あなたは、プレイヤーの入力にすぐに行動するのではなく、キュー、後の世論調査でのキーの押下を格納しない一般的な技術を探し、それを行う方法についてのアイデアを得るために、その一定の間隔(つまり、ゲームループ内)で待ち行列を作成して、どのキーが押されたかを判断し、それに応じて行動します。

私はこれが役に立ちそうです。

3

スイング(JApplet)とキーバインディングを使用することをお勧めします。複数のキーを同時に処理するためのソリューションとともにKeyListenerを使用する際の問題については、Motion Using the Keyboardを参照してください。

+0

ありがとう、ありがとう、それらをチェックします。私はそれが何であるか気づいたら、私はそれを投稿することを確認します。 – Greywarden

2

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

から

変更

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

そして、それは両方のキーに反応する必要があります。

+0

レンダリングコードを見ることなく、私はそれがうまくいくかどうかはわかりません。ユーザーがヒットして左に出ると、キャラクターの動きのデルタは-5,0 – MadProgrammer

+0

になります。ありがとうございます。しかし、私がこれらの変更を行った後も結果は変わりません。 – Greywarden

+0

'theHero.move(0,5);'は複数の呼び出しを許可しますか?同様に、プレイヤーが動いている場合、 'theHero'の' move() 'メソッドをもう一度呼び出すことができますか? – bas

0

あなたがする必要があるのは、画像の基になるAffineTransformクラスにアクセスし、正しい翻訳メソッドを設定することです。これにより、キーの1回の押下(その呼び出しにバインドする)で、イメージを任意の数の角度で任意の方向に移動させることができます。 http://docs.oracle.com/javase/7/docs/api/java/awt/geom/AffineTransform.html

+0

私はかなり頼まれていない回転から離れて、私はAffineTranformがどのように役立つのか分かりません。 Graphics#drawInageの問題と単純なイメージの重ね合わせ – MadProgrammer

+0

.translate()メソッドからAffineTransform? –

+0

OPの問題をどのように修正するのかまだ分かりません。P – MadProgrammer

1

代わりにキーのためのあなたのif-else声明で、あなたはif一連のステートメントを使用してする必要があります。この上

読みます。代わりに、これらのif文でxy運動の両方のためにheroの方向を設定する

、あなただけ...(非常に単純化された)例えば、適切なdelta

を更新する必要があります

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

hero.move(xDelta, yDelta); 

私もcamickrに同意します

関連する問題