そのため、私の小さな横スクロール Java ゲームでは、キャラクターを壁に衝突させようとしています。キー リスナーの代わりにキー バインディングを使用しています。これが私が問題を抱えているコードです:
Action moveleft = new AbstractAction(){
public void actionPerformed(ActionEvent e)
{
if (moving==true&&offsetX!=2){
offsetX=offsetX+2;
}
}
};
問題は、キーを押し続けてキャラクターを移動させる場合、actionperformed メソッドで、キーを押し続けたときに移動が true か false かを判断する条件文を再チェックしないことです。これにより、キーが離されるまで、キャラクターはすべての壁を無期限に移動します。
では、これはなぜですか?それを改善するにはどうすればよいですか?私のプログラムからさらにコードが必要な場合は、私が提供できます! ありがとう!
これは、基本的にすべての衝突が発生する私のパネル クラスの要約版です。
public class Panel extends JPanel implements ActionListener
{
public static boolean moving=true;
Player p1;
public InputMap inputmap;
public ActionMap actionmap;
ArrayList<Level> Levels;
Level level1;
protected static int offsetX=0;
protected static int offsetY=0;
public Panel() {
inputmap = getInputMap(WHEN_IN_FOCUSED_WINDOW);
inputmap.put(KeyStroke.getKeyStroke("D"), "startright");
inputmap.put(KeyStroke.getKeyStroke("A"), "startleft");
inputmap.put(KeyStroke.getKeyStroke("released D"), "stop");
inputmap.put(KeyStroke.getKeyStroke("released A"), "stop");
actionmap = getActionMap();
actionmap.put("startright", moveright);
actionmap.put("startleft", moveleft);
actionmap.put("startup", moveup);
actionmap.put("startdown", movedown);
actionmap.put("stop", stop);
}
//The game's main game loop
@Override
public void actionPerformed(ActionEvent evt) {
if (!running){
startGame();
}
gameUpdate();
repaint();
}
//Updates the game every iteration
private void gameUpdate() {
p1.update();
for (int i = 0; i < Levels.size(); i++) {
collide(p1, level1.Blocks.get(i));
}
}
Action moveright = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
//p1.setRight(e);
if (moving==true&&offsetX!=-2){
offsetX=offsetX-2;
}
}
};
Action moveleft = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
//p1.setLeft(e);
if (moving==true&&offsetX!=2){
offsetX=offsetX+2;
}
}
};
Action moveup = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
//p1.setUp(e);
if (moving==true&&offsetY!=-1){
offsetY=offsetY-1;
}
}
};
Action movedown = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
//p1.setDown(e);
if (moving==true&&offsetY!=1){
offsetY=offsetY+1;
}
}
};
Action stop = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
//p1.stop(e);
offsetX=0;
offsetY=0;
}
};
public void collide(Player p, Block b) {
if (Math.abs(p.minX) < Math.abs(b.maxX)) {
moving=false;
}
else {
//moving=true;
}
}
}
それは基本的に衝突に関係するすべてです。なぜ actionPerformed メソッドがオフセットに追加し続けるのか、moving == false
.