3

私は、コンピューター クラス (高校 1 年生) の 3 人のメンバー グループの 3 分の 1 です。私たちのプロジェクトでは、パックマン スタイルのゲームを Java で作成することにしました。私たちは誰も経験が浅いので、基本的には独学でやってきました。私たちはかなりの進歩を遂げましたが、現時点では足踏み状態にあるようです。主な質問は次のとおりです。

  1. パックマン (ファットマン) をタイル間でスムーズに移動させるにはどうすればよいでしょうか? 彼はタイルごとに移動しますが、それはプロらしくありません。さらに、矢印キーを押したままにすると、彼は画面を横切ります。どうすればそれを防ぐことができますか?

(他にも助けが必要なことはありますが、それらは別の質問です)

ご協力ありがとうございました!

これまでのコードは次のとおりです。

迷路クラス:

package Fatman;

import javax.swing.*;

public class Maze {
    public static void main(String[] args){
        new Maze();
    }

    public Maze(){
        JFrame f = new JFrame();
        f.setTitle("Fatman!");
        f.add(new Board());
        f.setSize(816, 838);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

マップ クラス

    package Fatman;

import java.awt.*;
import java.io.*;
import java.util.*;
import javax.swing.*;

public class Map {

    private Scanner m;
    private String Map[] = new String[25]; 

    private Image spaceregcandy,
                  srcb,
                  safehouse,
                  spacebigcandy,
                  blackspace,
                  space,
                  portal1,
                  portal2,
                  wall;

    public Map(){

        ImageIcon img = new ImageIcon("C:\\Users\\Martin\\Desktop\\Fatman Project\\spaceregcandy.png");
        spaceregcandy = img.getImage();
        //image icon has already been initiated, so it doesn't have to be written again
        img = new ImageIcon("C:\\Users\\Martin\\Desktop\\Fatman Project\\spaceregcandyblue.png");
        srcb = img.getImage();
        img = new ImageIcon("C:\\Users\\Martin\\Desktop\\Fatman Project\\safehouse.png");
        safehouse = img.getImage();
        img = new ImageIcon("C:\\Users\\Martin\\Desktop\\Fatman Project\\wall232x.png");
        wall = img.getImage();
        img = new ImageIcon("C:\\Users\\Martin\\Desktop\\Fatman Project\\spacebigcandy.png");
        spacebigcandy = img.getImage();
        img = new ImageIcon("C:\\Users\\Martin\\Desktop\\Fatman Project\\blackspace.png");
        blackspace = img.getImage();
        img = new ImageIcon("C:\\Users\\Martin\\Desktop\\Fatman Project\\space.png");
        space = img.getImage();
        img = new ImageIcon("C:\\Users\\Martin\\Desktop\\Fatman Project\\portal1.png");
        portal1 = img.getImage();
        img = new ImageIcon("C:\\Users\\Martin\\Desktop\\Fatman Project\\portal2.png");
        portal2 = img.getImage();

        openFile();
        readFile();
        closeFile();
        }

    public Image getSpaceregcandy(){
        return spaceregcandy;
    }
    public Image getSrcb(){
        return srcb;
    }
    public Image getSafehouse(){
        return safehouse;
    }
    public Image getWall(){
        return wall;
    }
    public Image getSpacebigcandy(){
        return spacebigcandy;
    }
    public Image getBlackspace(){
        return blackspace;
    }
    public Image getSpace(){
        return space;
    }
    public Image getPortal1(){
        return portal1;
    }
    public Image getPortal2(){
        return portal2;
    }

    public String getMap(int x, int y){
        String index = Map[y].substring(x, x + 1);
        return index;
        //in y position, if y = 2, goes to second row (substring gets x position)
    }

    public void openFile(){

        try{
        m = new Scanner(new File("C:\\Users\\Martin\\Desktop\\Fatman Project\\map3.txt"));
        }catch(Exception e){
            System.out.println("error loading map");
        }
    }

    public void readFile(){
        while(m.hasNext()){
            for(int i = 0; i < 25; i++){
                Map[i] = m.next();
            }
        }

    }

    public void closeFile(){
        m.close();
    }
}

ボードクラス

package Fatman;

import java.awt.*;
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.*;

public class Board extends JPanel implements ActionListener{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private Timer timer;

    private Image player;

    private Map m;
    private Player p;

    public Board(){

        m = new Map();
        p = new Player();
        addKeyListener(new Al());
        setFocusable(true);
        timer = new Timer(1, this);
        timer.start();
    }

    public void actionPerformed(ActionEvent e){
        repaint();

    }

    public void paint(Graphics g){
        super.paint(g);

        for(int y = 0; y < 25; y++){
            for(int x = 0; x <25; x++){
                if(m.getMap(x, y).equals("o")){
                    g.drawImage(m.getSpaceregcandy(), x *32, y *32, null);
                }
                if(m.getMap(x, y).equals("O")){
                    g.drawImage(m.getSrcb(), x *32, y *32, null);
                }
                if(m.getMap(x, y).equals("x")){
                    g.drawImage(m.getWall(), x *32, y *32, null);
                }
                if(m.getMap(x, y).equals("H")){
                    g.drawImage(m.getSafehouse(), x *32, y *32, null);
                }   
                if(m.getMap(x, y).equals("C")){
                    g.drawImage(m.getSpacebigcandy(), x *32, y *32, null);
                }
                if(m.getMap(x, y).equals("b")){
                    g.drawImage(m.getBlackspace(), x *32, y *32, null);
                }
                if(m.getMap(x, y).equals("s")){
                    g.drawImage(m.getSpace(), x *32, y *32, null);
                }
                if(m.getMap(x, y).equals("p")){
                    g.drawImage(m.getPortal1(), x *32, y *32, null);
                }
                if(m.getMap(x, y).equals("P")){
                    g.drawImage(m.getPortal2(), x *32, y *32, null);
                }
        }


    }


        g.drawImage(p.getPlayer(), p.getTileX() * 32, p.getTileY() * 32, null);

}

    public class Al extends KeyAdapter{

        public void keyPressed(KeyEvent e){
            int keycode = e.getKeyCode();

            if(keycode == KeyEvent.VK_UP){
                if(!m.getMap(p.getTileX(), p.getTileY() -1).equals("x")){
                    if(!m.getMap(p.getTileX(), p.getTileY() -1).equals("b")){                       
                        }
                        p.move(0, -1);                  

                        System.out.println(m.getMap(p.getTileX(), p.getTileY()));

            }
                }

            if(keycode == KeyEvent.VK_DOWN){
                if(!m.getMap(p.getTileX(), p.getTileY() +1).equals("x")){
                    if(!m.getMap(p.getTileX(), p.getTileY() +1).equals("b")){
                        p.move(0, 1);
                        System.out.println(m.getMap(p.getTileX(), p.getTileY()));
            }
                }
            }
            if(keycode == KeyEvent.VK_LEFT){
                if(!m.getMap(p.getTileX() - 1, p.getTileY()).equals("x")){
                    if(!m.getMap(p.getTileX() - 1, p.getTileY()).equals("b")){
                        p.move(-1, 0);
                        System.out.println(m.getMap(p.getTileX(), p.getTileY()));
            }
                }
            }
            if(keycode == KeyEvent.VK_RIGHT){
                if(!m.getMap(p.getTileX() + 1, p.getTileY()).equals("x")){
                    if(!m.getMap(p.getTileX() + 1, p.getTileY()).equals("b")){
                        p.move(1, 0);
                        System.out.println(m.getMap(p.getTileX(), p.getTileY()));
            }
            }
            }
            }


        public void keyReleased(KeyEvent e){

        }

        public void keyTyped(KeyEvent e){

}
}
}

プレイヤークラス

package Fatman;

import java.awt.Image;

import javax.swing.ImageIcon;

public class Player {

    private int tileX, tileY;
    private int dx, dy;

    private Image player; 

    public Player(){

        ImageIcon img = new ImageIcon("C:\\Users\\Martin\\Desktop\\Fatman Project\\FATMANsimplified32xbrown.png");
        player = img.getImage();

        tileX = 12;
        tileY = 18;
    }

    public Image getPlayer(){
        return player;
    }
    public int getTileX(){
        return tileX;
    }
    public int getTileY(){
        return tileY;
    }

    public void move(int dx, int dy){

        tileX += dx;
        tileY += dy;
    }

}

何か案は?

4

4 に答える 4

1

最初の質問については、move メソッドでタイル番号をインクリメントしているだけであり、後でその位置で (32 ピクセルのインクリメントで) プレーヤーを再描画していることを認識してください。それよりも細かいレベルの粒度が必要です。つまり、タイル自体ではなく、タイルの一部 (たとえば 2 ピクセル) ごとに増加します。そのため、FatMan の画像が 1 つのタイルから別のタイルに移動するためにより多くのステップが必要になります。明らかに、FatMan のイメージ プレーヤーがその間にウォーキング/ランニング アニメーションを実行すると、動きがより自然に見えるようになり、さらに見栄えがよくなります。

だから... 恥知らずな自己宣伝として、私の古いチュートリアルをご覧になることをお勧めします: https://sites.google.com/site/javagamescorner/home/animated-sprites

于 2013-11-04T15:17:15.907 に答える
0

ファットマンが右から左に、またはその逆に滑らないようにするには、次の質問を参照してください: Java KeyListener keyPressed method fires too fast

アニメーションでは、あるタイルを自分で別のタイルに移動するコードを作成する必要があります。

于 2013-11-04T15:18:13.473 に答える
0

私はあなたのコードを読んだので、これらの変更を提案します:

  • キーを押すと、次の方向として上、下、左、または右の方向を設定します (移動が終了するまで方向を維持する必要があるため)。direction と nextDirection の 2 つのクラス変数を使用して実装できます。また、別のクラス変数にタイルのエッジ サイズの値 (32 など) を設定します。この変数は animationFrame と呼ばれます。
  • この例では、タイマーの頻度を多かれ少なかれ 32 Hz (1000/32 ミリ秒) に設定します。アニメーションに合わせてタイマーで遊べます。
  • タイマーが呼び出されるたびに、ファットマンの画像をその方向に 1 ピクセル移動し (方向変数を読み取る)、animationFrame を減らします。0 に到達すると、ファットマンは次のタイルに配置されます。direction = nextDirection を設定することで、操作を繰り返すことができます。そして、この時点でゲームのロジックを適用する必要があります (衝突など)。

これは大まかなアプローチにすぎませんが、このアイデアから始めることができると思います。これは、私が 16 歳のときに Java でプログラミングしたスネーク ゲームを思い出させてくれます。

于 2013-11-04T15:56:33.600 に答える
0

2 つの問題があります。

まず第一に、時間をシミュレートするために、各更新の間にある種のスリープ/一時停止が必要です。そうしないと、キーを押し続けると、プレイヤーは即座にマップの最後にジャンプします。プレイヤーがステップを踏むたびに時間が経過したいので。

1 つの可能性は、各呼び出しの後に Thread.sleep を追加することです。

次に、プレイヤーの動きをタイル座標系から分離する必要があります。プレイヤーが「タイル間を移動」できるようにしたい場合。より小さなステップを移動できるように、独自の座標系を使用する必要があります。

于 2013-11-04T15:17:23.893 に答える