JAVA游戏入门开发DAY 3 接收用户输入

来源:互联网 发布:数据大魔王txt下载 编辑:程序博客网 时间:2024/06/05 00:23

欢迎来到DAY3

可能进度上有点慢,但是我觉得如果能让尽可能多的人看得懂,听得明白,慢也值得,太快而又不明所以,这样就会欲速则不达,只有一步一脚印,循序渐进,才能学到东西,学有所成。另外这里注重介绍原理,一些游戏编程的原理,尽可能做到由浅入深,其实凡事都是有一个进化过程,从简单到复杂,从初级到高级,如果初级都没搞懂什么原理就直接看高级的代码,这样毫无意义,写书的倒是方便了,很多人就是这么写书,直接将最终高级代码一贴,完事,倒是苦了读者。而这一个教程,根据老外的思路,其实很多外国教科书都是这种思路,就是从简单到复杂,揭示事物进化过程,从初级到高级,注重教会原理,提高实际操作技能,在大学上过双语课,读过外国教科书的人应该也明白,老外的书例子都是从一些很简单题目(几乎弱智的题目)再到高级例题逐步提高的,这种方法比较能够让人接受。


废话不多说了,直接开始吧。


由于我们写的游戏,玩游戏嘛,是你玩游戏,不是游戏玩你,所以必须要与用户交互,游戏机有手柄,玩家可以透过手柄将自己的操作告诉游戏机,电脑游戏也一样,我们可以通过键盘或者鼠标来操作游戏,玩过游戏的人都知道了,就不多说了。


而用户点击鼠标,或者敲击键盘,传入计算机,计算机接收到这个信号,这一连串的过程,专业术语叫做事件。而如果鼠标在我们程序的窗口发生移动、点击,或者说我们的焦点所在程序窗口(也就是这个窗口在最上方,我们正在用的那个,如你现在正在看我的网页,那么当前的浏览器,就是获得了焦点的程序)发生的操作,我们叫做窗口事件。


然后我们要接收来这些事件,根据事件来判断我们的游戏程序应该如何运行,那么这个用来接收事件的玩意,我们叫监听器,其实监听器是一连串的程序,逻辑抽象一下,从另外一个角度说,这个程序就是专门用来不断检测用户输入,监听用户在做什么,然后在传达给程序,让程序作出相应的反应,我们都叫监听器,在本游戏,我们主要是通过键盘来操作游戏,所以说,我们需要一个键盘的监听器。


以上是我粗略做的一个关于窗口事件,监听器的解释,下面开始翻译老外的正文


简单来说吧,为了让游戏对用户的键盘操作进行反馈,我们就要做一下几件事:

1.为了监听(也就是检测用户对键盘的操作)键盘到底按了还是按了之后松开了,我们需要一个监听器(这不是废话么?呵呵)(不过这里解释一下,键盘按下是一个事件,键盘按下之后松开也是另外一个事件,就好比你打CS,如果要前进的话,就必须按W,如果不按的话,人就原地不动了,要做到这点,就需要通知程序,当你按下W之后前进,松开W之后就停止前进)

2。我们要在init()函数里面实现KeyListener接口,以满足1的要求。

3.为了实现这个接口,我们就需要复写一下三个方法(懂JAVA的话应该都知道,接口只是声明了函数但是没有给具体方法,需要程序员自己去实现),他们分别是:keyPressed()keyReleased(), and keyTyped().


所以,让我们现在开始实现KeyListener吧!(呵呵,老外写得真欢乐)

1.打开StartingClass.java,找到这句:

public class StartingClass extends Applet implements Runnable{

2。你注意到了,这里其实已经实现了一个Runnable接口了,如果要再实现多一个接口的话,就在后面加一个英语输入下的逗号,然后写上KeyLisnter,最后结果如下:

public class StartingClass extends Applet implements Runnable, KeyListener{

当你增加以后,如果你的编程工具版本不够高级的话,又会有报错,这个时候不要慌张,这是因为缺少键盘监听的包包,就好像之前说的,缺少包包补一下就可以了。


如上图所示,只要鼠标移动到红色波浪线,然后就会有这样的提示,选择第一个,大概意思就是导入包包,这样就ok了。


3.(这里我就直接意译)增加了包包之后,又会弹出新错误,正如刚刚所言,接口只是声明了方法的名字,具体内容还没有实现,Java规定,如果你要用接口,就必须实现其方法,因为现在编译器发现你的类中还没有复写接口中的方法,所以说提醒你一下,不然程序就无法运行,此时,你既可以用我之前说的在菜单栏的Source中选Override,然后找到Keylistner类,或者是好像刚刚那样,将鼠标挪到红色波浪线处,然后根据提示选第一个:


(P.S,不好意思忘了选水印位置,下面我会注意一点了,不过还看得清吧?看不清再来问我吧,这个在线编辑工具也真的太不习惯了)


4.点了这个“增加为实现的接口方法”,将会做一下两件事,首先就是将这几个方法添加到你现在的类里面,也就是刚刚说的那三个 keyPressed()keyReleased(), and keyTyped(),然后每个方法中添加一个 KeyEvent 的参数,这个参数其实就是键盘事件了,也就是反映用户在键盘上做了什么事,这里如果稍稍不太懂的话,请往下看。


5.最后,在init()函数中实现KeyLinster,所以要在你里面添加一行句子,通知一下计算机我们这个程序是要接收用户键盘输入的,用户如果动了键盘,就统统通知我(在使用我们这个程序的情况下,程序获得焦点的时候)

addKeyListener(this);


然后现在,我们的程序就变成酱紫了:

package kiloboltgame;import java.applet.Applet;import java.awt.Color;import java.awt.Frame;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;public class StartingClass extends Applet implements Runnable, KeyListener{   @Override   public void init() {      setSize(800, 480);      setBackground(Color.BLACK);      setFocusable(true);            addKeyListener(this);      Frame frame = (Frame) this.getParent().getParent();      frame.setTitle("Q-Bot Alpha");}   @Override   public void start() {   Thread thread = new Thread(this);   thread.start();   }   @Override   public void stop() {   // TODO Auto-generated method stub   }   @Override   public void destroy() {   // TODO Auto-generated method stub   }   @Override   public void run() {      while (true) {         repaint();         try {            Thread.sleep(17);         } catch (InterruptedException e) {            e.printStackTrace();         }      }   }@Overridepublic void keyPressed(KeyEvent e) {    // TODO Auto-generated method stub    }@Overridepublic void keyReleased(KeyEvent e) {    // TODO Auto-generated method stub    }@Overridepublic void keyTyped(KeyEvent e) {    // TODO Auto-generated method stub    }}

老外说,前两个方法顾名思义就不费话了,最后一个如果你想知道的话,请参考:http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/event/KeyEvent.html 呵呵。。。。老外也偷懒。。。


2-7 监听键入


在我们的这个游戏,计划用五个键来控制我们的游戏,四个方向键控制前后左右,还有空格键控制跳。


现在我们就在keyPressed()方法中添加相关的监听代码,以实现对用户输入的监听,因为用户输入多种多样,如果用if语句就会变得臃肿不堪,所以这里采用switch语句


@Overridepublic void keyPressed(KeyEvent e) {   switch (e.getKeyCode()) {   case KeyEvent.VK_UP:   break;   case KeyEvent.VK_DOWN:   break;   case KeyEvent.VK_LEFT:   break;   case KeyEvent.VK_RIGHT:   break;   case KeyEvent.VK_SPACE:   break;   }}


我们这里详细解析一下这段代码(老外讲的还真仔细,迷之感动)学过switch语句都知道,一个switch语句会比较它的输入值,这里要比较的正是这个KeyEvent,可以理解为接受用户输入的一个小参数,根据这值来判断用户作何输入,并给出相应变化。


在这里,我们用到e.getKeyCode()来获取用户老爷们的输入(如果你在这里不放switch而放System.out.println(e.getKeyCode());,这样就好玩了,你每次按下按钮,就会在控制台上显示你按下了是什么按钮)


就这样,switch根据用户老爷们的输入,接收相应输入并且做出相应的操作。


同理,我们这里处理用户松开按键的情况KeyReleases


在这里,我们依旧使用e.getKeyCode() 来告诉程序我们现在松开了是哪个键(有的人喜欢同时按下好几个,所以有必要清楚告诉计算机,这逗比松开的哪一个),然后根据松开的是哪一个,进行相应的处理。

@Overridepublic void keyReleased(KeyEvent e) {   switch (e.getKeyCode()) {   case KeyEvent.VK_UP:      break;   case KeyEvent.VK_DOWN:      break;   case KeyEvent.VK_LEFT:      break;   case KeyEvent.VK_RIGHT:      break;   case KeyEvent.VK_SPACE:      break;   }}


现在,我们基本完成了监听器的添加,这里只是简单的添加了监听器的框架,日后再对前进后退跳起等操作进行处理,这里只是简单的接收一下,然后为了看到结果,我们将添加一个输出函数,让你可以看到效果,也就是你按下或者松开一个键,就会在控制台里看到相应的变化


最后程序改成酱紫:

package kiloboltgame;import java.applet.Applet;import java.awt.Color;import java.awt.Frame;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;public class StartingClass extends Applet implements Runnable, KeyListener {    @Override    public void init() {        setSize(800, 480);        setBackground(Color.BLACK);        setFocusable(true);        addKeyListener(this);        Frame frame = (Frame) this.getParent().getParent();        frame.setTitle("Q-Bot Alpha");    }    @Override    public void start() {        Thread thread = new Thread(this);        thread.start();    }    @Override    public void stop() {        // TODO Auto-generated method stub    }    @Override    public void destroy() {        // TODO Auto-generated method stub    }    @Override    public void run() {        while (true) {            repaint();            try {                Thread.sleep(17);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }    @Override    public void keyPressed(KeyEvent e) {        switch (e.getKeyCode()) {        case KeyEvent.VK_UP:            System.out.println("Move up");            break;        case KeyEvent.VK_DOWN:            System.out.println("Move down");            break;        case KeyEvent.VK_LEFT:            System.out.println("Move left");            break;        case KeyEvent.VK_RIGHT:            System.out.println("Move right");            break;        case KeyEvent.VK_SPACE:            System.out.println("Jump");            break;        }    }    @Override    public void keyReleased(KeyEvent e) {        switch (e.getKeyCode()) {        case KeyEvent.VK_UP:            System.out.println("Stop moving up");            break;        case KeyEvent.VK_DOWN:            System.out.println("Stop moving down");            break;        case KeyEvent.VK_LEFT:            System.out.println("Stop moving left");            break;        case KeyEvent.VK_RIGHT:            System.out.println("Stop moving right");            break;        case KeyEvent.VK_SPACE:            System.out.println("Stop jumping");            break;        }    }    @Override    public void keyTyped(KeyEvent e) {        // TODO Auto-generated method stub    }}


这一讲就到这里,下一讲我们就要添加上游戏的主角,并且增加给它增加动作场面(也就是完成前后左右跳跃等动作)


希望你们能听得懂。


另外吐槽一下,这里能上传rar文件么?我想整个源文件打包放上来,但是不知道放哪儿?有谁知道?




0 0