2009.2009. 17游戏编程GAME PROGRAMJava Applet 开发大鱼吃小鱼游戏江 洪摘 要 : 利用 Java applet 成功开发的大鱼吃小鱼的游戏 , 对其开发思路 , 以及对网页使用 Java语言编程技巧进行了描述 , 具有一定的知识性和趣味性 关键词 : Java Applet; 网页 ; 大鱼吃小鱼图 1 游戏运行界面表 1 Java Applet 中重要方法1 前言用 Java 语言进行程序开发 , 目 前 十 分 流 行 , 尤 其 在Internet 上 , 经常可以看到 Java 语言写的程序 可以将 Java 代码嵌入 HTML 网页文件中 , 以丰富超文本文件的内容 , 这样的程序称为 Java applet (即 Java 小程序 ) 用 Java Applet 可以很容易地开发出具有动画效果的程序 , 因此也适合开发具有人机交互功能的游戏 这里结合大鱼吃小鱼游戏的开发 , 讲述了使用 Java 开发嵌入在 html 文件中小程序的主要方法 2 概述“大鱼吃小鱼 , 小鱼吃虾米 ” 是海洋世界中的基本规律 游戏的主角是海洋中的霸主 -大鲨鱼 , 可以自由控制大鲨鱼的移动 , 吃掉所有的小鱼 。
但是 , 在吃小鱼的同时 , 大鲨鱼仍然要躲开危险的气泡 , 否则会损失生命值 每吃一条小鱼 , 会得到一定的分值 (从 1 分到 8 分不等 ), 同时增加相同数值的生命值 游戏的目标是得到尽可能多的分数 下面是本游戏运行的界面如图 1 所示 3 开发技巧Java Applet 是一种嵌入 html 文件中的小程序 , 在包含该程序的 html 文件中要有如下声明 :alt="Your browser understands the
类中有如下重要方法 , 如表 1 所示 游戏中的每种鱼都对应一个 gif 图形文件 鱼的图形从Internet 上下载得到 , 并且经过 PhotoShop 处理 , 使其背景能够透明显示 , 这样 , 鱼的图形便能与蓝色背景相融合 所有鱼的图片都有正向和反向两个文件 用 getImage 函数装载图片 , 用drawImage 函数显示图片 为了消除图片显示闪烁 , 可以创建一个后台图形对象 , 将所有要显示的东西先向这个后台对象写入 , 然后再一次性地将该后台对象显示到屏幕 732009. 17要使小鱼动起来 , 需要建立一个线程 , 在该线程中每隔一段时间要按一定规则更改小鱼的坐标 这样周而复始地改变小鱼的坐标并显示 , 实际效果就是小鱼在不停地游动 大鲨鱼和小鱼图片相重叠时 , 程序中会有一个判断 , 从而增加分数和生命值 , 并暂停该小鱼的显示 , 实际效果就是小鱼被吃掉了 同样 , 大鲨鱼图片和气泡相重叠时 , 程序也会进行判断 ,从而减少生命值 4 程序代码import java.awt.*;import java.awt.event.*;import java.applet.Applet;/* 从 Applet 中派生类 ,同时加入鼠标处理 、线程处理 */public class FishEat extends Applet implementsMouseMotionListener,Runnable{public Image offScreenImage; //后台画布public Graphics offScreen; //后台图形对象public int mousex,mousey,lastmousex,lastmousey;//表示鼠标的当前坐标和上一次的坐标public int direction=1;//表示大鲨鱼的前进方向 ,1 为正向 ,0 为反向public Thread timer; //时间线程public int[][] fishpos; //记录小鱼的当前坐标public int[][] bubblepos; //记录气泡的当前坐标public int showfish1,showfish2,showfish3,showfish4,showfish5,showfish6,showfish7,showfish8;//用于表示画面上是否显示小鱼 ,1 为显示 ,0 为不显示/* 表示各种小鱼的图形对象 ,分为正向和反向两种 ,共有 8 种小鱼 */public Image image0z,image0f;… //以下省略 8 种小鱼图片public int score=0; //用于记录得分public int life=100; //用于记录生命值public long starttime; //表示游戏开始运行时间public void start(){timer=new Thread(this);timer.start();}public void stop(){timer=null;}public void run() //线程运行{Thread me=Thread.currentThread();while(timer==me){try{Thread.currentThread().sleep(500); //让线程睡眠}catch(InterruptedException e){}//更新小鱼 1 的当前坐标if(showfish1==1)if(fishpos[0][0]%50==0){fishpos[0][0]=fishpos[0][0]+50;if(fishpos[0][0]>540){fishpos[0][0]=536;}}else{fishpos[0][0]=fishpos[0][0]-50;if(fishpos[0][0]=fishpos[0][0]&&mousex+70=fishpos [0][1]&&mousey+32100)life=100;score=score+6;fishpos[0][0]=0;fishpos[0][1]=40;showfish1=0;}//省略吃其他小鱼代码…/* 根据大鲨鱼的坐标 ,决定是否显示小鱼 */if(mousey>300)showfish1=1;//省略其他小鱼是否显示代码…//显示得分及时间offScreen.setFont(new Font("Dialog",Font.PLAIN,28));offScreen.setColor(Color.yellow);offScreen.drawString("得分 :"+score,20,20);offScreen.drawString(" 时 间 :" +(System.currentTimeMillis () -starttime)/1000,250,20);//显示气泡offScreen.setColor(Color.white);offScreen.fillOval(bubblepos[0][0],bubblepos[0][1],30,30);offScreen.fillOval(bubblepos[1][0],bubblepos[1][1],30,30);offScreen.fillOval(bubblepos[2][0],bubblepos[2][1],30,30);/* 吃到气泡 ,减少生命值 ,并重新计算气泡位置 */if (bubblepos [0][0]+15>=mousex&&bubblepos [0][0]+15=mousey&&bubblepos[0][1]+15 0)continue;if(m_Frustum[i][A] * (x - size) + m_Frustum[i][B] * (y -size) + m_Frustum[i][C] * (z + size) + m_Frustum[i][D] > 0)continue;if(m_Frustum[i][A] * (x + size) + m_Frustum[i][B] * (y -size) + m_Frustum[i][C] * (z + size) + m_Frustum[i][D] > 0)continue;if(m_Frustum[i][A] * (x - size) + m_Frustum[i][B] * (y +size) + m_Frustum[i][C] * (z + size) + m_Frustum[i][D] > 0)continue;if(m_Frustum[i][A] * (x + size) + m_Frustum[i][B] * (y +size) + m_Frustum[i][C] * (z + size) + m_Frustum[i][D] > 0)continue;return false;}return true;}这个函数明显要复杂一些 , 因为对于每一个边界面包围盒的 8 个顶点都需要测试 。
如果包围盒的 8 个顶点都在某个边界面的背面 , 包围盒立即被剔除 如果包围盒顶点落在两个以上的边界面背面 , 它潜在地与视锥相交 如果包围盒的八个顶点在所有边界面的正面 , 那么包围盒全部包含在视锥内部 如果包围盒八个顶点中检测到任何两个顶点落在某个边界面的两侧 , 循环就终止 , 这时包围盒与视锥相交 3 结语在计算机图形领域中 , 消稳问题是广泛存在的 随着计算机图形学的不断发展 , 场景模型越来越精细复杂 , 因此解决渲染质量与绘制速度这两者之间的矛盾是消隐问题的关键所在 文中阐述的视锥剔除算法提高了渲染时的绘制速度 , 能够有效地提高场景的绘制效率 收稿日期 : 2009-4-19)mousey+64){life=life-30;bubblepos[0][0]=100;bubblepos[0][1]=450;} if(bubblepos[1][0]+15>=mousex&&bubblepos[1][0]+15=mousey&&bubblepos[1][1]+15=mousex&&bubblepos[2][0]+15=mousey&&bubblepos[2][1]+15lastmousex)direction=1;elsedirection=0;lastmousex=mousex;lastmousey=mousey;mousex=(int)e.getX();mousey=(int)e.getY();repaint();}}5 结语将 Java 嵌入在 HTML 网页文件中 , 丰富超文本文件内容 ,并可以轻松地开发出动画效果良好的程序 。
因此 , 非常适合开发人机交互的游戏 希望大鱼吃小鱼游戏的开发过程对从事Java Applet 开发的读者有所帮助 参考文献[1] 朱福喜 , 尹为民 , 余振坤 . Java 语言与面向对象程序设计 .武汉大学出版社 , 2002.(收稿日期 : 2009-5-19)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!76。