0

初心者のJavaプログラマーとして、私はJavaで簡単なパックマンゲームを作成して練習するのに忙しく、ゴーストが垂直方向から水平方向にランダムに移動するメソッドを作成しましたが、いくつかの問題があります。強制する方法がわかりません。左右または上下に移動します(同時にではありません)。現在のゴーストのコードは次のとおりです。

 public void moveUp() {

 }

 public void moveLeft() {

     if (g1x >= 500) { g1x = 500; g1r = false; }
     else if (g1x <= 0) { g1x = 0; g1r = true; }

 }

 public void moveRight() {

     if (g1x >= 500) { g1x = 500; g1r = false; }
     else if (g1x <= 0) { g1x = 0; g1r = true; }

 }

 public void moveDown() {

 }

public void paintComponent(Graphics g) {

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

    // ghosts movement
    g1x += ghostSpeed * (Math.random() > 0.5? 1 : -1); // random direction

     Random randomGen = new Random();
     // generate a random number, between 0 - 3
     int randomize = randomGen.nextInt(4);

    switch(randomize) {
     case 0:
         moveUp();
         System.out.println("up");
         break;
     case 1:
         moveLeft();
         System.out.println("Left");
         break;
     case 2:
         moveRight();
         System.out.println("Right");
         break;
     case 3:
         moveDown();
         System.out.println("down");
         break;
    }

    ghost.drawGhost(g, randomize, 40, diameter, Color.red);

}

ご覧のとおり、方向にランダム化変数を使用しました。水平位置はハードコーディングされていますが、水平位置もランダム化によって示されますが、両方に使用すると、奇妙な斜めの動きが発生します。

次の問題は、私がこのように私の構造でタイマーを使用することです

    public PacMan() {

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

            autoKlik.start();
}

方向のランダムな値は高速(500ms)に変わりますが、速度はゲームプレイの速度も構成するので、論理的な間違いを犯したと思いますが、これを解決する方法がわかりません..アクションを分離する必要がありますか?または、これを達成するためのより簡単な方法がありますか?私とあなたのスキルを共有してください私は学ぶ意欲があります:)さらにコードが必要な場合は、ここに投稿するか、私のgithubアカウントへのリンクを提供してチェックアウトできます:)

前もって感謝します!

完全なソースへのリンク:パックマンゲームソース

4

1 に答える 1

1

関心の分離を提案します。

  • シミュレーションをモデル化するためのクラスのセットには、エンティティとロジックのみが含まれます
  • パックマンを描くグラフィッククラスのセット
  • アクションを処理し、それらをモデルに委任するコントローラー。スイングクラスによって起動されます。

paint()メソッドでは、パフォーマンス上の理由から、ペイントのみを実行し、「new」を実行したり、複雑なメソッドを呼び出したりしないでください。ペイントは、フレームワークによって頻繁に呼び出されます。

于 2012-10-23T16:29:36.827 に答える