【mie haha的博客】转载请注明出处(万分感谢!):
https://blog.csdn.net/qq_40315080/article/details/82828637
上一篇讲了如何写基础简易的大鱼吃小鱼,接下来需要一些添加使游戏界面效果更好。
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 list;
String getstr;
static int flag=1;//用来切换x1,x2的记录顺序
public mouselisener(Graphics g, Frame mf, ArrayList 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 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 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 paopaolist;
public PaoPaoList(Framefish frame,ArrayList 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
泡泡产生的速度,和画的速度都可以设置通过Thread.sleep(休眠时间)来控制
想要添加水母效果等等和鱼,泡泡也是类似的
这样看起来游戏就更完善了一些,可能后面还会继续出一篇关于添加游戏关卡的文章。
如有错误或不完善的地方,欢迎指出