0

我正在用 Java 创建一个 pacman 游戏,我有一个无法解决的问题。问题如下:

我在游戏屏幕上各有 4 个按钮:上、下、左、右。问题是我不能在 x 位置和 y 位置同时使用按钮,因为我总是得到 0 值(如果你在下面看到我的代码,你就会明白这一点)

您可以在下面找到我认为与问题有关的 pacman 课程(请参阅 setBesturing(int besturing) 方法)

package h04PacMan;

/*
 * PacMan laten bewegen
 */

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class PacMan extends JPanel implements ActionListener {

private int horizontalePlaats = 250; // x location
private int verticalePlaats = 150; // y location
private int richtingEnSnelheid = +10; // speed
private final int WACHTTIJD = 500; // DELAY
int diameter;
int waarde;

public PacMan() {

    // create timer and start timer
            javax.swing.Timer autoKlik = new javax.swing.Timer(WACHTTIJD, this);

            autoKlik.start();
}

public int getHorPlaats() {
    return horizontalePlaats;
}

// current y positie

public int getVerPlaats() {
    return verticalePlaats;
}

// speed and way;
public int getRichtingEnSnelheid() {
    return richtingEnSnelheid;
}

// new x position

public void setHorPlaats(int nieuweHorPlaats) {

    if(nieuweHorPlaats > getWidth()) {

        nieuweHorPlaats = 0;
    }
    else if(nieuweHorPlaats < 0) {

        nieuweHorPlaats = getWidth();
    }

    horizontalePlaats = nieuweHorPlaats;

}

// new y position 
public void setVerPlaats(int nieuweVerPlaats) {

    if(nieuweVerPlaats > getHeight()) {

        nieuweVerPlaats = 0;
    }
    else if(nieuweVerPlaats < 0) {

        nieuweVerPlaats = getHeight();
    }

    verticalePlaats = nieuweVerPlaats;

}

public void setRichtingEnSnelheid(int nieuweRichtingEnSnelheid) {

    richtingEnSnelheid = nieuweRichtingEnSnelheid;

}

//movement
public void setBesturing(int besturing) {

    besturing = waarde;

    if(waarde == 0) {
        setVerPlaats( getVerPlaats() + richtingEnSnelheid);
    }
    else if(waarde == 1){
        setHorPlaats( getHorPlaats() + richtingEnSnelheid);
    }
}

@Override
public void actionPerformed(ActionEvent e) {

    setBesturing(waarde);
    System.out.println(waarde);
    repaint();

}

DrawPacMan pacman = new DrawPacMan();
DrawPacMan ghost1 = new DrawPacMan();
DrawPacMan ghost2 = new DrawPacMan();

public void paintComponent(Graphics g) {

    super.paintComponent(g);
    // pacman movement
    diameter = 75;  
    pacman.drawPacMan(g, getHorPlaats(), getVerPlaats(), diameter, Color.yellow);

    // ghosts movement
    int g1x;
    for(g1x = 0; g1x < 10; g1x++) {

        pacman.drawGhost(g, g1x, 40, diameter, Color.red);

    }
    pacman.drawGhost(g, 170, 70, diameter, Color.blue);


}

}

这是我的游戏控制类中的 actionListener

    @Override
public void actionPerformed(ActionEvent e) {

    if(e.getSource() == links) {

        pacman.setRichtingEnSnelheid( -10 );
        pacman.setBesturing(1);
        System.out.println("links");
    }
    else if(e.getSource() == rechts) {
        pacman.setRichtingEnSnelheid( +10 );
        pacman.setBesturing(1);
        System.out.println("rechts");
    }
    else if(e.getSource() == boven) {
        pacman.setRichtingEnSnelheid( -10);
        pacman.setBesturing(0);
        System.out.println("boven");
    }
    else {
        pacman.setRichtingEnSnelheid( +10);
        pacman.setBesturing(0);
        System.out.println("beneden");
    }


}
4

4 回答 4

3

这是你的问题:

//movement
public void setBesturing(int besturing) {

    besturing = waarde; <-- THIS LINE

    if(waarde == 0) {
        setVerPlaats( getVerPlaats() + richtingEnSnelheid);
    }
    else if(waarde == 1){
        setHorPlaats( getHorPlaats() + richtingEnSnelheid);
    }
}

besturing您正在用旧值覆盖 的值waarde。应该反过来。

//movement
public void setBesturing(int besturing) {

    waarde = besturing; <-- THIS LINE

    if(waarde == 0) {
        setVerPlaats( getVerPlaats() + richtingEnSnelheid);
    }
    else if(waarde == 1){
        setHorPlaats( getHorPlaats() + richtingEnSnelheid);
    }
}
于 2012-10-10T10:18:29.237 回答
3

我认为在方法 setBesturing(int besturing) 内部应该是:

waarde = besturing;
于 2012-10-10T10:21:10.640 回答
2

在你的setBesturing方法中: -

besturing = waarde;

这条线永远不会改变你waarde.. 的值。它总是零。

您应该以另一种方式完成作业:-

this.waarde = besturing;
于 2012-10-10T10:20:57.733 回答
1

您需要跟踪按钮是否被独立按下。另外,您的模型根本不支持对角线运动(我不确定您的荷兰名字的确切含义,我可以解释 snelheid=Schnelligkeit=speed 等等)。
您需要将对角线运动放入模型中(例如,给他一个相互独立的 x 和 y 速度)

于 2012-10-10T10:18:08.263 回答