Verwenden Sie IDEA, um ein objektorientiertes Java-Spiel "Forgive Hat Battle" zu erstellen.

Leistungsanzeige

Fügen Sie hier eine Bildbeschreibung ein

Produktionsideen

Schritt 1: Entdecken Sie die Klasse (Objekt)

人物-小丑: Buffoon
子弹-帽子:Missile
墙体:Wall
爆炸物:Explode

Schritt 2: Entdecken Sie die Attribute

小丑:宽和高,位置(x,y),移动速度
帽子:宽和高,位置(x,y),移动速度
墙体:宽和高,位置(x,y)
爆炸物:宽和高,位置(x,y)

Schritt 3: Entdecken Sie die Methode

小丑:移动、攻击、人物撞边界
子弹:移动、子弹撞墙、子弹撞边界
爆炸物:消失

Schwierigkeitsanalyse

So erstellen Sie das Formular

public class GameClient extends Frame

Implementieren Sie das Java-Formular, indem Sie die Frame-Klasse erben

public class Frame extends Window implements MenuContainer

Die Frame-Klasse erbt die Window-Klasse und die MenuContainer-Schnittstelle

So laden Sie Bilder in das Formular

Schritt 1: Erstellen Sie CommonUtils, eine häufig verwendete Toolklasse, und erstellen Sie eine neue getImage-Methode, um Bildressourcen in Java-Objekte zu konvertieren

public class CommonUtils {
    
    
    /**
     * 读取图片资源, 转变为Java对象 Image
     * @param imgPath  图片路径
     * @return Image对象
     */
    public static Image getImage(String imgPath) {
    
    
        ImageIcon imageIcon = new ImageIcon(imgPath);
        return imageIcon.getImage();
    }
}

Schritt 2: Rufen Sie die Methode getImage auf, um das Objektbild hinzuzufügen

public class GameClient extends Frame {
    
    
    Image bg_image = CommonUtils.getImage("images/bg.png");
    Image explode = CommonUtils.getImage("images/explode.png");
    Image missile = CommonUtils.getImage("images/missile.png");
    Image wall_h = CommonUtils.getImage("images/wall-h.png");
    Image wall_v = CommonUtils.getImage("images/wall-v.png");
    Image buffoon = CommonUtils.getImage("images/body/s-left.png");

Schritt 3: Schreiben Sie die Malmethode von Framed neu, um das Formular zum Laden von Bildern zu implementieren

@Override
    public void paint(Graphics g){
    
    
        //画背景图
        g.drawImage(bg_image,0,0,1100,700,this);
        //画小丑
        g.drawImage(buffoon,300,200,80,80,this);
        //画爆炸物
        g.drawImage(explode,800,400,90,90,this);
        //画原谅帽
        g.drawImage(missile,300,300,60,60,this);
        //画横着的墙体
        g.drawImage(wall_h,400,300,100,20,this);
        //画竖着的墙体
        g.drawImage(wall_v,400,300,20,100,this);

Die drawImage-Methode der Graphics-Klasse muss die Bildklassenparameter, den x-Parameter des Formulars, den y-Parameter des Formulars, die Breite der Bildklasse, die Länge der Bildklasse und den Beobachter (das Objekt, das benachrichtigt werden soll, wenn mehr Bilder konvertiert werden) bereitstellen.

Implementierung der Objektbewegung

Die Richtung der Zielkarte wird normalerweise durch die Regel "nach Norden, von unten nach Süden, von links nach Westen und von rechts nach Osten" bestimmt. Die acht Bewegungsrichtungen beziehen sich normalerweise auf Nord, Nordost, Ost, Südost, Süd, Südwest, West und Nordwest. Verwenden Sie daher beim Definieren der Bewegungsrichtung oben, links, unten, rechts, oben rechts, unten rechts, oben links und unten links, um anzuzeigen

Entworfen von Lin Jiabin

小丑:移动  move<Orientation类传递方向参数>
'left向左'   :x = x - this.speed;
'right向右'  :x = x + this.speed;
'down向下'   :y = y + this.speed;
'up向上'     :y = y - this.speed;
'ur东北方向'  : x = x + this.speed;
                y = y - this.speed;
'ul西北方向'  : x = x - this.speed;
                y = y - this.speed;
'dr东南方向'  : x = x + this.speed;
                y = y + this.speed;
'dl西南方向'  : x = x - this.speed;
                y = y + this.speed;

Die Realisierung des Formularschlusses

    public void start() {
    
    
        //窗体添加侦听方法
        this.addWindowListener(new WindowAdapter() {
    
    
            @Override
            public void windowClosing(WindowEvent e) {
    
    
                super.windowClosing(e);
                //退出游戏
                System.exit(0);
            }
        });

WindowAdapter-Klasse :
1. Eine abstrakte Adapterklasse, die Fensterereignisse empfängt. Die Methoden in dieser Klasse sind leer. Der Zweck dieser Klasse besteht darin, die Erstellung von Listener-Objekten zu erleichtern.
2. Erweitern Sie diese Klasse, um WindowEvent-Listener zu erstellen und die Methode für die erforderlichen Ereignisse zu überschreiben. (Wenn Sie die WindowListener-Schnittstelle implementieren möchten, müssen Sie alle Methoden in der Schnittstelle definieren. Diese abstrakte Klasse definiert alle Methoden als null, sodass Sie nur Methoden für die Ereignisse definieren müssen, die Sie interessieren.
3. Verwenden Sie erweiterte Klassen, um Listener-Objekte zu erstellen Verwenden Sie dann die addWindowListener-Methode des Fensters, um einen Listener beim Fenster zu registrieren. Wenn der Status des Fensters durch Öffnen, Schließen, Aktivieren oder Deaktivieren, Symbolisieren oder Deaktivieren des Symbols geändert wird, wird die entsprechende Methode im Listener-Objekt aufgerufen , Und übergeben Sie WindowEvent an die Methode.
WindowAdapter Listener

Die Realisierung des Schlüsselereignisauslösers

 this.addKeyListener(new KeyAdapter() {
    
    
             //键盘按下的时候出发
            @Override
            public void keyPressed(KeyEvent e) {
    
    
                super.keyPressed(e);
            }
            //键盘松开
            @Override
            public void keyReleased(KeyEvent e) {
    
    
                //获取被按下的键对应的数值,如,a:67,b:68
                int keyCode = e.getKeyCode();
                switch (keyCode){
    
    
                    case KeyEvent.VK_UP:
                        System.out.println("向上走!!!");
                        buffoon.setDir("UP");
                        break;
                    case KeyEvent.VK_DOWN:
                        System.out.println("向下走");
                        buffoon.setDir("DOWN");
                        break;
                    case KeyEvent.VK_RIGHT:
                        System.out.println("向右走");
                        buffoon.setDir("RIGHT");
                        break;
                    case KeyEvent.VK_LEFT:
                        System.out.println("向左走!!");
                        buffoon.setDir("LEFT");
                        break;
                }
                buffoon.move(buffoon.getDir());
            }
        });

Wichtige Punkte des Tastenanschlags

Punkt 1: 'new KeyAdapter ()' Erstellen Sie einen neuen Listener für Schlüsselereignisse und registrieren Sie den Listener über addKeyListener () im Hauptformular.
Punkt 2: Schreiben Sie die KeyAdapter-Methoden neu, nämlich KeyTyped (Typ), KeyPresdded (Drücken Sie Weiter), KeyReleased (freigegeben). Hier hören wir nur das KeyPressed-Ereignis und schreiben diese Methode neu, um die Änderung des Richtungsstatus des Zeichens zu realisieren. Der
dritte Punkt: KeyEvent e.getKeyCode gibt den Schlüsselwert zurück, der dem gedrückten Schlüssel entspricht. Beziehen Sie sich auf die Schlüsselwerteigenschaft von KeyEvent. Java 8 Online API

Erstellen Sie die Objektmethode Buffoon.move ()

    public void move(String dir){
    
    
        switch (dir){
    
    
            case "UP":
                this.y -= this.speed;
                setDir("STOP");
                break;
            case "DOWN":
                this.y += this.speed;
                setDir("STOP");
                break;
            case "RIGHT":
                this.x += this.speed;
                setDir("STOP");
                break;
            case "LEFT":
                this.x -= this.speed;
                setDir("STOP");
                break;
        }

Jedes Mal, wenn ein Schlüsselereignis überwacht wird, wird die Verschiebungsmethode aufgerufen, um die Bewegung des Possenreißerobjekts zu realisieren

Rufen Sie die Verschiebungsmethode jedes Mal auf, wenn ein Schlüsselereignis überwacht wird

Prinzip der Objektbewegung

Das bewegte Bild des Objekts wird auch als Animation bezeichnet. Es zeigt eine Reihe fortlaufender animierter Bilder Bild für Bild auf dem Bildschirm an und zeigt dann in kurzen Abständen das nächste Bild an. Dies wird unter Verwendung der „Persistenz des menschlichen Auges“ des menschlichen Auges wiederholt. 'Das Phänomen fühlt sich subjektiv an, als würden sich die Objekte auf dem Bild bewegen.
FPS (Frames Per Second) ist die Anzahl der Frames pro Sekunde. Ein Bild ist ein statisches Porträt, und die Wiedergabegeschwindigkeit des Films beträgt 24 fps. Je mehr Bilder, desto weicher ist die angezeigte Bewegung. Im Allgemeinen beträgt das Minimum zur Vermeidung ruckartiger Bewegungen 30 FPS. FPS Baidu Enzyklopädie

Animierter beweglicher Porter-Thread

Was ist ein Thread? Ein
Thread ist die kleinste Einheit, die ein Betriebssystem für die Operationsplanung ausführen kann. Es ist im Prozess enthalten und ist die eigentliche Bedieneinheit im Prozess. Ein Thread bezieht sich auf einen einzelnen sequentiellen Steuerungsfluss in einem Prozess. In einem Prozess können mehrere Threads gleichzeitig ausgeführt werden, und jeder Thread führt parallel verschiedene Aufgaben aus.

/**
 * 定义一个重新绘制画面的线程,相当于招一个工人专门去从事这项工作
 */
public class RePaintThread implements Runnable{
    
    
    @Override
    //线程操作的全都在run方法中
    public void run() {
    
    
        while (true){
    
    
            //每50毫秒 执行一次
            try {
    
    
                Thread.sleep(20);
                //重新绘制图像
                gameClient.repaint();
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            }
        }
    }

Punkt 1:
Öffentliche Klasse der ausführbaren Schnittstelle RePaintThread implementiert Runnable
Wenn Sie einen Thread mit einem Objekt erstellen, das die Schnittstelle Runnable implementiert, wird beim Starten des Threads die Ausführungsmethode des Objekts in einem unabhängig ausgeführten Thread aufgerufen.
Punkt zwei: Überschreiben der
Ausführungsmethode Der allgemeine Vertrag der Ausführungsmethode lautet: Sie kann jede gewünschte Aktion ausführen.
Repaint das Bild
gameClient.repaint ();
Schlüsselpunkt 3: Thread.sleep - das Zeitintervall der wiederholten Ausführung des Threads 1. Verwenden Sie
' While ( true)', um eine Endlosschleife zu erstellen.
2. Führen Sie repaint () in einer Endlosschleife aus, um die Formmethode 3 neu zu malen
. Thread-unterbrochene Ausnahme (InterruptedException) ist eine der Manifestationen des aktuellen Threads, der unterbrochen wird. Wenn Sie auf diese Ausnahme stoßen und nicht wissen, wie Sie damit umgehen sollen, sollten Sie sie nach oben werfen.
catch-Klausel

Ich denke du magst

Origin blog.csdn.net/qq_42760141/article/details/109599610
Empfohlen
Rangfolge