第二讲面向对象游戏设计_第1页
第二讲面向对象游戏设计_第2页
第二讲面向对象游戏设计_第3页
第二讲面向对象游戏设计_第4页
第二讲面向对象游戏设计_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1第二讲坦克大战面向对象设计(2)2第二讲坦克大战面向对象设计(2)本讲实现单机版对战和网络版对战。本讲概要坦克单机对战的实现坦克网络对战的实现单机对战

本节中将对坦克游戏进行扩展,增加另一辆坦克,由第二个人进行控制,进行两辆坦克的对战只需要再创建一个Tank对象,由另外的键盘按键进行控制,这里我们使用“l”控制第二辆坦克左移,“p”控制上移,“\’”控制右移,“;”控制下移,空格键控制发炮。坦克网络对战功能的实现在上一节中,我们实现了坦克对战的功能,本节我们将结合第八章网络通信的知识,在上一节坦克对战功能的基础上增加网络对战的功能编程思路上一节的坦克对战中,两辆坦克都是由键盘控制,只不过控制两辆坦克的键不同而已网络坦克对战功能中,一辆坦克由本机键盘控制。而另外一辆坦克由另外一台电脑的键盘控制,该电脑按键后,通过网络把按键信息传到本机,本机在得到信息之后,根据这个信息控制另一辆坦克的动作。其过程如图所示。流程图电脑1和电脑2互相之间发送各自的按键信息,控制对方游戏中一辆坦克的移动。进行网络通信可以使用TCP和UDP,这里我们使用TCP进行通信。使用TCP通信当使用TCP通信时,两台电脑要进行互相通信,需要有一台充当服务器的电脑,建立TCP服务器的代码如下:ServerSocket

ss=newServerSocket(8888);其中ServerSocket是一个服务器类,该服务器的坚挺端口是8888,使用Sockets=ss.accept()方法等待客户端的连接当客户连接到来之时accept()方法会返回一个Socket对象,该Socket对象就是与客户端连接的对象。使用TCP通信调用InputStreamis=s.getInputStream()方法得到输入流,客户端的输入从这里读取;调用OutputStream

os=s.getOutputStream()方法得到输出流,发给客户端的数据从这里发出。使用TCP通信在客户端,通过调用Sockets=newSocket(“127.0.0.1”,8888);语句,连接服务器的8888端口,连接成功之后得到一个Socket对象,该对象与服务器端的Socket对象对应,客户端的输入即是服务器的输出,客户端的输出即是服务器端的输入使用TCP通信在GameCanvas类中,定义两个属性,分别是:ServerSocket

ss=null;Sockets=null;这两个属性的默认值都是null,如果是服务器那么ss就应该被创建,如果是客户端,ss的值就是null,因此可以根据ss是否是null来判断是否服务器端。还需要输入输出流对象,用来进行输入输出处理,这两个对象分别是:PrintWriterpw=null;BufferedReader

br=null;使用TCP通信设置服务器定义一个设置服务器端的setServer()方法调用该方法把一个GameCanvas对象设置成服务器端,该方法传入一个port参数,用来设置服务器的监听端口。在方法里运行一个线程,在这个线程中运行accept()方法,等待客户端的连接,并且产生输入流和输出流setServer()方法publicvoidsetServer(final

intport){//服务器端操纵player2Tanktmp=player;player=player2;player2=tmp;Threadth=newThread(){publicvoidrun(){try{ss=newServerSocket(port);s=ss.accept();pw=newPrintWriter(s.getOutputStream(),true);

br=newBufferedReader(newInputStreamReader(s.getInputStream()));

//敌人自动运行

newEnemyMovement().start();}catch(Exception

e){e.printStackTrace();};}};

th.start();}设置客户端定义一个客户端连接服务器的方法connect()调用该方法使得客户端连接服务器,传入服务器IP和服务器端口作为参数connect()方法publicvoidconnect(StringserverIp,intserverPort)throwsException{s=newSocket(serverIp,serverPort);pw=newPrintWriter(s.getOutputStream(),true);br=newBufferedReader(newInputStreamReader(s.getInputStream()));

//敌人自动运行newEnemyMovement().start();}EnemyMovement类注意事项两段代码中,都有一个newEnemyMovement().start();语句,EnemyMovement是一个线程类,该语句的作用是创建一个EnemyMovement对象,并运行这个线程,以下所示的是EnemyMovement类的详细信息EnemyMovement类classEnemyMovementextendsThread{publicvoidrun(){try{Stringcmd;

while((cmd=br.readLine())!=null){//根据得到的信息控制敌人移动

switch(cmd.charAt(0)){case'a': player2.dir=0; player2.move(0);break;case'w': player2.dir=1; player2.move(1);break;case'd': player2.dir=2; player2.move(2);break;case's': player2.dir=3; player2.move(3);break;case'j': player2.shoot();break;}}}

catch(Exceptione){}}}登录窗体Login以上是GameCanvas类需要添加的代码,在游戏运行的时候,如果是服务器端需要输入监听端口;如果是客户端,需要输入连接的IP地址和端口号,因此需要提供一个输入界面,我们使用AWT组建编写一个登录窗口登录窗体LoginLogin运行的时候,如果是服务器端,则不需要选中“客户端”复选框,输入服务器端端口号,直接点击确定就可以运行游戏;如果客户端,登录的时候,则需要选中“客户端”复选框,然后输

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论