zoukankan      html  css  js  c++  java
  • java游戏开发杂谈

    线程,让游戏拥有了动态变化的能力。

    java的图形界面,在启动的时候,就开始了一个线程。

    这个线程负责处理:JFrame、JPanel等的绘制、事件处理。

    它是由操作系统调用的,在程序启动时开启,程序关闭时消亡。

    这个线程里执行的逻辑,支撑着图形框架的基础逻辑,我们无法控制它。


    想一下,游戏里那些动画效果、呼啸而出的子弹、飘来飘去的云朵。。

    这些行为都不是我们用按键和鼠标来控制的,是随着时间自己在动的。

    它们在动,说明它们的坐标发生了变化,那么谁来控制这些坐标变化的呢?

    答案是:另一个线程!


    先看一段线程的代码吧:

    package game5;
    /**
     * java游戏开发杂谈
     * ---demo5:引入线程
     * 
     * @author 台哥编程课堂
     * https://www.cnblogs.com/chaohi/
     * 
     * @date 2019-04-23
     */
    public class GameThread extends Thread{
    	
    	private GamePanel panel;
    	
    	public GameThread(GamePanel panel){
    		this.panel = panel;
    	}
    	
    	public void run() {
    		while(true){
    			try {
    				//程序运行暂停 0.01秒
    				Thread.sleep(10); 
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    			
    			//循环逻辑的执行
    			panel.logic();
    			
    			//页面刷新
    			panel.repaint();
    		}
    	}
    	
    }
    

    这就是我们定义的、用来控制游戏动态逻辑的、每隔0.01秒就运行一次的线程!

    可以把它想成一个定时器,每隔一段时间,就运行一次某个动作。

    运行什么动作呢?  游戏的动态逻辑、游戏界面的刷新!


    再贴出剩下的两块代码,如下:

    package game5;
    
    import java.awt.Color;
    import java.awt.Graphics;
    
    import javax.swing.JPanel;
    /**
     * java游戏开发杂谈
     * ---demo5:引入线程
     * 
     * @author 台哥编程课堂
     * https://www.cnblogs.com/chaohi/
     * 
     * @date 2019-04-23
     */
    
    public class GamePanel extends JPanel{
    	/** 屏幕的宽和高 */
    	private int width,height;
    	
    	public GamePanel(int width, int height) {
    		this.width = width;
    		this.height = height;
    		this.setSize(width, height);
    		
    		//设置当前画布可以获得焦点。
    		this.setFocusable(true);
    	}
    	
    	/**方块的位置*/
    	private int fk_x = 60;
    	private int fk_y = 60;
    	
    	
    	/**
    	 * 画布的绘制
    	 */
    	public void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		
    		//画绿色背景
    		g.setColor(new Color(0x9391d6));
    		g.fillRect(0, 0, width, height);
    		
    		//绘制方块
    		g.setColor(Color.red);
    		g.fillRect(fk_x, fk_y, 80, 80);
    	}
    
    	
    	/**
    	 * 游戏逻辑,处理方块的运动,每次横纵坐标都移动1个像素
    	 */
    	public void logic()
    	{
    		if(fk_x < 260){
    			fk_x = fk_x + 1;
    		}else{
    			fk_x = 60;
    		}
    		
    		if(fk_y < 260){
    			fk_y = fk_y + 1;
    		}else{
    			fk_y = 60;
    		}
    	}
    	
    	
    }
    
    package game5;
    
    import javax.swing.JFrame;
    /**
     * java游戏开发杂谈
     * ---demo5:引入线程
     * 
     * @author 台哥编程课堂
     * https://www.cnblogs.com/chaohi/
     * 
     * @date 2019-04-23
     */
    public class GameFrame extends JFrame{
    	
    	private int width = 600, height = 400;
    	
    	public GameFrame() {
    		//设置窗体标题
    		this.setTitle("java游戏开发杂谈-台哥出品");
    		
    		//创建一个画布
    		GamePanel panel = new GamePanel(width, height);
    		//把画布加入到窗体中
    		getContentPane().add(panel, "Center");
    		
    		//设置窗体大小
    		this.setSize(width, height); 
    		//设置能否调整窗体大小
    		this.setResizable(false); 
    		//这句会使得在屏幕上居中显示
    		this.setLocationRelativeTo(null);
    		//当关闭窗体的时候退出程序
    		this.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    		//把窗体显示出来
    		this.setVisible(true); 
    		
    		//开始游戏线程的循环
    		GameThread gt = new GameThread(panel);
    		gt.start();
    	}
    
    	/**
    	 * 主方法
    	 */
    	public static void main(String[] args) {
    		GameFrame frame = new GameFrame();
    	}
    }
    

    在游戏界面创建时,我们就创建了游戏线程。游戏界面显示后,游戏线程也随之启动了,然后就不断的调用游戏逻辑、刷新游戏界面。

    我们就可以在逻辑方法里进行物体的坐标修改、动画的帧数切换、人物的行为变化、地图的移动等等,游戏线程里这一刻运行的逻辑,影响着下一刻游戏界面上的变化。


    上面的三段代码,执行后出现的是,一个方块从屏幕左上角往右下角运动,运动一段后再回到左上角。


    最好的学习方法,是实践! 眼过千遍,不如手过一遍!

    老老实实的把代码放进Eclipse,执行一遍,看看效果。改改代码,再看看执行效果。

    用手写,用眼看,用脑想,缺一不可。


    台哥编程课堂,用最口语化的表达,介绍编程如何入门。

    为什么这么口语化呢,因为台哥的表达能力太差啦,实在写不出书面语来。。

     

  • 相关阅读:
    二级指针内存模型(二)
    Winserver-FailoverCluster验证异常
    IIS-This configuration section cannot be used at this path.
    SQL SERVER-Extendevent捕获堵塞
    SQL SERVER-Extendevent
    Powershell-加域脚本
    SQL SERVER-端口Port
    WinServer-SMTP服务
    Linux-开机启动程序
    SQL SERVER-修改服务器名称
  • 原文地址:https://www.cnblogs.com/chaohi/p/10766790.html
Copyright © 2011-2022 走看看