現實生活中,有不少物體,每一個物體的長相、行爲都不一樣。java
物體存在於不一樣的空間內,它只在這個空間內發生做用。編程
物體沒用了,空間就把它剔除,否則既佔地方,又須要花精力管理。框架
須要它的時候,就把它造出來,不須要它的時候,就把它銷燬。ide
按照面向對象的設計思想,遊戲裏的物體,咱們也把它定義爲一個類。this
一個類就定義了一種物體的屬性、行爲。類是對象的模板,對象是類的實例。線程
咱們用一個集合,把全部的遊戲物體都放在裏面,對它們進行統一的管理。設計
隨着遊戲線程的運行,集合裏的物體,它們的邏輯和繪製也不斷被調用執行。對象
我這裏實現一個例子:遊戲裏,鼠標點擊哪裏,哪裏就出現一個方塊,方塊先向上blog
運動,再往下,當掉落出屏幕後,方塊就從遊戲中消除。注意方塊的加速度機制。繼承
package game7; import java.awt.Color; import java.awt.Graphics; /** * java遊戲開發雜談 * ---demo7:遊戲物體 * * @author 臺哥編程課堂 * https://www.cnblogs.com/chaohi/ * * @date 2019-04-25 */ public class FangKuai extends GameObject{ private GamePanel panel; public FangKuai(GamePanel panel){ this.panel = panel; } //縱座標超出多少,就銷燬 public int limit_y ; private int u = -10; //速度 private int a = 1; //加速度 @Override public void logic() { x = x + 1; y = y + u; u = u + a; if(y > limit_y){ destory(); } } @Override public void paint(Graphics g) { g.setColor(Color.red); g.fillRect(x, y, 30, 30); } /** * 自身銷燬方法,即從遊戲屏幕中消失 */ private void destory(){ panel.remove(this); } }
package game7; import java.awt.Graphics; /** * java遊戲開發雜談 * ---demo7:遊戲物體 * * @author 臺哥編程課堂 * https://www.cnblogs.com/chaohi/ * * @date 2019-04-26 */ public class GameObject { //所在位置 public int x, y; //自身邏輯 public void logic(){ } //自身繪製 public void paint(Graphics g){ } }
package game7; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.LinkedList; import java.util.List; import javax.swing.JPanel; /** * java遊戲開發雜談 * ---demo7:遊戲物體 * * @author 臺哥編程課堂 * https://www.cnblogs.com/chaohi/ * * @date 2019-04-25 */ public class GamePanel extends JPanel implements MouseListener{ /** 屏幕的寬和高 */ private int width,height; public GamePanel(int width, int height) { this.width = width; this.height = height; this.setSize(width, height); //設置當前畫布能夠得到焦點。 this.setFocusable(true); this.addMouseListener(this); } /** * 遊戲物體所在的集合 */ private List<GameObject> objects = new LinkedList<GameObject>(); /** * 畫布的繪製 */ public void paintComponent(Graphics g) { super.paintComponent(g); //畫綠色背景 g.setColor(new Color(0x9391d6)); g.fillRect(0, 0, width, height); //繪製出全部遊戲物體 for (int i = 0; i < objects.size(); i++) { GameObject go = objects.get(i); go.paint(g); } } /** * 遊戲邏輯,調用全部遊戲物體的邏輯 */ public void logic() { for (int i = 0; i < objects.size(); i++) { GameObject g = objects.get(i); g.logic(); } } public void remove(GameObject object){ objects.remove(object); } @Override public void mouseClicked(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { FangKuai fk = new FangKuai(this); fk.x = e.getX() - 15; fk.y = e.getY() - 15; fk.limit_y = this.height; this.objects.add(fk); } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }
另外的GameFrame和GameThread兩個類,跟前面兩篇博客的同樣,這裏就不重複貼出了。
遊戲的運行截圖也不發了,你們能夠本身運行下代碼,反正就是方塊的生成、運動、銷燬。
方塊繼承的是GameObject類,咱們繼續定義圓形、三角形、五角星等,都讓它們繼承GameObject,
也能夠定義子彈、飛機、植物、地圖、人物、怪物等等,只要有行爲的物體,均可以繼承GameObject。
而後用一個集合來統一管理它們。順便說下爲何用LinkedList,由於這個鏈表列表,刪除的效率高。
講到這裏,基本上一個遊戲的雛形,已經創建起來了,剩下的就是在這個框架上,進行完善。
如同咱們學繪畫,先要臨摹那些正方體、椎體,正是這些基礎性的東西,構造出很複雜的圖案。
遊戲裏那些很酷、很炫、很複雜的效果,也都是基於繪製、刷新、線程、事件、有限狀態機。
萬變不離其宗,掌握好基本的東西,剩下的都是些技巧,運用之妙,存乎一心也。
去開發本身的遊戲,享受編程的樂趣吧。。