📄 wastem.java
字号:
import java.applet.*;import java.awt.*;import java.awt.event.*;import java.lang.Math;import java.net.*;import java.awt.image.*;import java.util.*;public class Wastem extends Applet implements ActionListener{ Image bird, logo; AudioClip Shot_AC, Hit_AC, Empty_AC; //初始化 public void init() { //设置颜色和布局 setBackground(Color.black); setLayout(null); //因为midiatracker类不支持AudioClips,所以首先载入声音文件, Shot_AC = getAudioClip(getCodeBase(),"shot.au"); Hit_AC = getAudioClip(getCodeBase(),"crash.au"); Empty_AC = getAudioClip(getCodeBase(),"empty.au"); //对每幅图片的上载情况进行跟踪,以便在游戏开始时,用户能看到所有的图片 MediaTracker tracker = new MediaTracker(this); //获取图片 bird = getImage(getCodeBase(), "ball.gif"); Image blast = getImage(getCodeBase(), "bang.gif"); Image hit = getImage(getCodeBase(), "blast.gif"); //将图片添加到media tracker中 tracker.addImage(blast, 0); tracker.addImage(bird, 1); tracker.addImage(hit, 2); //等待图片上载完毕 try { tracker.waitForID(0); tracker.waitForID(1); tracker.waitForID(2); } catch(Exception e) { System.out.println("Error in waiting for images: " + e); } ShootRange shootrange = new ShootRange(bird,blast,hit,Shot_AC,Hit_AC,Empty_AC,350,100); shootrange.setBounds(0,0,350,100); add(shootrange); //在游戏的右边放置一个logo,当用户单击时将浏览器指向设定的网址 logo = getImage(getCodeBase(),"ScufoLo.gif"); ImageCanvas logocanvas = new ImageCanvas(logo,94,52,"http://www.yahoo.com"); logocanvas.addActionListener(this); logocanvas.setBounds(360,24,100,52); add(logocanvas); } public void actionPerformed(ActionEvent e) { String arg = e.getActionCommand(); //使浏览器重定向 gotourl(new String(arg)); } //该类实现让浏览器浏览指定的网址 void gotourl(String urlstring) { try { URL url1 = new URL( urlstring ); AppletContext appletcontext1 = getAppletContext(); appletcontext1.showDocument(url1, "_top"); } catch( MalformedURLException malformedurlexception1 ) { malformedurlexception1.printStackTrace(); } }}class ShootRange extends Canvas implements MouseListener, Runnable{ int mousex,mousey,Xsize,Ysize; //标准的鼠标位置以及游戏区域大小 int birdmax = 10;//每个的射击目标数目 int score; //分数 int level; //关数 int bullets; //剩余子弹数目 int waittime; //线程睡眠时间 double blast = 15.0;// 爆炸半径(从射击中心到目标中心的距离) double birdx[] = new double[birdmax];//射击目标的x坐标 double birdy[] = new double[birdmax];//射击目标的y坐标 double birdvx[] = new double[birdmax];//射击目标在x方向的速度 double birdvy[] = new double[birdmax];//射击目标在y方向的速度 int birdstart[] = new int[birdmax];//起始位置 int birddirn[] = new int[birdmax];//运动方向:left=1, right=-1 boolean wait = false;//显示关数变化的标志 int fire = -1;//表示爆炸次数的计数器 int shot = -1;//表示射击次数的计数器 boolean gameover = true; // 判断游戏是否结束的标志 Cursor cursor; Image Bird, Blast, Hit; //图像 Thread thisthread; AudioClip Shot_AC, Hit_AC, Empty_AC; //声音文件 ShootRange(Image bird, Image blast, Image hit, AudioClip shot_ac, AudioClip hit_ac, AudioClip empty_ac,int xsize, int ysize) { int n; //标准计数器 Xsize = xsize; Ysize = ysize; addMouseListener(this); //基本设置 setSize(Xsize,Ysize); setBackground(Color.cyan); setCursor(cursor.getPredefinedCursor(cursor.CROSSHAIR_CURSOR)); mousex = 0; mousey = 0; Bird = bird; Blast = blast; Hit = hit; Shot_AC=shot_ac; Hit_AC=hit_ac; Empty_AC=empty_ac; //为新游戏调用startpositions()方法 startpositions(); //启动线程 thisthread = new Thread(this); thisthread.start(); } void startpositions() { //将所有的变量设置为原始状态 waittime=40; score=0; bullets=12; level=0; } //通过判断鼠标单击时的指针坐标与目标中心坐标的距离是否小于爆炸范围 //从而判断目标是否被击中 boolean checkhit(int x1, int y1 , int x2, int y2, int n) { if(Math.sqrt(Math.pow(x1-x2,2) + Math.pow(y1-y2,2))<=blast) { //如果目标被击中,将其从屏幕上清除 birdx[n] = -1; birdy[n] = -1; birdvx[n]= -1; birdvy[n]= -1; birdstart[n] = 500; return true; } else { return false; } } //更新数据 public void update(Graphics g) { //使用标准的双缓冲区域方法更新数据 Graphics offgraph; Image offscreen = null; Dimension d = getSize(); offscreen = createImage(d.width, d.height); offgraph = offscreen.getGraphics(); offgraph.setColor(getBackground()); offgraph.fillRect(0, 0, d.width, d.height); offgraph.setColor(getForeground()); paint(offgraph); g.drawImage(offscreen, 0, 0, this); offscreen.flush(); } //paint()方法 public void paint(Graphics g) { int n; //将所有应该显示在屏幕上的目标进行绘制 for(n=0;n<birdmax;n++) if(birdx[n]!=-1) { g.drawImage(Bird,(int)birdx[n]-5,(int)birdy[n]-5,this); } //判断关数开关是否打开 if(wait) g.drawString("级别 " + level,90,40); //判断游戏是否结束 if(gameover) g.drawString("游戏结束,请单击鼠标重新开始游戏!",90,40); //如果开枪,则绘制射击图像 if(fire>=0) g.drawImage(Blast,mousex-15,mousey-15,this); //如果一个目标被击中,则显示爆炸图像 if(shot>=0) g.drawImage(Hit,mousex-15,mousey-15,this); //绘制记分卡 g.setColor(Color.black); g.fillRect(0,0,60,Ysize); //显示分数 g.setColor(new Color(189,198,0)); g.drawString("" + score,10,20); g.drawString("" + level,10,40); g.drawString("" + bullets,10,60); g.drawString("" + 8*level,10,80); //绘制记分标签组件 g.setColor(Color.white); g.drawString("分数",10,10); g.drawString("级别",10,30); g.drawString("弹药",10,50); g.drawString("目标",10,70); } //创建线程 public void run() { int n; double velocityx=4.5; //x方向的正常速度 double velocityy=1.70;//y方向的正常速度 int i;//另一个计数器 while(true)//总是循环 if(!gameover)//游戏没有结束 for(n=0;n<350;n++)//最大关数为350 { if(fire>=0)//绘制fire图形 fire--;//并且让其数目递减 if(shot>=0)//绘制射击图形 shot--;//并且让其数目递减 if(n==1)//开始1个新关 { //设置某一关 for(i=0;i<birdmax;i++) { //首先将射击目标按照随机数分配到两边 if(Math.random()>0.5) birddirn[i]=1; else birddirn[i]=-1; //通过随机数改变射击目标的初始速度和运动方向 birdvx[i] = birddirn[i] * (velocityx + 2 * Math.random()); birdvy[i] = velocityy + 2 * Math.random(); //设置起始坐标 birdx[i] = (Xsize-60)/2 - birddirn[i]*((Xsize-60)/2+10)+60; birdy[i] = 70; //改变每个射击目标的启动时间 birdstart[i] = (int)(300.00*Math.random()); } //将子弹数设置为12 bullets = 12; //增加关数 level++; //打开关数显示开关 wait = true; } //检测射击目标是否在飞行 for(i=0;i<birdmax;i++) if(n>=birdstart[i])//是否开始 { //判断目标是否在飞行过程中没有被击中 if(birdy[i]>=Ysize) { birdstart[i]=500; birdy[i]=Ysize+20; } //计算重力对运动的影响 birdvy[i] = birdvy[i] - 0.1; //让射击目标沿着vx 和 vy 移动 birdx[i] = birdx[i] + birdvx[i]; birdy[i] = birdy[i] - birdvy[i]; } //关闭关数显示开关 if(n==10) wait=false; //检测是否过关了 if(n>=348 && score>=8*level) { //恢复计数器 n=0; //增加游戏难度的方法: //通过减少睡眠时间来提高游戏运行速度从而增加游戏难度 waittime=(int)(waittime * 0.92); } //如果到了这里,结束游戏 if(n>=349) { System.out.println("Game Over"); gameover=true; } //让线程进入睡眠 try { thisthread.sleep(waittime); } catch(Exception e) { System.out.println("Error on sleep"); } repaint(); } //如果游戏结束,让线程进入睡眠状态,以避免占用过多的cpu资源 else { try { thisthread.sleep(500); } catch(Exception e) { System.out.println("Error on sleep"); } repaint(); } } public void mouseClicked(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } //检测鼠标是否被按下,并且返回鼠标指针的坐标,以便进行处理 public void mousePressed(MouseEvent e) { //如果游戏结束,重新开始游戏 if(gameover) { gameover=false; startpositions(); } //否则向目标进行射击 else { //获取坐标值 int x = e.getX(); int y = e.getY(); //设置为图像所要显示的位置 mousex=x; mousey=y; //如果还有剩余的子弹 if(bullets>0) { //显示射击图形 fire = 2; //播放“开枪”声音文件 Shot_AC.play(); //减少子弹数目 bullets --; int n; //检测子弹是否打中目标 for(n=0;n<birdmax;n++) { if(checkhit(x,y,(int)birdx[n],(int)birdy[n],n)) { //如果打中目标,播放“打中”声音文件 Hit_AC.play(); shot = 4; score++;//将得分数增加1 } } } else//如果没有子弹,播放“空枪”声音文件 Empty_AC.play(); } repaint(); } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { }}//该类显示图片,并且在单击时返回初始化时所获得的字符串值class ImageCanvas extends Canvas implements MouseListener{ private Vector listeners = new Vector(); Image canvasImage; int Xsize; int Ysize; String Name; Cursor cursor; public ImageCanvas(Image image, int X, int Y, String name) { addMouseListener(this); canvasImage = image; Xsize = X; Ysize = Y; setSize(Xsize+5,Ysize); Name = name; } public void mousePressed(MouseEvent e) { } public void mouseDragged(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseClicked(MouseEvent e) { notifyListeners(); } public void mouseEntered(MouseEvent e) { setCursor(cursor.getPredefinedCursor(cursor.HAND_CURSOR)); } public void mouseExited(MouseEvent e) { cursor.getDefaultCursor(); } public void addActionListener(ActionListener listener) { if(!listeners.contains(listener)) listeners.addElement(listener); } public void removeActionListener(ActionListener listener) { listeners.removeElement(listener); } private void notifyListeners() { ActionListener listener; ActionEvent event = new ActionEvent(this, AWTEvent.RESERVED_ID_MAX+1, Name); Vector copyOfListeners = (Vector)(listeners.clone()); Enumeration enum = copyOfListeners.elements(); while (enum.hasMoreElements()) { listener = (ActionListener)enum.nextElement(); listener.actionPerformed(event); } } public void paint(Graphics g) { g.drawImage(canvasImage, 5, 0, Xsize, Ysize, this); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -