zoukankan      html  css  js  c++  java
  • 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,因为这个链表列表,删除的效率高。


    讲到这里,基本上一个游戏的雏形,已经建立起来了,剩下的就是在这个框架上,进行完善。

    如同我们学绘画,先要临摹那些正方体、椎体,正是这些基础性的东西,构造出很复杂的图案。

    游戏里那些很酷、很炫、很复杂的效果,也都是基于绘制、刷新、线程、事件、有限状态机。

    万变不离其宗,掌握好基本的东西,剩下的都是些技巧,运用之妙,存乎一心也。

    去开发自己的游戏,享受编程的乐趣吧。。

  • 相关阅读:
    获取安卓控件的大小
    最详细eclipse汉化插件安装教程
    android图片的内存优化
    网站性能并发测试工具
    [php]数据结构&算法(PHP描述) 半折插入排序 straight binary sort
    ubuntu 环境变量
    [php]php设计模式 Interator (迭代器模式)
    nginx 显示文件目录
    [php]php设计模式 (总结)
    [php]数据结构&算法(PHP描述) 冒泡排序 bubble sort
  • 原文地址:https://www.cnblogs.com/chaohi/p/10782259.html
Copyright © 2011-2022 走看看