最新整理JAVA游戏源代码入门.docx
《最新整理JAVA游戏源代码入门.docx》由会员分享,可在线阅读,更多相关《最新整理JAVA游戏源代码入门.docx(17页珍藏版)》请在冰豆网上搜索。
最新整理JAVA游戏源代码入门
游戏,看看今年游戏的火爆劲头,大家可体会到它的无穷魅力。
越来越多的程序员加入到游戏开发这个行业中来。
而且游戏开发本身是种很大的乐趣与挑战。
本系列就是利用Java这门语言教大家一步一步学习游戏开发,领会Java游戏开发的每一个技术要点。
让大家都能灵活使用Java这门语言工具,都能用Java打造属于自己的游戏。
是本系列的最终目的。
有过Java经验的朋友一定会奇怪,在Java企业级应用(J2EE)和Java移动应用(J2ME)横行Java天下的时候,我们为什么选择了Java游戏开发?
原因很简单,游戏开发主要是利用J2SE技术,而J2EE、J2ME都是在J2SE的基础上发展起来的,也必须依托J2SE而存在,三者是相辅相成的。
J2SE是基础,万丈高楼平地起,只要你的基础打好了,有什么程序不能做呢?
而在J2SE上也有很多成功的应用开发。
你甚至能很方便的把你开发的游戏程序移植到上面两个应用方向中去。
好了,带上你的信心和决心,和我们一起走向这奇妙之旅吧。
在第一部分,我们主要是针对Java初学者,介绍Java语言的一些特性、简单运用。
让大家活动活动关节。
如果你是一位有经验的Java程序员,你可以跳过本章,但是了解一下这部分中关于Java在游戏开发方向的知识对你后面的学习将会有不少帮助。
目录导引:
一、Java简介
二、Java环境设定
三、Java基本语法
四、Java开发游戏的优劣
五、游戏开发中常用JavaAPI包
六、参考资料
一、Java简介
Java是SUN公司研发的一门语言,自从1995年发布以来,它以其优越的面向对象思想及简便的功能得到了广泛的应用。
微软总裁比尔·盖茨说:
“Java是最卓越的程序设计语言”。
1997年开始,许多大学已经用Java取代C当作程序设计教学语言。
现在到处都可见到Java,Java已经变成了程序员共通的语言。
它已经渐渐地渗透到各领域,如果你是程序员,你可能迟早都会接触到Java。
然而Java到底什么呢?
Java是一个类似C++的面向对象程序设计语言。
它和其他语言一样有自己的语法和撰写规则。
我们经常提到的Java平台是由Java应用编程接口(API)和Java虚拟机(JVM)构成。
JavaAPI即Java为程序员提供的一套已经编译好的功能接口。
Java虚拟机(JVM)是Java中最出色的设计之一,它是建立在CPU和OS的之上的一个虚拟平台。
我们的Java程序并不是在本机操作系统上直接运行而是在Java虚拟机上执行,由JavaVM向本机操作系统进行解释。
这样Java程序就可以在不同的平台上执行,也就是所谓的“一次编写,到处执行”。
这就是说,任何安装有JavaVM的计算机系统都可以运行Java程序,而不论最初开发应用程序的是何种计算机系统。
比如你在Window平台下撰写的Java程序,可不做任何修改而直接在Linux平台上运行。
不同的平台有不同的JavaVM版本。
Java平台结构如下图的所示:
人们提到“学习Java”,通常他们指的是Java语言和API。
二、Java环境设定
为了能够编写并运行我们所编写的Java程序,我们需要在自己的本地机器中安装JDK开发包,JDK是内置各种Java开发工具、Java虚拟机、JavaAPI的一个压缩包。
我们可从网站免费下载最新版本使用。
这里要注意不同的系统平台JDK压缩包是有所出入的。
下面介绍的方法我们是以Windows平台为基础。
Linux下的处理和这类似,只是文件扩展类型有所变化。
下载后的JDK是个执行文件,我们运行后可直接安装,缺省的安装路径是C:
\j2sdk1.4.1_02。
为了能够让电脑找到你要运行的程序,JDK会自动在你的系统环境变量中加入
JAVA_HOME=C:
\j2sdk1.4.1_02
但是要想很方便的运行自己的程序,这还不够,我们还得自己设置系统的类路径。
类路径的设置方式可以是采用javac编译器命令和java解释器命令中的-classpath选项,或通过对设置classpath环境变量的来完成。
在Java程序开发中,我们会大量引用到Java提供的API类库,所以要告诉电脑这些JavaAPI所在的位置。
classpath就是帮我们寻找这些Java类路径的配置,如同DOS里面的path一样。
要成功编译和运作Java程序,我们还必须告诉电脑JDK中的编译器javac.exe和执行工具java.exe所在的路径。
这两个工具是放在你的JDK安装目录的bin目录下,如:
C:
\j2sdk1.4.1_02\bin
我们来看看电脑中具体的环境设置:
PATH=C:
\j2sdk1.4.1_02\bin;c:
\windows;c\windows\command
classpath=.;C:
\j2sdk1.4.1_02\lib\tools.jar;d:
\test
注意:
classpath中的“.”代表的是当前目录,可以让你在当前目录下编译自己的class而不会出错。
D:
\test是我们自己指定的任意class放置路径。
这样即使Java操作不在当前目录中,也可编译d:
\test目录下的Java类。
三、Java基本语法
编写Java程序的
编写Java程序的IDE工具很多,如Eclipse、JCreator、JBuilder都是很不错的工具。
而最简单的方法是使用文本编辑器。
下面我们就用文本编辑器创建一个Java应用程序,并以此为基础说说Java的基本语法,感受您的第一个Java程序所带来的成就感。
在开始之前,您可先下载我们源程序TestDate.java,或者手工输入:
packagemy.test;
importjava.util.*;
/**
*日期测试程序
*@author天翼.李
*/
publicclassTestDate{
//声明私有变量pass
privateDatepass;
/**
*打印日期方法,并初始化pass的值
*/
publicvoidprintDate()
{
//调用日期函数
pass=newDate();
//显示当前日期
System.out.println("当前日期:
"+pass);
}
publicstaticvoidmain(Stringarg[]){
//初始化类TestDate
TestDatetestDate=newTestDate();
testDate.printDate();
}
}
接着要编译程序
编译程序就是把java源程序转换为JavaVM能够理解的字节码,这样,任何安装有JavaVM的计算机就可以解释并运行该程序。
我们在Dos窗口的命令行中输入下面命令,就可成功编译TestDate.java程序:
javacTestDate.java
解释并运行程序
Java程序的解释和运行是指调用JavaVM字节码解释器把Java字节码转换成与平台相关的机器码,以便您的计算机能够理解并运行该程序。
在运行上面例子程序前我们先要在当前目录下新建my目录,并在my下面新建子目录test,并把我们编译过后的TestDate.class文件移到test下面。
然后在DOS窗口的命令行输入:
javamy.test.TestDate
在命令行上,您可以看到终端窗口显示如下:
为什么要新建这些子目录呢?
下面的package机制将会告诉你一切。
如果你认为有点麻烦了,也没关系,大部分的JavaIDE会自动在你的系统中生成这些目录。
或者你在理解了下面的package机制后,注释掉packagemy.test,直接在当前目录下进行操作演示。
包(package)
每个人写的程序命名方法各异,如何有效的对这些名字进行管理,而不会出现重名的现象。
Java借鉴Internet域名地址的唯一性方法,引入了package机制。
package利用倒写的Internet域名,用点符号分隔每一个路径。
这样保证不同功能的类库放入不同的目录之下。
在此package相当于命名空间,不同命名空间的类不会相互干扰。
在本地新建包路径时会按“.”符号来新建相应的子目录。
上例中的:
银杏树
苏州美肤
苏州祛斑
苏州除皱
苏州脱毛
苏州人才网
南京调查公司
南京调查公司
packagemy.test;
相当于新建一个my.test的包,而此包就是按my\test的目录结构来分隔TestDate类和外界的类。
所以上面我们编译后的TestDate.class文件要放置在目录my\test下面。
包除了命名分隔的功能外,还有一个功能,它能设置本命名空间对另一个命名空间类的访问权限。
只有命名为public的类才能被另一个命名空间的类调用。
在下面的权限小节我们将会看到Java几种权限划分方式。
Import
Import和package是相对应的,package主要管理的是自己类库,而import主要的是处理对另一个包中的类库调用。
由于package机制隐藏了类库的可见性,要想引用另一个类库的中的类来实现相应的功能,我们就得知道这个类库所在的位置,也即要得到类库上的包路径。
程序开始时Java虚拟机会根据环境变量classpath来查找引用的包。
如果没有找到,就到当前程序所在的目录查找,如果再没找到,程序运行就会出错。
看到这,你是否明白了classpath所发挥的类库路径配置作用!
Java找到引用的路径后,会把路径指定的类全部加载到内存中去,这是Java的一大特色,用以加快开发者调用程序的速度。
importjava.util.*;
为了新建Date类型的变量实现我们的显示当前日期功能,例子中我们就引用了java.util包,这里用的“*”代表这个包下的所有类,包括这个包下的Date类。
如果我们只要引用Date这个类,也可这样写:
importjava.util.Date;
这样程序运行过程中只要加载指定的类到内存中而不要加载所有的类。
如果大家对加载过程有兴趣,可尝试在执行程序时加入参数–verbose,即:
java–verbosemy.test.TestDate
屏幕上会显示所有引入内存中的类库名称。
面向对象
Java是一种面向对象(OOP)的编程语言。
在Java中,面向对象是以类的形式出现的,对象则是类的实例。
所以要学习Java的类首先必须了解面向对象思想。
1、类
我们用修饰符“class”来表示类。
它代表某一类事物的类型,其内封装了这一事物总的外观长相(数据成员)和行为举止(成员函数),如鸟类就可以是一个class,其中就封装了鸟类的基本行为:
飞行,也封装了鸟类的基本外观:
都有翅膀。
对类封装后,即使我们改变了类的一些代码,只要不改变其中被调用的方法,引用这个类方法的程序就不要修改。
类除了封装,第二个特点就是允许继承。
我们通过关键字“extends”,就可让我们继承的类拥有父类的所有特点,并可产生自己的独有个性。
比如:
class候鸟类extends鸟类{}
则候鸟类自动继承的鸟类的“飞行”行为,及“有翅膀”这个属性,而在此候鸟又可有自己的特点,如“一到冬季就往南飞”。
这样我们大大减少了代码的编写工作,也方便了程序的理解与错误查找。
我们在Java中把鸟类称为父类或超类,候鸟类称为子类。
下面来看看我们的程序:
上例我们创建了一个叫TestDate的类,并封装了这个类的数据成员pass和成员函数printDate。
publicclassTestDate{//声明一个类
privateDatepass;//类的变量的声明
publicvoidprintDate(){}//类的方法
}
声明一个类时使用了修饰符public,说明了这个类可以被任何其他对象使用和扩展,而且与它的包无关,在上面package机制中我们也提到了这点。
如果类声明前没有任何修饰符,则默认为friendly类,即只有同一个package包中的对象才能使用该类。
2、对象
类还只是个抽象化的概念,并没有实在的东西存在。
要想在Java程序中运用类,并引用类的方法和变量,我们必须实例化类为对象。
在Java中万事万物都是对象,连Java本身也是对象。
原则上没有实例化的类是不能使用的。
我们用new来创建类的一个实例,并不是所有的类都需要创建他的实例,方法和变量名前面带static关键字的静态方式,就可以不用创建这个类的实例,但是静态的方法只能引用静态的类变量,如上例中静态方法main()函数就不能直接引用非静态变量pass。
TestDatetestDate=newTestDate();
现在我们就可通过testDate对象引用TestDate类中显示当前日期的printDate方法:
TestDate.printDate();
访问权限
是不是类、方法、变量、任何人都可访问?
非也。
为了保护代码的安全性,Java中使用了访问权限这一概念。
在类、方法、变量前加上不同的修饰符,将会实现不同的访问权限。
public任何人、在任何地方都可访问,即使访问者是另一个包中的类也可访问
protected只能被同一个类或继承类中的所有方法访问,其他的类或包都不可访问
private只能让同一个类中的所有方法访问
friendly如果你没有声明任何修饰符,表示其权限为friendly,可以被同包内的所有类访问
变量
我们使用变量来说明类的基本属性。
在使用变量前我们必须先进行声明和初始化。
而且每一个变量都有其自己的数据类型。
Java中不同的数据类型变量在内存中有不同的表示方法,如int类型占32位,byte占8位等:
privateDatepass;
表示我们声明一个Date类型的私有变量。
pass=newDate();
表示初始化pass值为当前日期值。
虽然Java会对没有初始化的变量赋初值为null,但是这很容易造成程序逻辑错误。
在类中有两个特殊的变量:
this和super,this变量表示当前类对象本身,当类中有两个变量同名,其中一个属于当前类而另一个属于另一个类时或某个类需要将本身作为参数传递给某个方法时我们都有可能使用this变量。
super变量,表示当前类的父类。
在继承了父类,而没有声明父类对象的前提要引用父类的方法或变量这个方法很有用。
方法
我们用方法来表示类的行为特征。
方法除了自身的类型外还必须实现这个行为特征的代码,我们称之为方法体。
方法还可接受来自外部的参数作用于本方法之内。
如果方法类型非空,我们还必须在方法体中用return返回此方法的类型值。
publicstaticvoidmain(Stringarg[]){
//初始化类TestDate
TestDatetestDate=newTestDate();
testDate.printDate();
}
此处声明了一个void类型的公有静态方法main(),main可接收String类型的参数。
“{}”内的代码就是main的方法体,此方法体实现了TestDate类的初始化,并调用类中的printDate()方法。
由于main()方法类型为空,系统默认返回值为null,所以在方法体代码中可不返回类型值。
代码注释
代码注释是放置在源代码中描述这段代码功能的注释性文字说明。
在Java中支持三种注释方式:
双斜线注释、Doc格式的注释和全文注释。
双斜线“//”通知编译器把从该斜线后开始到该行结束的所有内容看作文本进行处理,比如:
publicvoidprintDate()
{
//注释:
调用日期函数
pass=newDate();
//注释:
显示当前日期
System.out.println("当前日期:
"+pass);
}
代码和说明文档不能很好的结合,一直是程序员很头痛的问题,而Java中引入Doc格式的注释解决了这一大难题。
若要为您的程序生成文档,则应采用Doc格式注释符号(/***/)把文本行括起来,以便javadoc工具识别。
javadoc工具会查找源文件所包含的Doc注释,并利用这些注释生成API文档。
/***打印日期方法,并初始化pass的值*/publicvoidprintDate()
{
//注释:
调用日期函数
pass=newDate();
//注释:
显示当前日期
System.out.println("当前日期:
"+pass);
}
其中的
/***打印日期方法,并初始化pass的值*/
就是Doc格式注释方式。
全文注释如同双斜线(//)的注释,所不同的是双斜线(//)只注释当前行。
而用/**/的形式可注释/**/之间的所有文字。
最后,大家要注意几点:
1、main()方法的特殊性
凡是应用程序中有一个publicclass{}的类并且包含main()函数,那这就是程序的入口点。
main必须声明为staticvoidmain(Stringarg[])的形式。
此处的arg[]字符串数组是接收的是执行用户输入的参数。
如在DOS窗口执行:
javamy.test.TestDateplease
please就会传入args[]中,我们只要在main()方法中加入判断用户输入的字符串实现代码。
2、Java的书写格式
Java书写是自由格式,但是程序员都以SUN的代码规范为标准。
包名用小写,类名首字大写,方法名首字小写。
变量名一般小写。
如果这些名字太长,可按字意大写第二个代表意义的首字母。
如上面printDate中Date的首字母就用的大写。
四、Java游戏开发的优劣
您是不是在一开始就有个疑惑,为什么我们要选用Java做为本系列游戏开发的语言?
要想回答这个问题,我们得看看Java在游戏开发方面有哪些优势。
跨平台
“Writeonce,runeverywhere!
”这是Java最诱人的特点。
大部分游戏我们必须依赖于其特定的平台而存在。
但是Java编译后的文件是运行在Java虚拟机上的字节码。
虚拟机是消除了CPU和OS的差异,我们一般只要对配置文件、批处理文件作相应修改即把你编写的游戏平滑移植到你想要的任何平台。
你只要编写一个版本就可让全世界使用各种平台的游戏者玩到你的游戏。
网络模式
Java拥有强大的网络功能,能很容易的和网页结合在一起发布到世界各地。
游戏者只要通过浏览器就可体会到你游戏所带来的乐趣。
这意味着,你的游戏将面临着拥有全世界的玩家这个巨大市场。
多人模式
Java为程序开发提供了包,该包提供了一组使程序开发者可以轻易实现基于TCP/IP的分布式应用系统。
此外,Java还提供了专门针对互联网应用的类库。
这样你就可很方便的使你的游戏支持多人模式,任何玩家通过你的游戏都可和另一个地方的玩家进行游戏合作和对抗。
完全的面向对象
Java是一种完全的面向对象语言,这意味着,你可在你的游戏中很方便扩展和继承你的代码,而不像结构化程序设计语言那样再重新开发新的类库。
比如说你开发了某一类游戏的引擎,以后你再开发类似的游戏时几乎不要任何改动就可重新使用这个引擎,你要做的只是替换掉游戏中的图形、声音、动画等子系统。
简单易用
由于Java的结构类似于C和C++,所以熟悉C与C++语言的编程人员稍加学习就很容易掌握Java编程技术了。
其次,Java设计去除了C和C++中令人费解的特性,Java程序语言内置的有许多自动管理机制,比如自动内存管理机制,让你不会在程序中犯下大错,所以你可以很快地把程序写完,而如果使用其它语言必须要花更多时间。
有资料显示,用Java写程序比用其它语言快了四到十倍。
稳定性
Java对程序代码进行了很多的安全检测。
使程序员撰写的通过编译的代码几乎不会发生错误。
比如Java提供的真正的数组(Array),运行程序下标检查,另外,它在对象类型转换过程中将不会将任意数据进行转换,Java的自动内存管理也大大减少了运行时的错误。
多线程(multithreading)机制
Java是第一个把多线程和本身溶合在一起的OOP语言,多线程机制在Java中的编写和使用更加方便、容易。
多线程能让游戏开发利用不同的线程实现各种不同的行为,它的同步机制也保证了对共享数据的正确访问。
因此,使用Java语言可以非常轻松地实现网络上的实时交互行为。
在网络游戏和大量动画的Java游戏开发中多线程将起到很大的作用。
强大的类库支持
Java提供了广泛、标准、先进的API。
这些API包含了我们想要的所有功能。
网络分布计算、数据库连接、GUI设计、图形处理、声音处理等这些都有API了!
我们可以利用这些API轻易地写出功能强大的程序。
而且一旦你学会了某个JavaAPI,在Window下和Linux下使用都是一样的。
Java免费
SUN提供Java相关的工具,让你可以开发与执行Java程序。
你无须支付任何费用就可得到Java开发工具和JDK开发包。
可能大家也许会笑,这个也算Java游戏开发的一大优点吗?
然而,想想c/c++游戏开发上的对开发工具的庞大投资,你一定不会再笑Java免费所带来的经济利益了。
有优就有缺,Java语言做为一个新生语言在游戏开发中也有其自身的不足之处:
速度
Java执行代码比C++执行代码慢10-20秒,在游戏中这个看上去是个很大的缺陷。
但是在现在处理器速度不断提高,Java新的实时编译器“Just-in-time”和快速虚拟机的推出,两者之间的速度差距已经越来越小。
平台依赖性
由于Java虚拟机消除了平台的依赖性,所以使大家开发的依赖于某一平台特性的游戏便不能移植到别的平台去。
比如,你的某一Java游戏利用了Window平台的DirectX特性,而在Linux平台下这一特性就不能使用了。
游戏开发资源
由于Java是个新生语言,游戏开发者大部分都还集中在C、C++的阵营,Java方面所能提供的游戏开发资源还是比较有限的,特别在国内的主推J2EE