《java游戏开发》2_第1页
《java游戏开发》2_第2页
《java游戏开发》2_第3页
《java游戏开发》2_第4页
《java游戏开发》2_第5页
已阅读5页,还剩97页未读 继续免费阅读

下载本文档

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

文档简介

Java游戏开发学习情境5:音乐播放器设计,目标与任务,目标:为游戏添加音效,能够用Java加载、播放游戏中的声音文件,并按要求控制播放。 任务:用Java设计一个播放多种声音的程序。为电梯模拟游戏添加背景音乐。,学习过程,项目核心,功能扩展,应用升级,教师,学生,提供:声音播放案例,模仿完成:声音播放案例,提供:多个声音列表播放关键代码,协作完成:多个声音列表播放,提供:电梯游戏的声音和界面,协作完成:电梯游戏的音效处理,Java支持的音频文件格式,AU文件格式WAV文件格式AIFF文件格式MIDI文件格式,声音文件有很多格式,AU声音文件,这是Java语言最早的声音格式,扩展名为AU或SND,适用于短的声音文件。AU类型文件使用的三种典型音频格式为:8位单声道采样频率为8KHz的-law类型、8位线性类型以及16位线性类型。,WAV声音文件,扩展名为WAV,由Microsoft和IBM共同开发,Windows 9X系统都支持此格式。,AIFF声音文件,扩展名为AIF或IEF,是Macintosh公司和SGI公司所共用的标准音频文件格式。,MIDI声音文件,扩展名为MID,是音乐制造业所认可的标准,主要用于控制诸如合成器和声卡之类的设备。Java 2平台支持三种类型的MIDI文件公式,它们分别为MIDI文件类型O、MIDI文件类型1以及RMF。,与声音处理有关的包和类,java.applet.Appletjavax.sound.midi javax.sound.midi.spijavax.sound.sampled javax.sound.sampled.spi,javax.sound.midi包,为I/O、序列化和MIDI数据的合成提供接口和类。 javax.sound.midi.spi 包,为新MIDI设备、MIDI文件阅读器和编写器等的实现提供接口。javax.sound.sampled 包,为捕获、处理和播放音频数据提供接口和类。 javax.sound.sampled.spi 包,为新音频设备、声音文件阅读器和编写器或音频格式转换提供抽象类。,与声音处理有关的包和类,在Applet类播放声音,使用play()方法装载与播放声音。格式如下: 1、void play(URL url) 2、void play(URL url,String name) 一旦play()方法装载了声音文件就立即播放。如果找不到,play()方法不返回出错信息,反应到用户端就是听不到声音。 play()方法只播放一遍声音文件,重复播放声音,如果需要重复播放某个声音文件,就需要使用AudioClip接口提供的方法。AudioClip接口提供播放声音片段的方法。多个AudioClip项可以在同一时间播放,从而产生声音混合的效果。,项目核心,一个基本的使用Applet类提供的方法播放声音文件的例子,运行结果如图所示:,步骤一:创建一个Applet小程序,(1)通过继承Applet类来创建一个有三个按钮的容器import java.applet.*;public class mAudio extends Applet(2)定义成员属性包含3个成员属性,分别表示播放的声音的URL相对地址,当前播放的音频流和声音播放状态。,步骤一:创建一个Applet小程序,(3)在Applet的子类中覆盖Applet类的init()方法init()是java.applet.Applet类中的方法,当applet程序首次被打开时,会执行此方法定义的程序代码。当applet程序首次被打开时,init()将第一个被自动执行。在其中调用getAudioClip来初始化当前要播放的音频流:audio=getAudioClip(new URL(getDocumentBase(),hurl);,步骤二:对Applet容器中的按钮动作进行事件处理,(1)为Applet容器添加按钮动作监听器由于要对Applet容器中发生的三种按钮按下事件进行分别响应,可以直接在init()方法中对三个按钮添加语句:addActionListener(this);(2)实现ActionListener接口public class mAudio extends Applet implements ActionListener public void actionPerformed(ActionEvent e) ,步骤一:创建一个Applet小程序,这里需要根据事件源即按钮的不同作出分别动作,可以通过e.getActionCommand()来判断是哪个按钮被按下。AudioClip类中的play,stop,loop方法分别对应播放、停止和循环播放功能。,功能扩展,在上面程序的基础上要求增加一套按钮用于播放另一个音乐,2个音乐可以同时播放,制造一种混音效果。运行情况如下:,扩展步骤一:增加一套按钮,定义令一组成员属性包含新的3个成员属性,分别表示播放的第二段声音的URL相对地址,当前播放的音频流和声音播放状态。改写init()方法在其中调用getAudioClip来初始化另一个要播放的音频流:Audio2=getAudioClip(new URL(getDocumentBase(),hurl2);并且添加一套新按钮,重新布局。,扩展步骤二:对Applet容器中的按钮重新进行事件处理,为Applet容器中的新按钮添加事件监听器由于要对Applet容器中发生的三种按钮按下事件进行分别响应,可以直接在init()方法中对三个按钮添加语句:addActionListener(this);(4)实现ActionListener接口,在actionPerformed方法中对六个事件源作出相应public class mAudio extends Applet implements ActionListener public void actionPerformed(ActionEvent e) ,完成情况评价标准,完成(1)-(4),得到最终结果的正确输出,100分。 完成(1)-(3),正确生成菜单,80分。 完成(1)-(2),正确生成菜单,60分。,功能扩展之案例二,编写一个applet让用户从几个音频片段中选择来播放,程序运行画面如下:,功能扩展之案例二,/ 程序中声音的名字 public final String AUDIO = ping, pop, return, salvation, shuffle, squish ; / 包含上述字符串数组的下拉框 private Choice choice; / 真实的音频片段数据 private AudioClip clips;,功能扩展之案例二,/ 控制播放停止的按钮 private Button playClip; private Button loopClip; private Button stopClip; private Button stopAllClips; / 跟踪当前哪些音频片段在播放 private boolean clipsPlaying;,应用升级,问题陈述:在电梯系统的模拟程序里,公司要求在模拟中加入声音。例如,当一个人走路时,应能听到脚步声。每当按下或者复位一个楼层按钮或者电梯按钮时,应当听到单击声。电梯到达时铃声应当响起,且在门打开时或者关上时,门应当吱吱作响。最后,当电梯在楼层间运行时,应播放“电梯音乐”。,应用升级,解决思路:编写类SoundEffects,将声音文件转换成java.applet.AudioClip对象,关键代码,try return Applet.newAudioClip( getClass().getResource( prefix + soundFile ) ); / return null if soundFile does not exist catch ( NullPointerException nullPointerException ) return null; ,应用升级,类SoundEffects包含方法getAudioClip,该方法通过参数soundFiled调用类java.applet.Applet的static方法.newAudioClip返回一个AudioClip对象。方法setPathPrefix允许改变声音文件的目录(如果我们需要把声音分配到多个目录中,该方法很有用)。,应用升级,(2)编写一个类,通过播放AudioClip对象来产生声音。(学生自主完成),Java游戏开发学习情境6:小虫动画程序设计,目标与任务,目标:用Java多线程为游戏添加动画,掌握多线程的实现、控制方法。掌握通过双缓冲消除图像闪烁的方法。任务:创建一个燃烧的火焰动画,为“电梯模拟游戏”添加人行走,电梯运行的动画,学习过程,项目核心,功能扩展,应用升级,教师,学生,提供:绘制图像案例,模仿完成:绘制图像案例,提供:线程控制图像间歇显示,协作完成:线程控制图像间歇显示成动画,提供:电梯游戏的动画和界面,协作完成:电梯游戏的场景动画加载,详细步骤,步骤一:用屏外绘制技术在一个窗体上显示图像步骤二:创建线程实现图像的间歇显示步骤三:多个图形顺序显示形成动画步骤四:为“电梯模拟游戏”添加人行走,电梯运行的动画步骤五:课后创新作业:自主设计一个程序实现:显示滚动的字幕,Java在屏幕上画图的方法,paint,repaint,update,superpaint都可在屏幕上画图注意几个方法的区别,几个方法的区别,paint在当前容器中绘制图形,要这个类中存在这个方法则自动加载。repaint重绘当前图形,会先执行update中的方法,再执行paint中的方法。update更新当前图形,通过repaint来调用。superpaint是隐式调用,当继承一个容器后会自动调用此方法,用于显示当前容器中的组件。,屏外绘制缓冲器,前面介绍的技术都是通过Graphics2D容器直接把对象绘制到窗体上。屏外缓冲就是创建一个虚拟的applet来缓冲存放将要绘制的图形。屏外缓冲绘图的目的是加快图形的绘制,消除屏闪。,缓冲屏幕,真实屏幕,项目核心:屏外缓冲绘图,屏外缓冲绘图步骤:Image memoryimage,pic; /1 创建两个Image对象,一个用于屏外绘图,一个用于屏内绘图Graphics memoryg; /2 创建一个屏外绘图的画笔memoryimage = createImage(x,y); /3 在内存中创建屏外绘图区的大小memoryg = memoryimage.getGraphics();/4 获取屏外绘图区的画笔,项目核心:屏外缓冲绘图,绘图的paint方法: paint(Graphics g) memoryg.drawImage(pic,x,y,null); /5 在内存中画出pic对象的图像 g.drawImage(memory) /6 在屏幕上画出内存中的图像 例:一个在窗体飞动的物体, 运行结果如图所示:,动画和线程,动画是游戏开发中常用的技术。动画是一帧接一帧的连续播放图像。用线程控制连续变化的一系列图像间歇显示就能形成动画。,线程相关概念,程序:静态的计算机高级语言编写的代码。进程:程序的一次执行。线程:程序中的部分代码的一次执行过程。多进程:操作系统中多个程序并发执行。多线程:程序中多个片断并发执行。 Java通过继承Thread类和实现Runnable接口创建线程。,线程的状态和生命周期,新建状态,就绪状态,阻塞状态,运行状态,死亡状态,线程的状态和生命周期,新建 : 新建的线程处于新建状态就绪 : 在创建线程后,它将处于就绪状态,等待 start() 方法被调用执行: 线程在开始执行时进入运行状态阻塞:在线程等待一个事件时(例如输入/输出操作),就称其处于阻塞状态。死亡:在 run() 方法已完成执行或其 stop() 方法被调用之后,线程就处于死亡状态。,线程的调度和优先级,Java 中的线程优先级是在 Thread 类中定义的常量NORM_PRIORITY : 值为 5MAX_PRIORITY : 值为 10MIN_PRIORITY : 值为 1缺省优先级为 NORM_PRIORITY有关优先级的方法有两个:final void setPriority(int newp) : 修改线程的当前优先级final int getPriority() : 返回线程的优先级,多线程的实现方法,通过以下两种方法创建 Thread 对象:1.声明一个 Thread 类的子类,并覆盖 run() 方法。 class mythread extends Thread public void run( ) /* 覆盖该方法*/ 2.声明一个实现 Runnable 接口的类,并实现 run() 方法。 class mythread implements Runnable public void run( ) /* 实现该方法*/ ,多线程的控制,1.终止线程 stop()方法。2.测试线程状态 isAlive()方法。3.线程的暂停和恢复 sleep() suspend()和resume() join(),stop(),resume(),sleep(),join(),run(),多线程的互斥,有时两个或多个线程可能会试图同时访问一个资源例如,一个线程可能尝试从一个文件中读取数据,而另一个线程则尝试在同一文件中修改数据在此情况下,数据可能会变得不一致为了确保在任何时间点一个共享的资源只被一个线程使用,使用了“互斥”两种方式实现互斥:使用互斥方法synchronized void methodA() 使用互斥块synchronized(object) /要互斥的语句,多线程的同步,为避免轮流检测,Java提供了一个线程间通信机制,使用wait()、notify()和notifyAll()方法 。这些方法仅在 synchronized 方法中才能被调用。wait()方法告知被调用的线程退出监视器并进入等待状态,直到其他线程进入相同的监视器并调用 notify( ) 方法。,线程的死锁,当两个线程循环依赖于一对同步对象时将发生死锁。例如: 一个线程进入对象ObjA上的监视器,而另一个线程进入对象ObjB上的监视器。如果ObjA中的线程试图调用ObjB上的任何 synchronized 方法,就将发生死锁。死锁很少发生,但一旦发生就很难调试,使用线程来创建动画,一帧就是指动画中的一幅图像动画就是由一定时间间隔播放的帧图像构成的。帧更换的速度直接影响动画的效果帧速与进程调度间的关系。,功能扩展:燃烧的火焰动画,通过屏外缓冲方式,利用线程间隔显示连续变化的图像,形成动画,程序运行结果如图所示。,用线程实现图形的间歇显示例二,程序运行结果如图所示,屏幕中有一个移动的方块,当它与其它方块重合(游戏中叫碰撞)时,会用不同的颜色显示重合部分,Java动画中消除屏闪的两招,(1)通过覆盖update(Graphics g)来消除闪烁 在动画的实现中,经常用到repaint()函数来重画屏幕,实现动画的加载,其实在java中repaint()是通过两个步骤来实现刷新功能的,首先它调用public void update()来刷新屏幕,其次再调用paint(Graphcis g)来重画屏幕,这就容易造成闪烁,特别是一些需要重画背景的程序,如果下一桢图象可以完全覆盖上一桢图象的话,便可以重写update函数如下来消除闪烁: (2)通过双缓存消除闪烁 为了防止屏幕重画出现的闪烁,先创建一个屏外绘图区,重画完毕,直接将成品再绘制到小程序屏幕上去。offScreenImage=createImage(w,h);/创建屏外绘图区offScreen=offScreenImage.getGraphics();/取得绘图环境,应用升级:为“电梯模拟游戏”添加人行走,电梯运行的动画,电梯模拟游戏中,人走向、离开电梯;电梯开、关门;灯闪烁;电梯上、下运行;都是动画,它们只在游戏剧情需要时才播放,我们将使用多线程和synchronized方法,保证这些动画符合游戏规定的逻辑正确播放。,应用升级:为“电梯模拟游戏”添加人走进电梯,电梯运行的动画(事件处理方法之一 ),public void personEntered( PersonMoveEvent personEvent ) / find Panel associated with Person that issued event AnimatedPanel panel = getPersonPanel( personEvent ); if ( panel != null ) / determine velocity double time = TIME_TO_ELEVATOR / ANIMATION_DELAY; double distance = elevatorPanel.getPosition().getX() - panel.getPosition().getX() + 2 * OFFSET; panel.setVelocity( distance / time, -1.5 ); / Person starts walking panel.setMoving( true ); panel.playAnimation( 0 ); panel.setLoop( true ); / end method personEntered,应用升级:为“电梯模拟游戏”添加电梯关门的动画,/ invoked when Door has closed in model public void doorClosed( DoorEvent doorEvent ) / get DoorEvent Location String location = doorEvent.getLocation().getLocationName(); / play animation of Door closing doorPanel.playAnimation( 1 ); doorPanel.setAnimationRate( 2 ); doorPanel.setDisplayLastFrame( true ); / play sound clip of Door closing if ( doorCloseClip != null ) doorCloseClip.play(); / end method doorClosed,应用升级:为“电梯模拟游戏”添加按钮被按下的动画,/ invoked when Button has been pressed in model public void buttonPressed( ButtonEvent buttonEvent ) / get ButtonEvent Location String location = buttonEvent.getLocation().getLocationName(); / press Elevator Button if from Elevator if ( location.equals( ELEVATOR_NAME ) ) elevatorButtonPanel.playAnimation( 0 ); elevatorButtonPanel.setDisplayLastFrame( true ); ,课后创新作业。,自主设计一个程序实现:显示向左滚动的字幕 。,前一帧,后一帧,Java游戏开发学习情境7:网络对弈程序,目标与任务,目标:为游戏添加网络通信功能和游戏逻辑 ,利用Socket进行网络通信,C/S架构服务器端和客户端编写,B/S架构实现。 任务:开发网络对弈程序,目标程序,完成项目开发:程序运行时,有两个客户端通过网络进行对奕。,学习过程,步骤一:先完成简单的C/S架构步骤二:再完成第二个例,实现一个服务器与多个客户端通信步骤三:再为服务器端创建线程,实现多线程服务器步骤四:最后加入分析两客户端通信的信息,实现游戏规则的代码,网络通信基础,网络通信就是通过某种方法让一台计算机与其它计算机交换数据。通信就是给其它计算机传数据,或者接收其它计算机发来的数据。对网络的任何形式的访问最后都归结为从网卡接收数据或向网卡传送数据。网络通信解决两个问题:(1)如何识别不同的计算机。(2)如何传送数据。,网络通信问题,网络中的两台计算机靠协议进行通信网络中用IP标识不同的通信实体,网络协议,在两台电脑间传送数据时,传送或接收数据的先后顺序,数据的格式等内容的约定构成通信的协议。Internet网的数据传送有很多协议,如TCP/IP,UDP,FTP等,协议不同,具体到网络通信程序,接收和发送数据部分的代码会有不同。本次的例子都是采用TCP/IP协议。,用IP识别网络中的计算机,网络上不同的计算机用IP来标识。实际上一个IP对应一张网卡。如果一台电脑上有多张网卡,那么就需要多个IP来标识每一张网卡。每个网卡有多个端口,供应用程序采用不同的通信协议传输数据。每种协议都采用不同的端口号,端口号可以设置,如设置某网卡用8080号端口进行TCP/IP协议方式的数据传输。,网络程序的架构,一般网络上程序都是一个服务器,一个客户端,这种程序的总体结构叫架构,如上图所示这种总体结构叫C/S架构(即客户/服务器)架构。C/S架构中,提出数据访问要求的程序叫客户端,被提出数据访问要求的程序叫服务器端。一个客户端可能是一台配置很高的电脑,一个服务器端可能只是一台普通电脑。客户端和服务器端可以是同一台电脑。,C,S,C,S,C,S,网络编程工具,网络很普遍,所以,几乎所有的编程语言都提供网络编程的组件。Java提供Socket组件供网络编程使用。Socket是一个类。在用Java进行网络编程时,只需使用Socket的有关方法 ,按照一定步骤编写出接收数据,处理数据,或处理数据,发送数据的代码即可。,Java Socket编程,事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些相对简单的API来完成这些工作。Socket就是其中之一,对于Java而言,这些API存在于 这个包里面,因此只要导入这个包就可以准备网络编程了。,Socket编程步骤,Java提供了对TCP套接字的良好的支持,有两种套接字类: .Socket; .ServerSocket;当编写连接到已有服务的客户端软件的时候使用Socket类。当编写绑定到本地端口以提供服务的服务器软件的时候使用ServerSocket类。这是与DatagramSocket的UDP工作方式不同的地方-在TCP中,连接服务器地和从客户端接收数据的函数被分为两个独立的类。,Socket编程步骤,Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法。getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到的输入流其实就是从服务器端发回的数据流。GetOutputStream方法得到一个输出流,客户端Socket对象上的getOutputStream方法返回的输出流就是将要发送到服务器端的数据流,(其实是一个缓冲区,暂时存储将要发送过去的数据)。,Socket编程步骤,要完成这个工作,需要完成三个部分的工作,以下依次说明: 1、建立服务器类 2、建立客户端代码 3、建立用户界面,1、建立服务器类,创建服务器对象:ServerSocket server = new ServerSocket(9998) 建立一个Socket连接 :Socket incoming = server.accept() 输入流和输出流: BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream(); PrintWriter out = new PrintWriter(incoming.getOutputStream(),true); 随后,就可以使用in.readLine()方法得到客户端的输入,也可以使用out.println()方法向客户端发送数据。 关闭这两个数据流 out.close(); in.close();,2、建立客户端代码,创建一个Socket对象 :Socket socket = new Socket(2,9998); 数据的输入和输出 in = new BufferedReader(new InputStreamReader(socket.getInputStream();out = new PrintWriter(socket.getOutputStream(),true);,项目核心:简单的C/S架构,客户机/服务器的典型通信过程: 1、服务器监听相应端口的输入; 2、客户机发出一个请求; 3、服务器接收到此请求; 4、服务器处理这个请求,并把结果返回给客户机; 5、重复上述过程,直至完成一次会话过程。,项目核心:简单的C/S架构,服务方:import java.io.*; import .*; public class MyServer public static void main(String args) throws IOException ServerSocket server=new ServerSocket(5678); Socket client=server.accept(); BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream(); PrintWriter out=new PrintWriter(client.getOutputStream(); while(true) String str=in.readLine(); System.out.println(str); out.println(has receive.); out.flush(); if(str.equals(end) break; client.close(); ,项目核心:简单的C/S架构,这个程序的主要目的在于服务器不断接收客户机所写入的信息只到,客户机发送End字符串就退出程序,并且服务器也会做出Receive为回应,告知客户机已接收到消息。,项目核心:简单的C/S架构,客户机代码: import .*; import java.io.*; public class Client static Socket server; public static void main(String args)throws Exception server=new Socket(InetAddress.getLocalHost(),5678); BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream(); PrintWriter out=new PrintWriter(server.getOutputStream(); BufferedReader wt=new BufferedReader(new InputStreamReader(System.in); while(true) String str=wt.readLine(); out.println(str); out.flush(); if(str.equals(end) break; System.out.println(in.readLine(); server.close(); ,项目核心:简单的C/S架构,客户机代码则是接受客户键盘输入,并把该信息输出,然后输出End用来做退出标识。 这个程序只是简单的两台计算机之间的通讯,如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端,结果是会抛出异常的。那么多个客户端如何实现呢?,一对一的C/S,一个Server一个Client,一对多的C/S一个server多个Client,C,S,C,S,C,S,C,C,功能扩展:将客户端改成Java Applet,即B/S架构,为客户端设计符合需求的GUI。,网络通信模型 B/S架构:如果客户端是浏览器,则通信程序的架构叫浏览器/服务器架构(即Browser/Server架构,简称B/S架构)。客户端是通用的浏览器,省掉了客户端升级的麻烦。,功能扩展:将服务器端改进为多线程服务器,一个服务器为多个客户端服务 其实,简单的分析一下,就可以看出客户和服务通讯的主要通道就是Socket本身,而服务器通过accept方法就是同意和客户建立通讯.这样当客户建立Socket的同时。服务器也会使用这一根连线来先后通讯,那么既然如此只要我们存在多条连线就可以了。那么我们的程序可以变为如下:,功能扩展:将服务器端改进为多线程服务器,改进为多线程服务器: try file:/建立服务器ServerSocket server = new ServerSocket(9998);int i=1;for(;)Socket incoming = server.accept();new ServerThread(incoming,i).start();i+;catch (IOException ex) ex.printStackTrace(); ,功能扩展:将服务器端改进为多线程服务器,这里仅仅只是加了一个外层的While循环,这个循环的目的就是当一个客户进来就为它分配一个Socket直到这个客户完成一次和服务器的交互,这里也就是接受到客户的End消息.那么现在就实现了多客户之间的交互了。,功能扩展:将服务器端改进为多线程服务器,但是.问题又来了,这样做虽然解决了多客户,可是是排队执行的。也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互,无法做到同时服务,那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了。所以线程是最好的解决方案。,功能扩展:将服务器端改进为多线程服务器,那么下面的问题是如何使用线程.首先要做的事情是创建线程并使得其可以和网络连线取得联系。然后由线程来执行刚才的操作,要创建线程要么直接继承Thread要么实现Runnable接口,要建立和Socket的联系只要传递引用就可以了.而要执行线程就必须重写run方法,而run方法所做的事情就是刚才单线程版本main所做的事情,因此我们的程序变成了multiThread.java,应用升级:网络对奕游戏,本程序实现的是基于B/S模式的网络对奕游戏,实现了多线程编程,实现多客户对奕。并且实现了服务器端管理客户端的功能,包括客户端和服务器端。实现功能: 用户上线包括新用户上线和已使用过该系统的用户上线每位在线的用户将会收到该用户上线的通知,应用升级:网络对奕游戏,该用户会收到所有已在线的用户的信息朋友下线 服务器端删除该用户信息每位在线的用户将会收到该用户下线的通知,同时删除改用户的信息聊天终止,文件传输终止修改用户名字用户可以在对应的文本框内直接修改名称,应用升级:网络对奕游戏,用户可以在保存的Myinfo.txt中直接修改名称聊天功能:公聊:所有在线的用户都可以看到你的发言私聊:能和所有以在线的用户进行私聊,其他用户看不到私聊对象之间的聊天文件传输能给所有的已在线用户发送文件(先打开私聊窗口)网络对弈功能。实现棋局逻辑设计,实现游戏逻辑程序设计。,应用升级:网络对奕游戏,源代码:客户端TicTacToeClient.java服务器端TicTacToeServer.java,Java游戏开发情境8 游戏的集成与发布,学习任务,已经完成的进度完成了7个情境的学习有一个完整的可以执行的电梯游戏新的挑战 ?:每次都要在DOS下输入一系列命令才 可以玩游戏吗 ?:游戏产生的这么多个文件,用户到底 执行哪个好呢解决方法:集成打包为一个可执行文件,学习内容,核心技术:DOS下生成JAR文件JAVA中jar文件的编写和应用内容清单 manifest.fm功能扩展:DOS下生成贪吃蛇游戏可执行文件应用升级:使用ECLIPSE

温馨提示

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

评论

0/150

提交评论