java游戲開發雜談 - 游戲物體


現實生活中,有很多物體,每個物體的長相、行為都不同。

物體存在於不同的空間內,它只在這個空間內發生作用。

物體沒用了,空間就把它剔除,不然既占地方,又需要花精力管理。

需要它的時候,就把它造出來,不需要它的時候,就把它銷毀。


按照面向對象的設計思想,游戲里的物體,我們也把它定義為一個類。

一個類就定義了一種物體的屬性、行為。類是對象的模板,對象是類的實例。

我們用一個集合,把所有的游戲物體都放在里面,對它們進行統一的管理。

隨着游戲線程的運行,集合里的物體,它們的邏輯和繪制也不斷被調用執行。


我這里實現一個例子:游戲里,鼠標點擊哪里,哪里就出現一個方塊,方塊先向上

運動,再往下,當掉落出屏幕后,方塊就從游戲中消除。注意方塊的加速度機制。

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,因為這個鏈表列表,刪除的效率高。


講到這里,基本上一個游戲的雛形,已經建立起來了,剩下的就是在這個框架上,進行完善。

如同我們學繪畫,先要臨摹那些正方體、椎體,正是這些基礎性的東西,構造出很復雜的圖案。

游戲里那些很酷、很炫、很復雜的效果,也都是基於繪制、刷新、線程、事件、有限狀態機。

萬變不離其宗,掌握好基本的東西,剩下的都是些技巧,運用之妙,存乎一心也。

去開發自己的游戲,享受編程的樂趣吧。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM