java小游戏大鱼吃小鱼入门(音乐添加+鱼头转向+背景移动+背景泡泡效果)

上一篇讲了如何写基础简易的大鱼吃小鱼,接下来需要一些添加使游戏界面效果更好。

1.添加音乐:
需要添加背景音乐和吃鱼的效果音效等等音乐,将播放这些音乐的方法写在一个类中,适时调用会很方便,即使只想添加背景音乐也可以写在类中,方便以后直接在类种添加其他音乐的播放。
此处举例只加背景音乐的代码:

创建音乐类:

public class Music {

	java.net.URL file1 = getClass().getResource("贝多芬 - 第五号钢琴协奏曲.wav");
    AudioClip sound1 = java.applet.Applet.newAudioClip(file1); 
	 
	 public void playBgMusic(){
		 sound1.play();
	 }
	 
}

在界面类中/或主函数种创建音乐对象并调用播放方法:

Music music = new Music();
music.playBgMusic();

(记得把音乐文件放入代码的包中,直接赋值粘贴进代码包即可)

2.鱼头转向:
让鼠标所控制的主角鱼的方向随鼠标移动而变,鼠标向右移动,鱼朝向右边,鼠标向左移动,鱼朝向左边。
首先怎样在画鱼时产生转向效果:不需要找ava中方法旋转鱼的图片,只需要准备两张不停方向的主角鱼图片来画鱼就可以了。
怎样根据鼠标移动判断要用什么图片画主角鱼呢:需要判断这次鼠标移动所到的位置相比上一次是向左了还是向右了,这就需要两个参数,一个记录前一次的位置,一个记录现在的位置,来进行比较。(只需要记录x坐标即可,比较的是水平方向)
此段代码写在鼠标监听器中
将上一篇的鼠标监听类的代码稍稍修改,代码如下:

public class mouselisener extends MouseAdapter{

	static float x1,x2;//不断记录鼠标所在的横坐标
	Graphics g;
	Frame frame;
	Fish myfish;
	ArrayList<Fish> list;
	String getstr;
	static int flag=1;//用来切换x1,x2的记录顺序

	public mouselisener(Graphics g, Frame mf, ArrayList<Fish> list) {
		this.g = g;
		this.frame = mf;
		this.list = list;
		this.myfish = list.get(0);
	}

	public void mouseClicked(MouseEvent e) {
	}

	public void mouseDragged(MouseEvent e) {
		//myfish.x = e.getX();
		//myfish.y = e.getY();
	}

	public void mouseEntered(MouseEvent e) {
	}

	public void mouseExited(MouseEvent e) {
	}

	public void mouseMoved(MouseEvent e) {
		if(flag==1){
			x1=e.getX();
			myfish.x=e.getX();
			myfish.y=e.getY();
		    flag=2;
		}
		else if(flag==2){
			x2=e.getX();
			myfish.x=e.getX();
			myfish.y=e.getY();
			flag=1;
			x1=x2;
		}
	}

	public void mousePressed(MouseEvent e) {
	}

	public void mouseReleased(MouseEvent e) {
	}

	public void mouseWheelMoved(MouseWheelEvent e) {
	}

	public void actionPerformed(ActionEvent e) {}

}

并在画鱼时根据以上x坐标的判断选用不同方向的图片画鱼,将上一篇中Fish类中的draw方法修改,代码如下:

public  void draw(Graphics g,ArrayList<Fish> list) {
		if (this.size > 0) {
			// 不是我的鱼
			if (this != list.get(0)) {
				//超出画面就删掉这个鱼
				if(this.x+this.size>=frame.getWidth())list.remove(this);
				else if(this.y+this.size>=frame.getHeight())list.remove(this);
				else if (this.size <= 60)
				g.drawImage(fishshape1, x, y, size-10, size-10, null);
				else if (this.size > 60 && this.size <= 120)
				g.drawImage(fishshape2, x, y, size+20, size+20, null);
				else if (this.size > 120)
				g.drawImage(fishshape4, x, y, size, size, null);
				System.out.println(this.size);
			}
			//是我的鱼
			else if (this == list.get(0)){
				int location=frame.getWidth()/2;
				System.out.println("MY FISH: "+mouselisener.x1+"   "+mouselisener.x2);
				if(mouselisener.x2<=location&&mouselisener.x1>=location){
					g.drawImage(myfishshape_to_right, x, y, size, size, null);
				}
				else if(mouselisener.x2>=location&&mouselisener.x1<=location){
					g.drawImage(myfishshape, x, y, size, size, null);
				}
				else if(mouselisener.x2<=location&&mouselisener.x1<=location){
					g.drawImage(myfishshape_to_right, x, y, size, size, null);
				}
				else if(mouselisener.x2>=location&&mouselisener.x1>=location){
					g.drawImage(myfishshape, x, y, size, size, null);
				}
				//g.drawImage(myfishshape, x, y, size, size, null);
			}
		} 
		else if (this.size <= 0&&this!=list.get(0))
		{
			list.remove(this);
		}
	}

别忘了在准备主角鱼图片时准备两个反方向的图片,可以通过在线翻转图片https://www.asqql.com/giffanzuan/这个网站来进行图片翻转。

3.背景图片移动:
让图片上下方向或左右方向移动,看起来像是鱼在真实的海底游动一样,只需要从上到下或从左到右画背景图片即可
将上一篇中的Threadfish类中run中画次画布的代码稍稍修改,代码如下:

int index=0;
g2.drawImage(fishbackground,0,0,frame.getWidth(), frame.getHeight(),0+index,0,200+index,400,null);
			index+=1;
			if(index+400>=800)index=0;

用index来记录画到哪里了,一旦画到图片尽头就又从头开始,由于画次画布写在run中,由线程控制每隔很短时间就执行一次,所以看起来背景图片就是连续移动的了。用到方法g.drawImage方法,此方法由很多不同个数参数的用法,如前面画鱼时的使用,详情可查询API文档

4.添加泡泡:
泡泡和鱼一样,都可以用队列来表现,泡泡比鱼更简单,“泡泡不吃泡泡”,只需要实现产生泡泡队列,移动泡泡,画出泡泡即可,模仿Fish和Fishlist类来写Paopao和Paopaolist

public class PaoPao {

	int x,y,speedx,speedy,size;
	Framefish frame;
	
	public PaoPao(Framefish frame,int x,int y,int speedx,int speedy,int size){
		this.frame=frame;
		this.x=x;
		this.y=y;
		this.speedx=speedx;
		this.speedy=speedy;
		this.size=size;
	}
	
	public void move(ArrayList<PaoPao> paopaolist){
			y = y - speedy;
			x = x + speedx;
	}
	
	public void drawpp(Graphics g){
	  
		Toolkit tool = Toolkit.getDefaultToolkit();
		Image paopao = tool.getImage(Fish.class.getResource("fish泡泡.png"));
		if(y>=0&&y<=frame.getHeight())
		g.drawImage(paopao,x,y,size,size,null);
	}
	
}

public class PaoPaoList extends Thread{

	Random random;
	Framefish frame;
	int x,y,speedx,speedy,size;
	ArrayList<PaoPao> paopaolist;
	
	public PaoPaoList(Framefish frame,ArrayList<PaoPao> paopaolist){
		
		this.frame=frame;
		this.paopaolist=paopaolist;
		random = new Random();
	}
	
	public void run(){
		while(true){
			x=random.nextInt(frame.getWidth())+20;
			y=frame.getHeight();
			speedx=0;
			speedy=random.nextInt(30)+10;
			size=random.nextInt(70)+30;
			PaoPao paopao = new PaoPao(frame,x,y,speedx,speedy,size);
			paopaolist.add(paopao);
			
			try {
				Thread.sleep(2000);//休眠3000产生一个气泡
			} catch (InterruptedException e) {
			}
			
		}
	}
}

并把泡泡队列加在界面中和Threadfish的run中,实现在画鱼时,同时也实现画泡泡,在run中添加下面代码即可:

for(int i=0;i<paopaolist.size();i++){
				PaoPao pp=paopaolist.get(i);
				pp.drawpp(g2);
				
				pp.move(paopaolist);
			}
			

泡泡产生的速度,和画的速度都可以设置通过Thread.sleep(休眠时间)来控制
想要添加水母效果等等和鱼,泡泡也是类似的

这样看起来游戏就更完善了一些,可能后面还会继续出一篇关于添加游戏关卡的文章。

如有错误或不完善的地方,欢迎指出

猜你喜欢

转载自blog.csdn.net/qq_40315080/article/details/82828637