0

Java で pacman ゲームを作成していますが、解決できない問題が 1 つあります。問題は次のとおりです。

ゲーム画面には、上、下、左、右の各方向に 4 つのボタンがあります。問題は、常に 0 の値を取得するため、x 位置と y 位置で同時にボタンを使用できないことです (以下のコードを見れば理解できます)。

以下に、問題に関連していると思われる 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

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 に答える