0

問題は、矢印キーの1つを押したままにすると、常に移動する間に遅延が発生することです。つまり、左を押し続けると7ピクセル移動し、少し経つと常に移動します。誰かがこれを修正して「スムーズに」動くようにする方法を教えてもらえますか

コード - - - - - - - - - -

パッケージゲーム;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;


public class GamePlay implements KeyListener{
 int shipX = 400;
 int shipY = 300;
public int shipSpeed = 7;
public void incShipX(int i) {this.shipX += i;}
public void incShipY(int i) {this.shipY += i;}

Image ship;


File shipFile = new File("C:/Users/Pictures/ship.png");

public GamePlay() {
    try {        
        ship = ImageIO.read(shipFile);

    } catch (IOException ex) {
        Logger.getLogger(GamePlay.class.getName()).log(Level.SEVERE, null, ex);
    }

}

public void drawShip(Graphics g) {  

    g.drawImage(ship, shipX, shipY, null);    

}

@Override
public void keyTyped(KeyEvent ke) {

}

@Override
public void keyPressed(KeyEvent ke) {
    if(ke.getKeyCode() == KeyEvent.VK_LEFT) {
        incShipX(-shipSpeed);
    }

    if(ke.getKeyCode() == KeyEvent.VK_RIGHT) {
        incShipX(shipSpeed);
    }

    if(ke.getKeyCode() == KeyEvent.VK_UP) {
        incShipY(-shipSpeed);
    }

    if(ke.getKeyCode() == KeyEvent.VK_DOWN) {
        incShipY(shipSpeed);
    }
}

@Override
public void keyReleased(KeyEvent ke) {

}

}

keyListenerをCanvasに追加しています---add(gamePlay);

4

1 に答える 1

3

矢印キーを押すと、オペレーティングシステムは1つのキーが押されたイベントのみをJavaアプリケーションに送信します。これは、キーを押すと船が1回だけ移動することを意味します。

キーを押したままにすると、しばらくすると、オペレーティングシステムはキーが押されたイベントを繰り返し送信し始めます。ここで「s」キーを押したままにすると...sssssssssssssssssssss最初の「s」がすぐに表示され、少し遅れて、残りの「s」文字がすぐに入力されました。これはあなたのプログラムで起こっているのと同じことです。

これを修正するには、定期的に(または、船を更新するときに時間差を考慮する場合は可変間隔で)船を更新する必要があります。重要な違いに注意してください。押されたキーは瞬時に発生しますが、キーの状態は時間の経過に伴う関数です(値はUPまたはDOWN)。

私があなたのために問題を混乱させたかどうかはわかりません。必要に応じて、別の方法で説明することもできます。

于 2012-10-28T04:05:43.160 に答える