版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、前言这其实是我的Java游戏编程学习笔记,现在正在学习Java游戏编程,但从网上找到的学习文章都不太满意,所以我在一边学习一边整理,想尝试着整理 出一篇较为完整实用的学习材料。我现在学的是基于窗口界面的应用程序的开 发,想尝的游戏编程方向也是基于窗口或全屏幕界面的,因此整个文章也是在 基于窗口界面的前提下拓展开的,另外我对手机游戏编程也有一定的兴趣,这 些想放在最后整理。如果大家感兴趣的话可以跟随我的学习和我一起一步步由浅入深的掌握Java的游戏编程技术,从而编写出自己喜欢的游戏来 不过首先你需要掌握一些基本的 Java窗口界面的开发技术,限于本文章的 主题这里我就不赘述了,如果有时间和机会的
2、话,我可以再整理一篇另行叙 述。第一节先建立一个空白的窗口/java 文件的名字叫:MyWindow.javaimport javax.swing.*;public class MyWin dow exte nds JFrame MyWi ndow()设置窗口标题this.setTitle(” 这是我的窗口 );/ 设置窗口开始显示时距离屏幕左边 400 个象素点,/ 距离屏幕上边 200 个象素点,/ 窗口宽 300 个象素点,/ 窗口高 200 个象素点this.setBounds(400,200,300,200);/ 设置窗口关闭按钮具有关闭整个程序的功能this.setDefaultC
3、loseOperati on (JFrame.EXIT_ON_CLOSE);/置窗口大小不会改this.setResizable(false);/ 显示该窗口this.setVisible(true);public static void ma in (Stri ng args) 创建该窗口的实 体,开始整个程序new MyWindow();当你成功的运行了上述代码,一个空白的窗口就会展现在你的面前,下面 我们将会在这个舞台上开始我们的演出。顺便提议一下,如果没有特别声明,文章里面的程序代码都是用 JCreator 调试开发的,还有就是你的机器上必须要安装JDK也就是Sun公司给出的Java开
4、发工具包,JDK和JCreator的相关信息在网上很容易找到,这里就不赘述了。第二节在窗口上画一个 xx下面我们要在窗口上画点儿东西,画一个小圆,这个小圆是画在一个白板 上的,由于空白窗口自带了一个白板,所以我们在程序中要将这块白板替换成 我们用来画小圆的白板。/java 文件的名字叫:MyWindowimport javax.swing.*;import java.awt.*;public class MyWi ndow exte nds JFrame MyWi ndow()用我们的白板替换窗 口原来的白板this.setContentPane(new MyPanel();/设置窗口标题th
5、is.setTitle( 这是我的窗口 );/ 设置窗口开始显示时距离屏幕左边 400 个象素点,/ 距离屏幕上边 200 个象素点,/ 窗口宽 300 个象素点,/ 窗口高 200 个象素点this.setBounds(400,200,300,200);/ 设置窗口关闭按钮具有关闭整个程序的功能this.setDefaultCloseOperati on (JFrame.EXIT_ON_CLOSE);/置窗口大小不会改 变this.setResizable(false);/ 显示该窗口this.setVisible(true);public static void ma in (Stri n
6、g args) 创建改窗口的实 体,开始整个程序new MyWindow();/ 这就是我们的要画圆的白板class MyPanel extends JPanel /这/ 一部分是专门画画的,/ 当面板第一次显示的时候,/ 会自动调用这个来在白板上画画public void pai nt(Graphics g)/设置画圆用的颜色,红色g.setColor(Color.RED);/ 在距离白板左边 30 个象素/ 上边 40 个象素的地方,/ 画一个直径为 20 个象素的圆g.fillOval(30,40,20,20);第三节让小圆从上到下动起来下面我们要让小圆动起来了,原理是每隔一定的时间间隔
7、我们就把已经画 好的小圆擦掉,然后再在新的位置画一个新的小圆,不断的这样做,我们的小 圆也就动起来了。/java 文件的名字叫:MyWindowimport javax.swing.*;import java.awt.*;import java.awt.event.*;public class MyWi ndow exte nds JFrame MyWi ndow()用我们的白板替换窗 口原来的白板this.setContentPane(new MyPanel();/ 设置窗口标题this.setTitle(” 这是我的窗口 );/ 设置窗口开始显示时距离屏幕左边 400 个象素点,/ 距离屏
8、幕上边 200 个象素点,/ 窗口宽 300 个象素点,/ 窗口高 200 个象素点this.setBounds(400,200,300,200);/ 设置窗口关闭按钮具有关闭整个程序的功能this.setDefaultCloseOperati on (JFrame.EXIT_ON_CLOSE);/置窗口大小不会改 变this.setResizable(false);/ 显示该窗口this.setVisible(true);public static void ma in (Stri ng args) 创建改窗口的实 体,开始整个程序new MyWindow();/ 这就是我们的要画圆的白板/
9、implements ActionListener 是对白板加入一个动作监视器class MyPanel extends JPanel implements ActionListener /声/ 明小圆的行坐 标,也就是与白板上边的距离int y;/ 声明一个计时器Timer timer;MyPanel()设置程序开始小圆距离白板上边为5个象素y = 5;/ 创建我们的计时器/100 是说计时器 100 毫秒动作一次/this 是指用我们的面板上的动作监视器/ 来处理计时器每 100毫秒动作一次的动作/也就是每隔 100毫秒我们将把白板上的小圆擦掉/ 再在新的位置重新画一个 xx/ 这样我们的
10、小圆也就动起来了timer = new Timer(100,this);/ 让计时器开始工作timer.start();/ 在这一部分我们来处理计时器/ 每 100 毫秒一次的动作public void actionPerformed(ActionEvent ae)/ 重新设定小圆的行坐标,距离 白板上边的距离y = y + 5;/ 如果小圆到了白板底边就再让他回到白板上边if(ythis.getHeight()y = 5;/ 重新调用 paint() 来画小圆repaint();/ 这一部分是专门画画的,/ 当面板第一次显示的时候,/ 会自动调用这个来在白板上画画public void pa
11、int(Graphics g)/ 将白板上原来的画的东西擦掉super.paint(g);/ 设置画圆用的颜色,红色g.setColor(Color.RED);/ 在距离白板左边 30 个象素/ 上边 y 个象素的地方,/ 画一个直径为 20 个象素的圆g.fillOval(30,y,20,20);现在我的小圆已经会动了,但在有的设备上那个会动的小圆会有闪烁现 象,这是由于每一次画小圆前我们都清除屏幕,在一个毫秒内会就会看到一个 空白的屏幕,在快速的变换操作中就出现闪烁现象,因此在通常的游戏编程中 是采用另外一种方法让小球动起来的,我们下节接着说。第三节采用双缓冲(Double bufferi
12、ng)技术让小圆活动看到题目你已经知道答案了,问题是什么是双缓冲(Double bufferi ng)技术?简单的说就是我们先在内存里面申请一块缓冲区,我们所有的绘画都是在缓冲 区里面进行的,只有在需要显示的时候,我们才把缓冲区的内容显示出来,这 样我们每一次调用panit()画小圆都不用先清除白板上的内容再画小圆了,我们 每次都是直接把缓冲区内的内容直接画到白板上,根本不存在一个毫秒内有空 白的屏幕的问题。这里我们还要多做一些事情才能享受到双缓冲(Double bufferi ng)技术的好处,通常我们是用createlmage(宽,高)来申请一个设定宽、高大小的缓冲区区 域的,但如果宽、高
13、为 0 则不能成功获得所申请的缓冲区,一般都是用白板的 宽和高来设定申请缓冲区的宽、高的,白板的宽、高一定会有值的,但也会出 现无法获得缓冲区的问题,这是因为当程序启动后白板还没有正常显示出来的 时候,这时所获取的宽、高即为 0,如果在此时就申请缓冲区那一定不会成功 的,为此在下面的程序中多用了一个时钟来定时监视白板的宽、高值是否大于 0,在大于 0以后再去申请缓冲区,就不会出现上述问题了。/java 文件的名字叫:MyWindowimport javax.swing.*;import java.awt.*;import java.awt.event.*;public class MyWi n
14、dow exte nds JFrame MyWi ndow()用我们的白板替换窗 口原来的白板this.setContentPane(new MyPanel();/ 设置窗口标题this.setTitle(” 这是我的窗口 );/ 设置窗口开始显示时距离屏幕左边 400 个象素点,/ 距离屏幕上边 200 个象素点,/ 窗口宽 300 个象素点,/ 窗口高 200 个象素点this.setBounds(400,200,300,200);/ 设置窗口关闭按钮具有关闭整个程序的功能this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/ 设置窗口大
15、小不会改变this.setResizable(false);/ 显示该窗口this.setVisible(true);public static void ma in (Stri ng args) 创建改窗口的实 体,开始整个程序new MyWindow();/ 这就是我们的要画圆的白板/implements ActionListener 是对白板加入一个动作监视器class MyPanel extends JPanel implements ActionListener /声/ 明小圆的行坐 标,也就是与白板上边的距离int y;/ 声明两个计时器/timer 计时器还是作为我们原来定时画小
16、圆用的/timerl计时器用来解决this.createlmage()可能会/ 无法取得画图缓冲区的问题Timer timer,timer1;/ 获得画图缓冲区,在这里进行画图/ 在需要的时候才画到白板上lmage buf;/ 你可以把他理解成在缓冲区进行画图的手/ 他可以在缓冲区进行绘画Graphics bg;MyPanel()设置程序开始小圆距离白板上边为5个象素y = 5;/ 创建第一个计时器,让他开始/ 监视是否可以获得画图缓冲区了timer1 = new Timer(100,this);/ 让这个计时器开始工作timer1.start();/ 在这一部分我们来处理计时器/ 每 100
17、 毫秒一次的动作public void actionPerformed(ActionEvent ae)/ 重新设定小圆的行坐标,距离 白板上边的距离y = y + 5;/ 如果小圆到了白板底边就再让他回到白板上边if(ythis.getHeight()y = 5;/createImage() 之所以会无法取得画图缓冲区/ 是因为在设定缓冲区宽和高为 0 的时候,将无法/ 取得缓冲区,但我们是用白板的宽和高来设定的,/ 他怎么还是会出现无法获得画图缓冲区的问题呢?/ 这是因为在白板还没有被程序正常显示出来的时候,/ 这时就去要求获得画图缓冲区,取得的白板的/ 宽和高就可能是 0,我们解决的方法就
18、是,/ 判断白板的宽和高的值是否已经大于 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 毫
19、秒动作一次的动作/ 也就是每隔 100 毫秒我们将把白板上的小圆擦掉/ 再在新的位置重新画一个 xx/ 这样我们的小圆也就动起来了timer = new Timer(100,this);/ 让我们的画图计时器开始工作timer.start();/ 让已经完成使命的那个计时器停止工作timer1.stop();/ 开始定时画图,让小圆动起来update();public void update()/ 用白板背景颜色绘制一个缓冲区大小的矩形/ 将缓冲区内的图像全部擦掉,/ 从而达到画图前清屏幕的效果,/ 但这里清除的时缓冲区的内容bg.setColor(this.getBackground();b
20、g.fillRect (0, 0, this.getSize().width, this.getSize().height);/在缓冲区新的位置 绘制小圆,颜色为红色bg.setColor (Color.RED);bg.fillOval(30,y,20,20);/ 再次调用 paint()/ 将已经改好的缓冲区的内容一次性的画到白板上 repaint();/ 这一部分是专门画画的,/ 当面板第一次显示的时候,/ 会自动调用这个来在白板上画画public void paint(Graphics g)/ 将画图缓冲区的内容画到白板上 g.drawImage (buf, 0, 0, this);第四
21、节让小圆上下反弹 这一节让我轻松一下,没有太多新的内容,只是加入一个方向值,让我们的小圆在白板上边和底边之间来回反弹,先看看新加入的代码吧,研究一下很 容易理解的,/ 重新设定小圆的行坐标,距离白板上边的距离y = y + 5*direct;/ 如果小圆到了白板底边就设定方向值为负,反向移动小圆上升if(y=this.getHeight()direct = -1;/ 如果小圆到了白板上边就 / 设定方向值为正,反向移动小圆下降 if(y=this.getHeight()direct = -1;/ 如果 xx 到了白板上边就/ 设定方向值为正,反向移动 xx 下降if(y0 & this.getHeight()0)/ 判断是否已经创建了画图缓冲区 if(buf=null)/ 按屏幕大小创建画图缓冲区buf = this.createImage(this.getWidth(),this.getHeight();/ 让 bg
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 成本实操-养生馆成本核算案例
- 2026年吉林省汪清县中考物理押题试卷含解析
- 安徽省砀山县2026届中考联考物理试题含解析
- 山东省潍坊市青州市益都中学2026届中考四模物理试题含解析
- 中医儿科护理的食疗方法
- 山西省阳泉市平定县重点中学2026年中考试题猜想物理试卷含解析
- 中医护理产科护理课件
- 中医眼保健护理工作坊
- 巴音郭楞蒙古自治州和静县2025届数学四年级下学期期中学业水平测试模拟试题(含解析)
- 中职护理护理职业培训教材课件
- 可再生资源利用地理基础知识试题及答案
- DB6501T 036-2022 乌鲁木齐市海绵城市建设设计导则
- 集装箱房屋拆除施工方案
- (正式版)DB15∕T 2537-2022 《涉路工程安全性评价报告编制指南》
- 小儿柴胡退热颗粒课件
- 年产5万吨丙酸工艺设计
- 文化赛事管理办法
- 2025年浙江省中考科学试题卷(含答案解析)
- 2025届广东省广州市荔湾区真光中学高一物理第二学期期末学业质量监测试题含解析
- 2025年高考真题-生物(四川卷) 含答案
- 检验表4.43 浆砌石、灌砌石挡墙浆砌体单元工程施工质量检验表
评论
0/150
提交评论