追逐算法之--牛鞭的子弹是怎样练成的(1)--游戏主框架

       从小我就知道,我这辈子注定不会有什么出息,纵观古今中外大人物的童年,不是像丘吉尔,爱因斯坦这样的智障脑残,就是像马克思,李嘉诚这样的贫困儿童。而我,从小作为一个公认的神童,几乎每个见了我的人,都要指着我的鼻子夸个半天。我不禁仰天长啸,“老天啊,你大爷的为什么对我这么不公平!“

 

    想当年我还是六七岁的小孩,就已经开始了自己创业之旅,每个月都可以有10—200块以上不等的稳定收入。主要的盈利模式有两种:第一种模式收益较低,就是每当父母上班之后,把他们所有的衣服口袋挨个翻一遍,一般可以找到一些零星的硬币,积少成多,一个月也能有至少5块以上的收益,虽然收益少了一些,但是毕竟风险小,父母不易察觉。(ps:那时的游戏币一块钱10个,现在的一块钱至多2个,因此那会的5块大约相当于现在的25元)。

 

    第二种盈利模式,收益就很高了,就是直接翻钱包,这个具体的收益要依据个人的风险承担能力,和个人魄力来决定了,一般收益至少在10元以上,当然这种方式的风险很大,通常都会被发现。而我作为一个公认的胆大心细的神童,主要的收入都是靠后一种方式。

 

    神童归神童,被发现的情况还是常事,每当父母板着脸过来质问我钱怎么没了,我通常会极其惊讶的大叫起来“我的天!你怎么又丢了钱!“或者一脸无辜并且莫名其妙的说”What? I Don't Know What Are You Talking About!“,只要表情,语气够到位,通常你的父母不会认为自己生了个逆子,而会认为自己提前患上了老年痴呆。我不是一个爱看书的人,但一直有一本书常备我的案头---《演员的自我修养》

 

    ok!下面开始我们今天的第一次游戏AI的学习之旅,首先我们需要先搭一个简单的游戏框架做为AI演示的平台,这里我采用javaSwing来搭建基本的框架,这并不是我们教程的重点,实际上你会不会都没有关系,因为一来这个框架极其简单,加起来不到200行的代码。另一方面,我不希望这些细枝末节影响到我们AI教学的纯粹性,当各位码农兄弟在实际开发的时候,其实是有现成的引擎把这些框架搭好的。如果你非要研究一下,其实也不是什么问题,因为框架的每一句话我都加上了注释。不过我建议如果你看不懂,那么就别看了,反正看着心里也是病。

 

    下面我简单的介绍一下游戏主框架的各个部分,我们今后的每一个AI教程都是在这个框架上来进行开发,所以源码请大家好好的保留。

 

     在开始讲解前我首先要很严肃的对整个程序界提出一个郑重的意见,几乎我看到的所有有关编程语言的书,或是有关计算机任何方面的书都像着了魔似地,总是在第一课让读者打印一句“hello world”,作为一个神童,我对这个极端教条式的教学方式表达强烈的不满,因此今天,我教大家打印两句! 

 

下面的GameFrame类就是游戏的主入口,如果你要运行游戏,那么就在这个类里面进行

 

import java.awt.Container;

import javax.swing.JFrame;
public class GameFrame extends JFrame{
	public static GameHandler gameLogical;
	public static GamePanel gamePanel;
	public GameFrame() {
        //设置窗体标题
        setTitle("追踪AI之牛鞭的子弹该怎么玩");
  
        //实例化自定义面板
        gamePanel = new GamePanel();
        
        //处理游戏的主逻辑
        gameLogical= new GameHandler();
        
        //启动主逻辑线程
        new Thread(gameLogical).start();
        
        //获得当前窗体[容器]的实例,实际上可以直接设定
        Container contentPane = getContentPane();

        //加载自定义的面板到窗体中,就好比在底板上再帖一层画面。
        //也就是说显示什么内容,是由我们加载那个[面板]来决定的,可以轻松
        //的实现游戏中不同画面间的切换.
        contentPane.add(gamePanel);

        //自动整合窗体
        pack();
    }

	//程序的总入口
	public static void main(String[]args){
		GameFrame gameFrame=new GameFrame();
        
		//令窗体接受关闭[事件]
         gameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         
         //让窗体显示
         gameFrame.setVisible(true);
	}
}

 

下面的GamePanel类主要用来设定游戏窗口面板的一些初始化属性,对于我们来说,你完全可以忽略掉这个类,因为在后面的学习中,你没有机会触碰到它

 

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;


public class GamePanel extends JPanel implements KeyListener{
   
    public GamePanel() {
    //设置背景颜色R,G,B参数,
    setBackground(new Color(0,0,0));
    
    //设置面板的默认大小
    setPreferredSize(new Dimension(GameLogical.FRAME_WIDTH, GameLogical.FRAME_HEIGHT));      
   
    //设定焦点在本窗体并付与监听对象
    setFocusable(true);
    addKeyListener(this);
    }

    /**
     *   Graphics为java.awt下所有类,用以[描绘]图形界面
     * 大多数Java下的图形界面开发时,都是以此类为基础的。
     */
    public void paintComponent(Graphics g) {
    //这里我们没有自定义Graphics,而是直接调用[父类]的同名方法实现。
        super.paintComponent(g);
        GameFrame.gameLogical.draw(g);
    }
    
	//按下键盘事件
	@Override
	public void keyPressed(KeyEvent e) {
		GameFrame.gameLogical.keyPressed(e);
	}
	
	//释放键盘事件
	@Override
	public void keyReleased(KeyEvent e) {
		GameFrame.gameLogical.keyReleased(e);
	}
	
	//字符输入事件
	@Override
	public void keyTyped(KeyEvent e) {
	}
}

 

    最后这个类是最最最重要的一个类GameHandler ,我们今后主要打交道的就是它,它是一个线程类,每秒让线程休眠25ms,以产生一个类似主循环的概念,当然这是一种非常简陋的做法,但是不影响我们的AI教学,你可以直接修改这里的FPS值,以达到改变FPS的效果

//游戏的FPSpublic static final int FPS =40 ;

 

 

   游戏中的主循环中包含了两个子循环,一个是画图循环,就是这个

 

//处理每一帧的画图动作public void draw(Graphics g){}  ,

 

   另一个是逻辑循环,就是这个 

//处理每一帧的逻辑处理public void logical(){},

 

今后我们游戏中有关绘制图像的部分都会以这个draw函数为入口,所有有关逻辑处理的部分都放在这个

logical(){}函数中,下面的几个有关key的函数就很明显了,是游戏中的各种键盘事件的入口。

  

这三个类中唯一需要我们关心的就是就是这个类,具体的说,是里面的draw 函数和logical函数。

  

另一个需要注意的问题是draw函数中的参数Graphics g 这是个什么东东,你可以把它简单的想像成一只马良的神奇画笔,可以画出各种形状,可以画出文字,可以画出图片,可以画出五颜六色的线条等等。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;


public class GameHandler implements Runnable {
    //游戏的FPS
    public static final int FPS =40 ;
    //定义全局常量,游戏窗口的宽度和高度
    public static final int FRAME_WIDTH = 600;
    public static final int FRAME_HEIGHT = 800;
	//处理每一帧的画图动作
	public void draw(Graphics g){
		//设置画笔颜色为白色
		g.setColor(Color.WHITE);
        //在(140,140)坐标上,画出你好 世界!
		g.drawString("hello world!", 140, 140);
		g.drawString("hello world!", 140, 160);
	}
	
	//处理每一帧的逻辑处理
	public void logical(){
		
	}
	
	//按下键盘事件
	public void keyPressed(KeyEvent e) {
		//获得按键编号
        int keyCode = e.getKeyCode();
        //后面会添加具体按键匹配
        switch (keyCode) {
        }
	}
	
	//释放键盘事件
	public void keyReleased(KeyEvent e) {
		//获得按键编号
        int keyCode = e.getKeyCode();
        //后面会添加具体按键匹配
        switch (keyCode) {
        }
}
	
	@Override
	public void run() {
		while(true){
			
			//执行一次逻辑处理函数
			this.logical();
			
			//使面板重绘一次,repaint方法会调用GamePanel中的paintComponent方法
			GameFrame.gamePanel.repaint();
			
			try {
				//线程每隔25ms休眠一次,即每秒执行40次此函数,即FPS=40
				Thread.sleep(1000/FPS);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

 

如果你的程序运行之后是下面这样的,那么恭喜你,你的智商这辈子都成不了伟人了!

如果你看完了我上面的讲解,就像是在听金刚经,那么我真得很羡慕你,你可以完全不用理解我上面的这些东西,接着往下学习,因为时间会让你无师自通!

 

 

源码下载地址:http://download.csdn.net/detail/azhangzhengtong/5221348

评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值