Java游戏编程从入门到精通.docx
- 文档编号:30129993
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:21
- 大小:18.65KB
Java游戏编程从入门到精通.docx
《Java游戏编程从入门到精通.docx》由会员分享,可在线阅读,更多相关《Java游戏编程从入门到精通.docx(21页珍藏版)》请在冰豆网上搜索。
Java游戏编程从入门到精通
前言
这其实是我的Java游戏编程学习笔记,现在正在学习Java游戏编程,但从网上找到的学习文章都不太满意,所以我在一边学习一边整理,想尝试着整理出一篇较为完整实用的学习材料。
我现在学的是基于窗口界面的应用程序的开发,想尝的游戏编程方向也是基于窗口或全屏幕界面的,因此整个文章也是在基于窗口界面的前提下拓展开的,另外我对手机游戏编程也有一定的兴趣,这些想放在最后整理。
如果大家感兴趣的话可以跟随我的学习和我一起一步步由浅入深的掌握Java的游戏编程技术,从而编写出自己喜欢的游戏来……
不过首先你需要掌握一些基本的Java窗口界面的开发技术,限于本文章的主题这里我就不赘述了,如果有时间和机会的话,我可以再整理一篇另行叙述。
第一节先建立一个空白的窗口
//java文件的名字叫:
MyWindow.java
import javax.swing.*;
publicclassMyWindowextendsJFrame
{
MyWindow()
{
//设置窗口标题
this.setTitle("这是我的窗口");
//设置窗口开始显示时距离屏幕左边400个象素点,
//距离屏幕上边200个象素点,
//窗口宽300个象素点,
//窗口高200个象素点
this.setBounds(400,200,300,200);
//设置窗口关闭按钮具有关闭整个程序的功能
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口大小不会改变
this.setResizable(false);
//显示该窗口
this.setVisible(true);
}
publicstaticvoidmain(Stringargs[])
{
//创建该窗口的实体,开始整个程序
newMyWindow();
}
}
当你成功的运行了上述代码,一个空白的窗口就会展现在你的面前,下面我们将会在这个舞台上开始我们的演出。
顺便提议一下,如果没有特别声明,文章里面的程序代码都是用JCreator调试开发的,还有就是你的机器上必须要安装JDK,也就是Sun公司给出的Java开发工具包,JDK和JCreator的相关信息在网上很容易找到,这里就不赘述了。
第二节在窗口上画一个小圆
下面我们要在窗口上画点儿东西,画一个小圆,这个小圆是画在一个白板上的,由于空白窗口自带了一个白板,所以我们在程序中要将这块白板替换成我们用来画小圆的白板。
//java文件的名字叫:
MyWindow
import javax.swing.*;
import java.awt.*;
publicclassMyWindowextendsJFrame
{
MyWindow()
{
//用我们的白板替换窗口原来的白板
this.setContentPane(newMyPanel());
//设置窗口标题
this.setTitle("这是我的窗口");
//设置窗口开始显示时距离屏幕左边400个象素点,
//距离屏幕上边200个象素点,
//窗口宽300个象素点,
//窗口高200个象素点
this.setBounds(400,200,300,200);
//设置窗口关闭按钮具有关闭整个程序的功能
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口大小不会改变
this.setResizable(false);
//显示该窗口
this.setVisible(true);
}
publicstaticvoidmain(Stringargs[])
{
//创建改窗口的实体,开始整个程序
newMyWindow();
}
}
//这就是我们的要画圆的白板
classMyPanelextendsJPanel
{
//这一部分是专门画画的,
//当面板第一次显示的时候,
//会自动调用这个来在白板上画画
publicvoidpaint(Graphicsg)
{
//设置画圆用的颜色,红色
g.setColor(Color.RED);
//在距离白板左边30个象素
//上边40个象素的地方,
//画一个直径为20个象素的圆
g.fillOval(30,40,20,20);
}
}
第三节让小圆从上到下动起来
下面我们要让小圆动起来了,原理是每隔一定的时间间隔我们就把已经画好的小圆擦掉,然后再在新的位置画一个新的小圆,不断的这样做,我们的小圆也就动起来了。
//java文件的名字叫:
MyWindow
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
publicclassMyWindowextendsJFrame
{
MyWindow()
{
//用我们的白板替换窗口原来的白板
this.setContentPane(newMyPanel());
//设置窗口标题
this.setTitle("这是我的窗口");
//设置窗口开始显示时距离屏幕左边400个象素点,
//距离屏幕上边200个象素点,
//窗口宽300个象素点,
//窗口高200个象素点
this.setBounds(400,200,300,200);
//设置窗口关闭按钮具有关闭整个程序的功能
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口大小不会改变
this.setResizable(false);
//显示该窗口
this.setVisible(true);
}
publicstaticvoidmain(Stringargs[])
{
//创建改窗口的实体,开始整个程序
newMyWindow();
}
}
//这就是我们的要画圆的白板
//implementsActionListener是对白板加入一个动作监视器
classMyPanelextendsJPanelimplementsActionListener
{
//声明小圆的行坐标,也就是与白板上边的距离
inty;
//声明一个计时器
Timertimer;
MyPanel()
{
//设置程序开始小圆距离白板上边为5个象素
y=5;
//创建我们的计时器
//100是说计时器100毫秒动作一次
//this是指用我们的面板上的动作监视器
//来处理计时器每100毫秒动作一次的动作
//也就是每隔100毫秒我们将把白板上的小圆擦掉
//再在新的位置重新画一个小圆
//这样我们的小圆也就动起来了
timer=newTimer(100,this);
//让计时器开始工作
timer.start();
}
//在这一部分我们来处理计时器
//每100毫秒一次的动作
publicvoidactionPerformed(ActionEventae)
{
//重新设定小圆的行坐标,距离白板上边的距离
y=y+5;
//如果小圆到了白板底边就再让他回到白板上边
if(y>this.getHeight())
y=5;
//重新调用paint()来画小圆
repaint();
}
//这一部分是专门画画的,
//当面板第一次显示的时候,
//会自动调用这个来在白板上画画
publicvoidpaint(Graphicsg)
{
//将白板上原来的画的东西擦掉
super.paint(g);
//设置画圆用的颜色,红色
g.setColor(Color.RED);
//在距离白板左边30个象素
//上边y个象素的地方,
//画一个直径为20个象素的圆
g.fillOval(30,y,20,20);
}
}
现在我的小圆已经会动了,但在有的设备上那个会动的小圆会有闪烁现象,这是由于每一次画小圆前我们都清除屏幕,在一个毫秒内会就会看到一个空白的屏幕,在快速的变换操作中就出现闪烁现象,因此在通常的游戏编程中是采用另外一种方法让小球动起来的,我们下节接着说。
第三节采用双缓冲(Doublebuffering)技术让小圆活动
看到题目你已经知道答案了,问题是什么是双缓冲(Doublebuffering)技术?
简单的说就是我们先在内存里面申请一块缓冲区,我们所有的绘画都是在缓冲区里面进行的,只有在需要显示的时候,我们才把缓冲区的内容显示出来,这样我们每一次调用panit()画小圆都不用先清除白板上的内容再画小圆了,我们每次都是直接把缓冲区内的内容直接画到白板上,根本不存在一个毫秒内有空白的屏幕的问题。
这里我们还要多做一些事情才能享受到双缓冲(Doublebuffering)技术的好处,通常我们是用createImage(宽,高)来申请一个设定宽、高大小的缓冲区区域的,但如果宽、高为0则不能成功获得所申请的缓冲区,一般都是用白板的宽和高来设定申请缓冲区的宽、高的,白板的宽、高一定会有值的,但也会出现无法获得缓冲区的问题,这是因为当程序启动后白板还没有正常显示出来的时候,这时所获取的宽、高即为0,如果在此时就申请缓冲区那一定不会成功的,为此在下面的程序中多用了一个时钟来定时监视白板的宽、高值是否大于0,在大于0以后再去申请缓冲区,就不会出现上述问题了。
//java文件的名字叫:
MyWindow
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
publicclassMyWindowextendsJFrame
{
MyWindow()
{
//用我们的白板替换窗口原来的白板
this.setContentPane(newMyPanel());
//设置窗口标题
this.setTitle("这是我的窗口");
//设置窗口开始显示时距离屏幕左边400个象素点,
//距离屏幕上边200个象素点,
//窗口宽300个象素点,
//窗口高200个象素点
this.setBounds(400,200,300,200);
//设置窗口关闭按钮具有关闭整个程序的功能
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口大小不会改变
this.setResizable(false);
//显示该窗口
this.setVisible(true);
}
publicstaticvoidmain(Stringargs[])
{
//创建改窗口的实体,开始整个程序
newMyWindow();
}
}
//这就是我们的要画圆的白板
//implementsActionListener是对白板加入一个动作监视器
classMyPanelextendsJPanelimplementsActionListener
{
//声明小圆的行坐标,也就是与白板上边的距离
inty;
//声明两个计时器
//timer计时器还是作为我们原来定时画小圆用的
//timer1计时器用来解决this.createImage()可能会
//无法取得画图缓冲区的问题
Timertimer,timer1;
//获得画图缓冲区,在这里进行画图
//在需要的时候才画到白板上
Imagebuf;
//你可以把他理解成在缓冲区进行画图的手
//他可以在缓冲区进行绘画
Graphicsbg;
MyPanel()
{
//设置程序开始小圆距离白板上边为5个象素
y=5;
//创建第一个计时器,让他开始
//监视是否可以获得画图缓冲区了
timer1=newTimer(100,this);
//让这个计时器开始工作
timer1.start();
}
//在这一部分我们来处理计时器
//每100毫秒一次的动作
publicvoidactionPerformed(ActionEventae)
{
//重新设定小圆的行坐标,距离白板上边的距离
y=y+5;
//如果小圆到了白板底边就再让他回到白板上边
if(y>this.getHeight())
y=5;
//createImage()之所以会无法取得画图缓冲区
//是因为在设定缓冲区宽和高为0的时候,将无法
//取得缓冲区,但我们是用白板的宽和高来设定的,
//他怎么还是会出现无法获得画图缓冲区的问题呢?
//这是因为在白板还没有被程序正常显示出来的时候,
//这时就去要求获得画图缓冲区,取得的白板的
//宽和高就可能是0,我们解决的方法就是,
//判断白板的宽和高的值是否已经大于0了,
//等大于0了再去要求获得画图缓冲区
if(this.getWidth()>0&&this.getHeight()>0)
{
//判断是否已经创建了画图缓冲区
if(buf==null)
{
//按屏幕大小创建画图缓冲区
buf=this.createImage(this.getWidth(),this.getHeight());
//让bg成为可以在画图缓冲区画图的手
bg=buf.getGraphics();
//创建我们真正的画图计时器
//100是说计时器100毫秒动作一次
//this是指用我们的面板上的动作监视器
//来处理计时器每100毫秒动作一次的动作
//也就是每隔100毫秒我们将把白板上的小圆擦掉
//再在新的位置重新画一个小圆
//这样我们的小圆也就动起来了
timer=newTimer(100,this);
//让我们的画图计时器开始工作
timer.start();
//让已经完成使命的那个计时器停止工作
timer1.stop();
}
//开始定时画图,让小圆动起来
update();
}
}
publicvoidupdate()
{
//用白板背景颜色绘制一个缓冲区大小的矩形
//将缓冲区内的图像全部擦掉,
//从而达到画图前清屏幕的效果,
//但这里清除的时缓冲区的内容
bg.setColor(this.getBackground());
bg.fillRect(0,0,this.getSize().width,this.getSize().height);
//在缓冲区新的位置绘制小圆,颜色为红色
bg.setColor(Color.RED);
bg.fillOval(30,y,20,20);
//再次调用paint()
//将已经改好的缓冲区的内容一次性的画到白板上
repaint();
}
//这一部分是专门画画的,
//当面板第一次显示的时候,
//会自动调用这个来在白板上画画
publicvoidpaint(Graphicsg)
{
//将画图缓冲区的内容画到白板上
g.drawImage(buf,0,0,this);
}
}
第四节让小圆上下反弹
这一节让我轻松一下,没有太多新的内容,只是加入一个方向值,让我们的小圆在白板上边和底边之间来回反弹,先看看新加入的代码吧,研究一下很容易理解的,
//重新设定小圆的行坐标,距离白板上边的距离
y=y+5*direct;
//如果小圆到了白板底边就设定方向值为负,反向移动小圆上升
if(y>=this.getHeight())
direct=-1;
//如果小圆到了白板上边就//设定方向值为正,反向移动小圆下降
if(y<=0)
direct=1;
搞明白了,就看看我们全部的代码吧。
//java文件的名字叫:
MyWindow
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
publicclassMyWindowextendsJFrame
{
MyWindow()
{
//用我们的白板替换窗口原来的白板
this.setContentPane(newMyPanel());
//设置窗口标题
this.setTitle("这是我的窗口");
//设置窗口开始显示时距离屏幕左边400个象素点,
//距离屏幕上边200个象素点,
//窗口宽300个象素点,
//窗口高200个象素点
this.setBounds(400,200,300,200);
//设置窗口关闭按钮具有关闭整个程序的功能
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口大小不会改变
this.setResizable(false);
//显示该窗口
this.setVisible(true);
}
publicstaticvoidmain(Stringargs[])
{
//创建改窗口的实体,开始整个程序
newMyWindow();
}
}
//这就是我们的要画圆的白板
//implementsActionListener是对白板加入一个动作监视器
classMyPanelextendsJPanelimplementsActionListener
{
//声明小圆的行坐标,也就是与白板上边的距离
inty;
//声明一个方向值以便改变小圆移动的方向
//这里只是让小圆能反向运动
intdirect;
//声明两个计时器
//timer计时器还是作为我们原来定时画小圆用的
//timer1计时器用来解决this.createImage()可能会
//无法取得画图缓冲区的问题
Timertimer,timer1;
//获得画图缓冲区,在这里进行画图
//在需要的时候才画到白板上
Imagebuf;
//你可以把他理解成在缓冲区进行画图的手
//他可以在缓冲区进行绘画
Graphicsbg;
MyPanel()
{
//设置程序开始小圆距离白板上边为5个象素
y=5;
//设置方向为1,为正方向,向下移动
//如果为-1则向上移动
direct=1;
//创建第一个计时器,让他开始
//监视是否可以获得画图缓冲区了
timer1=newTimer(100,this);
//让这个计时器开始工作
timer1.start();
}
//在这一部分我们来处理计时器
//每100毫秒一次的动作
publicvoidactionPerformed(ActionEventae)
{
//重新设定小圆的行坐标,距离白板上边的距离
y=y+5*direct;
//如果小圆到了白板底边就
//设定方向值为负,反向移动小圆上升
if(y>=this.getHeight())
direct=-1;
//如果小圆到了白板上边就
//设定方向值为正,反向移动小圆下降
if(y<=0)
direct=1;
//createImage()之所以会无法取得画图缓冲区
//是因为在设定缓冲区宽和高为0的时候,将无法
//取得缓冲区,但我们是用白板的宽和高来设定的,
//他怎么还是会出现无法获得画图缓冲区的问题呢?
//这是因为在白板还没有被程序正常显示出来的时候,
//这时就去要求获得画图缓冲区,取得的白板的
//宽和高就可能是0,我们解决的方法就是,
//判断白板的宽和高的值是否已经大于0了,
//等大于0了再去要求获得画图缓冲区
if(this.getWidth()>0&&this.getHeight()>0)
{
//判断是否已经创建了画图缓冲区
if(buf==null)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 游戏 编程 入门 精通
![提示](https://static.bdocx.com/images/bang_tan.gif)