游戏规则:抓取石块右键可以爆破、抓取金块右键快速抓取。

完成任务:窗体绘制、钩爪往返旋转、物体批量绘制、双缓存解决闪动问题、点和矩形碰撞检测、多种类物体随机生成、物体堆叠检测、多种类抓取速度判定、积分设置、关卡设置、重新开始、单关卡倒计时、金块的快速拉取、石块爆破、商店购物。

游戏大致界面:

一、窗口绘制

创建GameWin类

import javax.swing.*;public class GameWin extends JFrame {void launch(){this.setVisible(true);this.setSize(500,500);this.setLocationRelativeTo(null);//屏幕中央出现窗口this.setTitle("黄金矿工");setDefaultCloseOperation(EXIT_ON_CLOSE);}public static void main(String[] args) {GameWin gameWin = new GameWin();gameWin.launch();}
}

二、绘制图片

需要几个图片素材,私信。

新建imgs文件夹存放图片。

创建Bg类

背景由多个图片组成,所以创建一个背景类。

获取图片,用绘图技术将图片画在界面上;

注意根据图片大小计算好xy位置。

import java.awt.*;public class Bg {Image bg = Toolkit.getDefaultToolkit().getImage("imgs/bg.jpg");Image bg1 = Toolkit.getDefaultToolkit().getImage("imgs/bg1.jpg");Image peo = Toolkit.getDefaultToolkit().getImage("imgs/peo.png");void paintSelf(Graphics g){g.drawImage(bg1,0,0,null);g.drawImage(bg,0,282,null);g.drawImage(peo,350,133,null);}
}

GameWin类增加

    Bg bg = new Bg();
    public void paint(Graphics g){bg.paintSelf(g);}

查看图片大小,修改界面大小

        this.setSize(814,1000);

三、红线绘制

创建Line类

import java.awt.*;public class Line {int x = 400;//起点在人物坐标处int y = 282;//起点坐标int endx = 500;int endy = 500;//重点坐标void paintSelf(Graphics g){g.setColor(Color.red);g.drawLine(x,y,endx,endy);}
}

GameWin类增加

    Line line = new Line();

paint方法增加

line.paintSelf(g);

四、红线摇摆

实现原理:

如何求出endx和endy,找到endx、endy、x、y之间的关系。

计算机中,x轴向右为正方向,y轴向下为正方向;

角度起点为x轴正方向,顺时针旋转90°到达y轴,也就是旋转Π/2即1.57;

可利用此实现摇摆效果,如1小于Π/2,则在y轴右方,2大于Π/2,则在y轴左方。

如果要想实现在0-Π之间摇摆,可以设n∈(0,1)代替cosα中的α,则操作n可实现角度的变化,n*Π∈(0,Π)。

Line类增加/修改

double length = 100;//线长double n = 0;//线摇摆角度void paintSelf(Graphics g){n+=0.005;endx = (int)(x+length*Math.cos(n*Math.PI));endy = (int)(y+length*Math.sin(n*Math.PI));g.setColor(Color.red);g.drawLine(x,y,endx,endy);}

GameWin类增加

需要每隔0.01s绘制一次画面,达到摇摆效果。

 while (true){repaint();try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}

目前,红线是摇摆一整圈,原因是n一直是+0.005,需要设置摇摆的范围,在0-Π之间摇摆。

五、红线摇摆范围

设置一个dir表示方向即正负,通过判断,改变符号。

Line类增加

int dir = 1;//方向

paintSelf方法增加/修改

 if(n<0){dir = 1;}else if (n>1){dir = -1;}n+=0.005*dir;

六、红线抓取

Line类增加

state表示状态,通过鼠标点击修改state数值,下面根据state数值实现红线的不同状态。

    int state;//状态0为摇摆,1为抓取,2为收回

由于后面多次使用方法的四行代码,所以定义一个方法,后面直接调用方法。

  void lines(Graphics g){endx = (int)(x+length*Math.cos(n*Math.PI));endy = (int)(y+length*Math.sin(n*Math.PI));g.setColor(Color.red);g.drawLine(x,y,endx,endy);}

重新修改paintSelf方法,通过switch判断state数值,使红线做出不同动作。

 void paintSelf(Graphics g){switch (state){case 0:if(n<0){dir = 1;}else if (n>1){dir = -1;}n+=0.005*dir;lines(g);break;case 1:if(length<500){//限制抓取长度length+=10;lines(g);}else{state = 2;}//如果超出长度则收回break;case 2:if(length>100){//限制收回长度length-=10;lines(g);}else{state = 0;}break;default:}}

GameWin类增加

鼠标点击事件,通过getButton()获取点击的键值修改line类的state。

        addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {super.mouseClicked(e);if(e.getButton() == 1){//鼠标左键1,滚轮2,右键3line.state = 1;}}});

七、创建金块

创建Object类

金块和岩石都有坐标和宽高以及绘制,所以需要定义一个类用来继承。

import java.awt.*;public class Object {int x;int y;int width;int height;Image img;void paintSelf(Graphics g){g.drawImage(img,x,y,null);}
}

创建金块类Gold

import java.awt.*;public class Gold extends Object{Gold(){this.x = 300;this.y = 500;this.width = 78;this.height = 88;this.img = Toolkit.getDefaultToolkit().getImage("imgs/gold0.png");}
}

GameWin类增加

Gold gold = new Gold();

paint方法绘制

gold.paintSelf(g);

八、双缓存技术解决闪动

目前,窗口图片存在闪动问题,原因是像金块这样的图片在岩土这样的背景图片上层,先绘制背景图片再绘制金块图片,再绘制背景图片,再绘制金块......所以产生了图片闪动问题。

可以先将背景图片和金块在绘制之前组织好再一起放置在窗口之上。

GameWin类增加

Image offScreenImage;

paint方法增加

offScreenImage = this.createImage(814,1000);//创建画布
Graphics gImage = offScreenImage.getGraphics();//创建画笔bg.paintSelf(gImage);
line.paintSelf(gImage);
gold.paintSelf(gImage);g.drawImage(offScreenImage,0,0,null);//将图片一起绘制

九、抓取判定

Line类增加

   GameWin frame;Line(GameWin frame){this.frame = frame;}void logic(){//碰撞检测,检测红线是否在金块范围内if(endx > this.frame.gold.x && endx <this.frame.gold.x+this.frame.gold.width&& endy>this.frame.gold.y&&endy<this.frame.gold.y+this.frame.gold.height){}}

paintSelf方法增加

logic();

GameWin修改

需要传入主类,才能调用主类的方法

Line line = new Line(this);

十、抓取返回

Line类增加/修改

如果红线在金块范围内则改变state状态为3,表示抓取返回。

   void logic(){//碰撞检测,检测红线是否在金块范围内if(endx > this.frame.gold.x && endx <this.frame.gold.x+this.frame.gold.width&& endy>this.frame.gold.y&&endy<this.frame.gold.y+this.frame.gold.height){state = 3;}}

switch增加判断state为3的情况;

金块的x坐标于红线的x坐标的关系为endx-金块长度/2;

如果抓取金块到达位置则将金块移出屏幕外。

 case 3:if(length>100){length-=10;lines(g);this.frame.gold.x = endx - 39;this.frame.gold.y = endy;}else{this.frame.gold.x = -150;//移除到屏幕外this.frame.gold.y = -150;state = 0;}break;

十一、多个金块

使用集合生成多个金块

GameWin类增加

定义集合存储金块

    List<Object> objectList = new ArrayList<Object>();//存储多个金块

循环往集合添加金块

    {for (int i = 0; i < 3; i++) {objectList.add(new Gold());}}

paint方法需要循环绘制多个金块

        for(Object obj:objectList){obj.paintSelf(gImage);}

Line类修改

修改前面使用一个金块的方法

 for(Object obj:this.frame.objectList){if(endx > obj.x && endx <obj.x+obj.width&& endy>obj.y&&endy<obj.y+obj.height){state = 3;}}
 for(Object obj:this.frame.objectList){obj.x = endx - 39;obj.y = endy;if(length<=100){obj.x = -150;//移除到屏幕外obj.y = -150;state = 0;}}

Gold类修改

修改金块生成位置随机

        this.x = (int)(Math.random()*750);//防止生成在窗体this.y = (int)(Math.random()*550+300);//防止生成在天上

十二、抓取金块BUG

BUG原因:抓取金块后,修改了所有金块的位置。

BUG解决:设置变量flag标记金块是否能移动

Object类增加

    boolean flag;//标记是否移动

Glod类增加

this.flag = false;

Line类增加

logic方法if增加

obj.flag = true;

switch case 3增加

                    for(Object obj:this.frame.objectList){if(obj.flag){//判断是否能够移动obj.x = endx - 39;obj.y = endy;if(length<=100){obj.x = -150;//移除到屏幕外obj.y = -150;obj.flag = false;state = 0;}}}

至此已完成一半内容,下篇文章继续。

【JAVA】-- 黄金矿工小游戏(一)(实现思路+每步代码)相关推荐

  1. Java黄金矿工小游戏,适合新手入门练手项目

    Java初学者的小伙伴们,相信大家肯定缺少很多的练手项目吧!今天就给大家推荐一款特别好上手的一个Java小游戏--黄金矿工. 大家听到这个名字的时候,童年的回忆肯定一下子,涌上心头,那如果让大家制作一 ...

  2. Java黄金矿工小游戏,适合初学者练手项目_java游戏_java项目

    黄金矿工小游戏是一款非常经典的休闲类挖宝游戏!相信绝大多数人小时候应该都玩过.但是你会玩游戏,你会做游戏吗(狗头)?对!你没猜错!我今天就是来给大家说怎么用Java做游戏的,希望看完之后你也会做哦~ ...

  3. Java黄金矿工小游戏,只需两小时完成,就是这么简单

    黄金矿工小游戏是一款非常经典的休闲类挖宝游戏!相信绝大多数人小时候应该都玩过.但是你会玩游戏,你会做游戏吗?哈哈 没错我今天就是来给大家说怎么用Java做游戏的(是不是很厉害),希望看完之后你也会做哦 ...

  4. 4399曾经最火的黄金矿工小游戏,用Java语言2小时学会

    你玩过4399曾经最火的黄金矿工小游戏吗,黄金矿工小游戏是一款休闲娱乐的一个挖宝游戏,在游戏中地下会有许多的宝藏,你得想办法把它们都挖出来,作为矿工的你,对你来说是轻车熟路的,能不能挖到宝,看你抓取的 ...

  5. 【黄金矿工小游戏】童年的记忆

    有很多小伙伴已经步入java的正式学习当中了!正缺一些小型项目来练练手,但是不知道找些什么项目或者是很多项目你都不感兴趣! 正好我发现了一个B站上的小项目可以分享给大家----黄金矿工小游戏 一听这个 ...

  6. 【拾童年回忆】Java开发 黄金矿工小游戏

    有比玩黄金矿工更无聊的事情吗?还真有,那就是自己做一个黄金矿工游戏,让其他人玩![红红火火恍恍惚惚] N年前有一阵子我痴迷于玩<黄金矿工>,不久前陪着侄子侄女玩的我也痴迷于玩<黄金矿 ...

  7. Java写一个黄金矿工小游戏

    写这个小游戏的初衷 同学一起互助学习 前两天和一个计科的高中同学交流想法,有讲到合理规划时间,然后用分出来的时间去网上找资源学一些项目,这不,就有了这个小游戏了 和同学交流的时候,对方说每周花一个小时 ...

  8. 教你用matlab制作一款黄金矿工小游戏

    效果 步骤 0 图片准备 本文所使用图片在这: 网盘链接:https://pan.baidu.com/s/1CWL1R-rbTMFEy_G_P2JfgQ 提取码:kl17 1 背景构建 functio ...

  9. Java练手小游戏---黄金矿工

    你玩过4399曾经最火的黄金矿工小游戏吗,黄金矿工小游戏是一款休闲娱乐的一个挖宝游戏,在游戏中地下会有许多的宝藏,你得想办法把它们都挖出来,作为矿工的你,对你来说是轻车熟路的,能不能挖到宝,看你抓取的 ...

  10. 重回童年4399| 【黄金矿工】游戏制作+解析

    黄金矿工 前言 黄金矿工小游戏,想必只要是能刷到这篇博客的,无一例外都玩过这款游戏.4399的经典之作 然我们先看一下效果图 这个游戏的逻辑也非常的简单, 如果你在规定的时间内尽可能多地收集昂贵的金块 ...

最新文章

  1. 美妙的Python又来了
  2. 分享Kali Linux 2016.2第50周镜像文件
  3. linux服务器dns配置丢失处理
  4. mysql 创建定时任务
  5. 数据结构与算法 / 散列表(HashTable)
  6. 帆软 JAVA扩展_java报表开发工具FineReport教程之报表设计:单元格扩展
  7. 在武大吉奥期间的任务
  8. java 代码块同步,Java 同步代码块
  9. 如何估算太坊交易的gas消耗量
  10. 使用maven构建多模块项目
  11. Gstreamer入门之Helloworld(一)
  12. Mac电脑不能识别文本和命令的解决方法
  13. 阶段3 2.Spring_06.Spring的新注解_6 Qualifier注解的另一种用法
  14. 【游戏开发】游戏开发书籍汇总
  15. 前后端分离的时代,团队间的完美协作
  16. 在计算机硬件系统中 cache是,CPU中Cache是什么
  17. 千锋云计算毕业设计论文:论文设计任务书
  18. Java读取ID卡卡号源码
  19. swift声明属性为某个类型同时遵循某协议
  20. Tesla Model S的设计失误

热门文章

  1. 服务器被攻击网站打不开解决方案
  2. CollabNet Subversion Edge 版本库访问规则 svn
  3. 软考高级-系统架构设计师经验分享
  4. 目标检测单阶段、双阶段检测框部分学习总结
  5. 陈莉君: Linux内核的那些书
  6. sftp服务器下载文件至本地电脑
  7. 火线零线接反等问题的分析(电工)
  8. 华为云免费SSL域名证书申请_亲测成功
  9. DirectX加速不可用、已禁用的解决方法(转载)
  10. 群晖NAS用户和用户组权限讲解