<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 移動精靈 > 原文: [https://zetcode.com/tutorials/javagamestutorial/movingsprites/](https://zetcode.com/tutorials/javagamestutorial/movingsprites/) 在 Java 2D 游戲教程的這一部分中,我們將使用精靈。 術語精靈具有多種含義。 它用于表示場景中的圖像或動畫。 它也用于表示游戲中的任何可移動對象。 含義之一也是在游戲中封裝角色的代碼。 在我們的教程中,通過使用精靈,我們引用了一個可移動對象或其 Java 類。 ## 移動精靈 在第一個示例中,我們有一個太空飛船。 我們可以使用光標鍵在板上移動宇宙飛船。 `SpaceShip.java` ```java package com.zetcode; import java.awt.Image; import java.awt.event.KeyEvent; import javax.swing.ImageIcon; public class SpaceShip { private int dx; private int dy; private int x = 40; private int y = 60; private int w; private int h; private Image image; public SpaceShip() { loadImage(); } private void loadImage() { ImageIcon ii = new ImageIcon("src/resources/spaceship.png"); image = ii.getImage(); w = image.getWidth(null); h = image.getHeight(null); } public void move() { x += dx; y += dy; } public int getX() { return x; } public int getY() { return y; } public int getWidth() { return w; } public int getHeight() { return h; } public Image getImage() { return image; } public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if (key == KeyEvent.VK_LEFT) { dx = -2; } if (key == KeyEvent.VK_RIGHT) { dx = 2; } if (key == KeyEvent.VK_UP) { dy = -2; } if (key == KeyEvent.VK_DOWN) { dy = 2; } } public void keyReleased(KeyEvent e) { int key = e.getKeyCode(); if (key == KeyEvent.VK_LEFT) { dx = 0; } if (key == KeyEvent.VK_RIGHT) { dx = 0; } if (key == KeyEvent.VK_UP) { dy = 0; } if (key == KeyEvent.VK_DOWN) { dy = 0; } } } ``` 此類代表一艘太空飛船。 在此類中,我們保留子畫面的圖像和子畫面的坐標。 `keyPressed()`和`keyReleased()`方法控制精靈是否在移動。 ```java public void move() { x += dx; y += dy; } ``` `move()`方法更改子畫面的坐標。 這些 x 和 y 值在`paintComponent()`方法中用于繪制子畫面的圖像。 ```java if (key == KeyEvent.VK_LEFT) { dx = 0; } ``` 釋放左光標鍵時,將`dx`變量設置為零。 航天器將停止移動。 `Board.java` ```java package com.zetcode; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swing.JPanel; import javax.swing.Timer; public class Board extends JPanel implements ActionListener { private Timer timer; private SpaceShip spaceShip; private final int DELAY = 10; public Board() { initBoard(); } private void initBoard() { addKeyListener(new TAdapter()); setBackground(Color.black); setFocusable(true); spaceShip = new SpaceShip(); timer = new Timer(DELAY, this); timer.start(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); Toolkit.getDefaultToolkit().sync(); } private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.drawImage(spaceShip.getImage(), spaceShip.getX(), spaceShip.getY(), this); } @Override public void actionPerformed(ActionEvent e) { step(); } private void step() { spaceShip.move(); repaint(spaceShip.getX()-1, spaceShip.getY()-1, spaceShip.getWidth()+2, spaceShip.getHeight()+2); } private class TAdapter extends KeyAdapter { @Override public void keyReleased(KeyEvent e) { spaceShip.keyReleased(e); } @Override public void keyPressed(KeyEvent e) { spaceShip.keyPressed(e); } } } ``` 這是`Board`類。 ```java private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.drawImage(ship.getImage(), ship.getX(), ship.getY(), this); } ``` 在`doDrawing()`方法中,我們使用`drawImage()`方法繪制宇宙飛船。 我們從精靈類中獲得圖像和坐標。 ```java @Override public void actionPerformed(ActionEvent e) { step(); } ``` `actionPerformed()`方法每`DELAY` ms 調用一次。 我們稱為`step()`方法。 ```java private void step() { ship.move(); repaint(ship.getX()-1, ship.getY()-1, ship.getWidth()+2, ship.getHeight()+2); } ``` 我們移動精靈并重新粉刷已更改的電路板部分。 我們使用一種小的優化技術,該技術僅重新繪制實際更改的窗口的小區域。 ```java private class TAdapter extends KeyAdapter { @Override public void keyReleased(KeyEvent e) { craft.keyReleased(e); } @Override public void keyPressed(KeyEvent e) { craft.keyPressed(e); } } ``` 在`Board`類中,我們監聽關鍵事件。 `KeyAdapter`類的重寫方法將處理委托給`Craft`類的方法。 `MovingSpriteEx.java` ```java package com.zetcode; import java.awt.EventQueue; import javax.swing.JFrame; public class MovingSpriteEx extends JFrame { public MovingSpriteEx() { initUI(); } private void initUI() { add(new Board()); setTitle("Moving sprite"); setSize(400, 300); setLocationRelativeTo(null); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(() -> { MovingSpriteEx ex = new MovingSpriteEx(); ex.setVisible(true); }); } } ``` 這是主要的類。 ![Moving sprite](https://img.kancloud.cn/3d/8d/3d8d2260fd512d06a9b6f3d3d0f6e2b8_400x300.jpg) 圖:移動精靈 ## 射擊導彈 在下一個示例中,我們在示例中添加了另一個精靈類型-導彈。 用 `Space` 鍵發射導彈。 `Sprite.java` ```java package com.zetcode; import java.awt.Image; import javax.swing.ImageIcon; public class Sprite { protected int x; protected int y; protected int width; protected int height; protected boolean visible; protected Image image; public Sprite(int x, int y) { this.x = x; this.y = y; visible = true; } protected void loadImage(String imageName) { ImageIcon ii = new ImageIcon(imageName); image = ii.getImage(); } protected void getImageDimensions() { width = image.getWidth(null); height = image.getHeight(null); } public Image getImage() { return image; } public int getX() { return x; } public int getY() { return y; } public boolean isVisible() { return visible; } public void setVisible(Boolean visible) { this.visible = visible; } } ``` `Sprite`類共享`Missile`和`SpaceShip`類的通用代碼。 ```java public Sprite(int x, int y) { this.x = x; this.y = y; visible = true; } ``` 構造器初始化 x 和 y 坐標以及`visible`變量。 `Missile.java` ```java package com.zetcode; public class Missile extends Sprite { private final int BOARD_WIDTH = 390; private final int MISSILE_SPEED = 2; public Missile(int x, int y) { super(x, y); initMissile(); } private void initMissile() { loadImage("src/resources/missile.png"); getImageDimensions(); } public void move() { x += MISSILE_SPEED; if (x > BOARD_WIDTH) { visible = false; } } } ``` 在這里,我們有一個名為`Missile`的新精靈。 ```java public void move() { x += MISSILE_SPEED; if (x > BOARD_WIDTH) { vis = false; } } ``` 導彈以恒定速度運動。 當它碰到`Board`的右邊界時,它變得不可見。 然后將其從導彈列表中刪除。 `SpaceShip.java` ```java package com.zetcode; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.List; public class SpaceShip extends Sprite { private int dx; private int dy; private List<Missile> missiles; public SpaceShip(int x, int y) { super(x, y); initSpaceShip(); } private void initSpaceShip() { missiles = new ArrayList<>(); loadImage("src/resources/spaceship.png"); getImageDimensions(); } public void move() { x += dx; y += dy; } public List<Missile> getMissiles() { return missiles; } public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if (key == KeyEvent.VK_SPACE) { fire(); } if (key == KeyEvent.VK_LEFT) { dx = -1; } if (key == KeyEvent.VK_RIGHT) { dx = 1; } if (key == KeyEvent.VK_UP) { dy = -1; } if (key == KeyEvent.VK_DOWN) { dy = 1; } } public void fire() { missiles.add(new Missile(x + width, y + height / 2)); } public void keyReleased(KeyEvent e) { int key = e.getKeyCode(); if (key == KeyEvent.VK_LEFT) { dx = 0; } if (key == KeyEvent.VK_RIGHT) { dx = 0; } if (key == KeyEvent.VK_UP) { dy = 0; } if (key == KeyEvent.VK_DOWN) { dy = 0; } } } ``` 這是`SpaceShip`類。 ```java if (key == KeyEvent.VK_SPACE) { fire(); } ``` 如果按`空格鍵`,則會觸發。 ```java public void fire() { missiles.add(new Missile(x + width, y + height / 2)); } ``` `fire()`方法創建一個新的`Missile`對象并將其添加到導彈列表中。 ```java public List<Missile> getMissiles() { return missiles; } ``` `getMissiles()`方法返回導彈列表。 從`Board`類調用它。 `Board.java` ```java package com.zetcode; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.List; import javax.swing.JPanel; import javax.swing.Timer; public class Board extends JPanel implements ActionListener { private final int ICRAFT_X = 40; private final int ICRAFT_Y = 60; private final int DELAY = 10; private Timer timer; private SpaceShip spaceShip; public Board() { initBoard(); } private void initBoard() { addKeyListener(new TAdapter()); setBackground(Color.BLACK); setFocusable(true); spaceShip = new SpaceShip(ICRAFT_X, ICRAFT_Y); timer = new Timer(DELAY, this); timer.start(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); doDrawing(g); Toolkit.getDefaultToolkit().sync(); } private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.drawImage(spaceShip.getImage(), spaceShip.getX(), spaceShip.getY(), this); List<Missile> missiles = spaceShip.getMissiles(); for (Missile missile : missiles) { g2d.drawImage(missile.getImage(), missile.getX(), missile.getY(), this); } } @Override public void actionPerformed(ActionEvent e) { updateMissiles(); updateSpaceShip(); repaint(); } private void updateMissiles() { List<Missile> missiles = spaceShip.getMissiles(); for (int i = 0; i < missiles.size(); i++) { Missile missile = missiles.get(i); if (missile.isVisible()) { missile.move(); } else { missiles.remove(i); } } } private void updateSpaceShip() { spaceShip.move(); } private class TAdapter extends KeyAdapter { @Override public void keyReleased(KeyEvent e) { spaceShip.keyReleased(e); } @Override public void keyPressed(KeyEvent e) { spaceShip.keyPressed(e); } } } ``` This is the `Board` class. ```java private void doDrawing(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.drawImage(spaceShip.getImage(), spaceShip.getX(), spaceShip.getY(), this); List<Missile> missiles = spaceShip.getMissiles(); for (Missile missile : missiles) { g2d.drawImage(missile.getImage(), missile.getX(), missile.getY(), this); } } ``` 在`doDrawing()`方法中,我們繪制飛行器和所有可用的導彈。 ```java private void updateMissiles() { List<Missile> missiles = spaceShip.getMissiles(); for (int i = 0; i < missiles.size(); i++) { Missile missile = missiles.get(i); if (missile.isVisible()) { missile.move(); } else { missiles.remove(i); } } } ``` 在`updateMissiles()`方法中,我們解析`missiles`列表中的所有導彈。 根據`isVisible()`方法返回的內容,我們要么移動導彈,要么將其從容器中取出。 `ShootingMissilesEx.java` ```java package com.zetcode; import java.awt.EventQueue; import javax.swing.JFrame; public class ShootingMissilesEx extends JFrame { public ShootingMissilesEx() { initUI(); } private void initUI() { add(new Board()); setSize(400, 300); setResizable(false); setTitle("Shooting missiles"); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { EventQueue.invokeLater(() -> { ShootingMissilesEx ex = new ShootingMissilesEx(); ex.setVisible(true); }); } } ``` 最后,這是主要類。 ![Shooting missiles](https://img.kancloud.cn/a5/e7/a5e7b0d9578f7d21e13918e1ef31bec4_400x300.jpg) 圖:發射導彈 在本章中,我們介紹了精靈。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看