PacMan游戏运动

时间:2012-10-10 10:11:37

标签: java

我正在用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);


}

}

这是我的gamecontrol类中的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 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:3)

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

waarde = besturing;

答案 2 :(得分:2)

setBesturing方法中: -

besturing = waarde;

此行永远不会更改waarde的值。它始终为零。

您应该以其他方式执行分配: -

this.waarde = besturing;

答案 3 :(得分:1)

您需要独立跟踪按钮是否被按下。此外,你的模型根本不支持对角线运动(我不确定你的nederlands名字究竟意味着什么,我可以解释snelheid = Schnelligkeit =速度等等。)
你需要将对角运动放入模型中(例如,给他一个x和y速度彼此独立)