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

    在不同的阶段,游戏所运行的逻辑、所显示的界面,都是不同的。

    以五子棋举例,游戏开始、游戏中、胜负已分,对应的界面和逻辑都不同。

    在游戏中,又分为:自己下棋、对方下棋、游戏暂停、悔棋等多个状态。

    再比如RPG游戏的人物,站立、行走、奔跑、攻击、死亡都是不同的动画,

    发出一颗子弹,从出现,到往前运动、打到目标,或飞出屏幕,都是不同逻辑。


    怎么实现这些效果呢?

    程序里设定不同的状态,当前是什么状态,就执行什么逻辑。

    这个就叫做:有限状态机!

    是不是很简单,不要小瞧它,复杂的游戏功能都是靠它实现的。


    接下来我们用代码来实现一个简单的效果,

    还以小方块为例,让它在屏幕上,以规定方式运动。

    package game6;
    
    import java.awt.Color;
    import java.awt.Graphics;
    
    import javax.swing.JPanel;
    /**
     * java游戏开发杂谈
     * ---demo6:有限状态机
     * 
     * @author 台哥编程课堂
     * https://www.cnblogs.com/chaohi/
     * 
     * @date 2019-04-25
     */
    
    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);
    		
    		//绘制方块,大小为80
    		g.setColor(Color.red);
    		g.fillRect(fk_x, fk_y, 80, 80);
    	}
    
    	
    	//四个状态,对应四个方向的运动
    	private static final int stage_left = 0;
    	private static final int stage_right = 1;
    	private static final int stage_up = 2;
    	private static final int stage_down = 3;
    	
    	//当前状态,初始为向右
    	private int stage = stage_right;
    	
    	/**
    	 * 游戏逻辑,处理方块的运动,每次横纵坐标都移动1个像素
    	 */
    	public void logic()
    	{
    		switch(stage)
    		{
    		case stage_right:
    			if(fk_x < 260){
    				fk_x = fk_x + 1; //右移一个像素
    			}else{
    				stage = stage_down; //超出指定范围,改为向下状态
    			}
    			break;
    		case stage_down:
    			if(fk_y < 260){
    				fk_y = fk_y + 1;
    			}else{
    				stage = stage_left;
    			}
    			break;
    		case stage_left:
    			if(fk_x > 60){
    				fk_x = fk_x - 1; 
    			}else{
    				stage = stage_up;
    			}
    			break;
    		case stage_up:
    			if(fk_y > 60){
    				fk_y = fk_y - 1; 
    			}else{
    				stage = stage_right;
    			}
    			break;
    		}
    		
    	}
    	
    	
    }
    

    另外两个类GameFrame和GameThread,跟上一篇博客里的一样,这里不贴出来了。


    程序运行的效果,就是红色方块从左上角开始,右移、下移、左移、上移,顺时针循环。

    代码里我们是定义了四个状态,分别对应四个方向下的运动,

    在游戏线程的逻辑方法里,根据当前状态,进行位置属性的更改,线程再调取界面重绘。


    java游戏开发杂谈,这是第十篇了,游戏编程的入门知识,介绍的也差不多了。

    用的代码例子,界面都很粗糙,因为目的是介绍知识点,越简化,越容易理解。

    我还要不要继续写呢。。广州的天气呀,越来越热了,一到下午就容易犯困。。

    如果大家看了有收获,欢迎留言,或加我微信:taigecailing

  • 相关阅读:
    Hadoop与分布式开发
    Hadoop体系结构
    MapReduce基本流程与设计思想初步
    hadoop集群启动时DataNode节点启动失败
    初识Hadoop
    国家标准免费下载网站大全
    Effective C++ 之 Item 3:尽可能使用 const
    Effective C++ 之 Item 2:尽量以 const, enum, inline 替换 #define
    Effective C++ 之 Item 1: 视C++为一个语言联邦
    Effective C++ 之 0 导读(Introduction)
  • 原文地址:https://www.cnblogs.com/chaohi/p/10773608.html
Copyright © 2011-2022 走看看