学完java制作的一个恐龙跑酷小游戏

小恐龙快跑

该项目是书本上的一个例子,然后自己完成了编程实现。下面分享一些创作的难度和相关技术点。
项目是用java的一些基本操作组成,比如线程的概念,实现动画效果,
学会使用AWT绘制游戏画面,Rectangle类实现碰撞检测,学会使用javax.sound包实现播放声音.

1.线程
项目中线程是关键的一个部分,因为在实现恐龙奔跑的过程中其实就是不断的重复和重新绘制图片,那么这个过程的控制必须要用到线程的概念,通过线程才能更好的去控制相关的过程。比如说,实现恐龙奔跑的样子,实际上就是三张恐龙图片不断的绘制,视觉上达到了奔跑的效果(做的比较简陋,如果有绘图基础的同学,可以和我一起完善一下界面效果)。在FreshThead类下就是游戏中的刷新帧线程类,该类继承与Thread线程类,并且在线程的主方法中无限循环,每过一定时间重新绘制游戏面板,也就是repaint()方法。每次重绘前会先执行用户输入的指令,这样每次绘制的画面就不一样,在极短的时间内切换画面就实现了动画的效果。

2.AWT绘图
游戏主界面就是游戏的核心,先是创建了一个JFrame的一个框,然后在上面绘制了背景图片,背景图片其实就是一张图片轮流播放,定义两张一样的照片,然后定义起始位置,每一次左移一点点,然后再在后面接上一张图片,然后检测当前一张图片到尾了自动清除,然后将它绘制到紧接着他的后面。比如面板宽度800,那么第一张图片起始位置为0,第二张图片起始位置是800,每一次让它左移5,就是减5,这样当第一张图片坐标是-800的时候,整个图片就已经离开面板了,然后重新赋值,让它的坐标为800,这样便实现了背景的滚动效果。
还有就是恐龙的类和障碍的类,这是利用了图片叠加的原理,先绘制背景图片,然后绘制恐龙和障碍,那么这样就实现了游戏的界面。运动的效果其实就是x坐标的不断变化,恐龙的跳跃就是y坐标的不断变化。

public BackgroundImage() {
    
    
    	  try {
    
    
			image1=ImageIO.read(new File("image/99.jpg"));
			image2=ImageIO.read(new File("image/99.jpg"));
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
    	  image=new BufferedImage(800, 400,BufferedImage.TYPE_INT_RGB);
    	  g2=image.createGraphics();                            //获取主图片绘图对象
    	  x1=0;
    	  x2=800;
    	  g2.drawImage(image1,x1,0,null);
      }
      public void roll() {
    
    
    	  x1-=SPEED;                                     //第一幅图片左移
    	  x2-=SPEED;                                     //第二幅图片左移
    	  if(x1<=-800) {
    
    
    		  x1=800;
    	  }
    	  if(x2<=-800) {
    
    
    		  x2=800;
    	  }
    	  g2.drawImage(image1, x1, 0,null);
    	  g2.drawImage(image2, x2, 0,null);
      }

3.Rectangle的碰撞检测

if(o.getBounds().intersects(golden.getFootBounds())||o.getBounds().intersects(golden.getHeadBounds())) {
    
    
    				 Sound.hit();                              
    				 gameOver();
    			 }

o是障碍的边框,golden是恐龙的边框,如果碰撞,那么播放hit声音,然后执行gameover;游戏逻辑便建立起来了。

4.javax.sound包实现播放声音
这对我来说应该是最复杂的一部分了,而且因为java格式限制,只能用几类格式的音乐,比如wav和MP3等,而且音乐的裁剪也很复杂,背景的素材也很难找(有相关资料的同学可以找我一起完善这个项目)。
原理就是

byte[] auBuffer=new byte[1024*128];                  //创建128k缓冲区
		do {
    
    
			AudioInputStream audioinputstream=null;          //创建音频输入流对象
			SourceDataLine auline=null;                      //混频器源数据行
			try {
    
    
				//从音乐文件中获取音频输入流
				audioinputstream=AudioSystem.getAudioInputStream(soundFile);
				AudioFormat format=audioinputstream.getFormat();       //获取音频格式
				//按照源数据行类型和指定音频格式创建数据行对象
				DataLine.Info info=new DataLine.Info(SourceDataLine.class, format);
				//利用音频系统类获得与指定line.info对象中匹配的行对象
				auline=(SourceDataLine)AudioSystem.getLine(info);
				auline.open(format);                             //按照指定格式打开源数据行
				auline.start();                                  //源数据行开启读写活动
				int byteCount=0;                                 //记录音频输入流读出的字节数 
				while(byteCount!=-1) {
    
                               //如果音频输入流中读取的字节数不为-1
					byteCount=audioinputstream.read(auBuffer, 0, auBuffer.length);//从音频数据流中读取128k的数据
					if(byteCount>=0) {
    
                                                //如果读出有效数据
						auline.write(auBuffer, 0, byteCount);                     //将有效数据写入数据行中
					}
				}
			} catch (Exception e) {
    
    
			e.printStackTrace();
			}finally {
    
    
				try {
    
    
					auline.flush();
				} catch (Exception e2) {
    
    
					System.out.println("666");
				}
				auline.drain();
				auline.close();
			}
		} while (circulate);                //根据循环标志判断是否循环播放
		

然后通过判断等来播放相应的音乐!

5.游戏运行相关截图
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
上传不了文件夹,需要文件的或者有兴趣的朋友可以私信我。

本人在校大学生,菜鸟学习中,欢迎大佬指导,欢迎大家点赞关注!

猜你喜欢

转载自blog.csdn.net/m0_48781656/article/details/108928754#comments_20968974