Java实现升级版布谷鸟闯关游戏的示例代码
短信预约 -IT技能 免费直播动态提醒
前言
《布谷鸟闯关-升级版》是一个基于java的布谷鸟闯关游戏,鼠标左键点击控制鸟的位置穿过管道间的缝隙,需要做碰撞检测,监听键盘事件,背景图片的切换,障碍物管道产生时y轴上需要随机位置。
主要设计
1.设计游戏界面,用swing实现
2.设计背景
3.设计移动墙
4.设计布谷鸟
5.设计障碍物
6.设计背景音乐和音效
7.新增用户账号注册登录功能
8.引用mysql数据库,管理用户账号密码和储存排行榜等信息
- 需要提前创建好数据库"game",字符集选“utf8mb4”
- 然后执行mysql表结构和初始化数据脚本
- 修改代码里的DBUtils的参数值
9.新增游戏商城模块
10.新增排行榜模块
功能截图
用户注册:
游戏欢迎界面:
游戏开始界面:
鼠标左键点击控制鸟的位置穿过管道间的缝隙
代码实现
游戏启动类
//开始界面
public class frame extends JFrame {
private JPanel pane;
public static frame frame;
public frame(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(240,150);
ImageIcon backGround = new ImageIcon("images/frame.png");
JLabel bkgImage = new JLabel(backGround);
bkgImage.setSize(240,150);
bkgImage.setLocation(0,0);
JPanel bkgPanel = (JPanel) this.getContentPane();
bkgPanel.setOpaque(false);
//注册按钮
JButton button_regist =new JButton("注册");
button_regist.setBounds(30,40, 60,30);
bkgPanel.add(button_regist);
button_regist.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
new frame_regist().setVisible(true);
}
});
//登录按钮
JButton button_log=new JButton("登录");
button_log.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
new frame_log(frame).setVisible(true);
}
});
button_log.setBounds(130,40, 60, 30);
bkgPanel.add(button_log);
this.getContentPane().add(bkgImage);
}
//弹出显示传入String的提示框
public static void frame_warning(String warning) {
JFrame frame=new JFrame();
JPanel pane=new JPanel();
frame.setBounds(540, 360, 300, 150);
frame.setContentPane(pane);
pane.setBorder(new EmptyBorder(5, 5, 5, 5));
pane.setLayout(null);
JLabel label_warning=new JLabel(warning);
label_warning.setBounds(50,20,150,50);
pane.add(label_warning);
JButton button_yes = new JButton("确定");
button_yes.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
frame.setVisible(false);
}
});
button_yes.setBounds(80, 80, 93, 23);
pane.add(button_yes);
frame.setVisible(true);
}
public static void main(String[] args){
frame =new frame();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
核心类
import static java.lang.Thread.sleep;
public class GameplayingFrame extends JFrame{
private static final long serialVersionUID = 1L;
user_inf user;
MainFrame mainframe;
List<rank_information> rfs;
Graphics g=this.getGraphics();
GameplayingFrame(user_inf user,List<rank_information> rfs,MainFrame mainframe)
{
this.mainframe=mainframe;
this.rfs=rfs;
this.user=user;
this.setTitle("Fly Bird");
this.setSize(Constant.Frame_Width,Constant.Frame_Height);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setVisible(true);
Scene stage = new Scene(user);
Graphics g = this.getGraphics();
ImageIcon backGround = new ImageIcon("images/bg_day.png");
JLabel bkgImage = new JLabel(backGround);
bkgImage.setSize(288,512);
bkgImage.setLocation(0,0);
JPanel bkgPanel = (JPanel) this.getContentPane();
bkgPanel.setOpaque(false);
this.getContentPane().add(bkgImage);
//为界面加入鼠标的响应事件
this.addMouseListener(new MouseListener(){
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseClicked(MouseEvent e) {
stage.speed_y=-175;
}
});
JLabel scoreText = new JLabel();
Font font = new Font(Font.SERIF, Font.ITALIC, 30);
scoreText.setFont(font);
scoreText.setText(String.valueOf(0));
this.setLayout(null);
scoreText.setBounds(129,0,30,30);
this.add(scoreText);
//添加一个线程对象,用于重复绘图,来节约主线程的资源,使游戏运行更加流畅
new Thread(new playingThread(stage,g,this,user,rfs,mainframe)).start();
}
}
class Scene{
//后缀_x/_y表示横/纵坐标,窗口左上角为原点
public final int bird_x = 88;
//重力加速度
public final int G = 300;
public double bird_y;
public double birdRadius;
//速度——正值为向下,负值为向上
public int speed_x;
public int speed_y;
private Ground land= new Ground(GameUtil.toBufferedImage(GameUtil.getImage("ioo/land.png")));
BufferedImage back= GameUtil.toBufferedImage(GameUtil.getImage("ioo/bg_day.png")) ;
Barrier barrier;
Barrier barrier1;
Ground ground;
FlyingBird bird=null;
Scene(user_inf user){
bird_y = 200;
bird=new FlyingBird(bird_x,bird_y,user);
birdRadius = 22;
speed_x = 3;
speed_y = 0;
ground = new Ground(GameUtil.toBufferedImage(GameUtil.getImage("ioo/land.png")));
barrier= new Barrier(GameUtil.toBufferedImage(GameUtil.getImage("ioo/pipe_down1.png")));
barrier1= new Barrier(GameUtil.toBufferedImage(GameUtil.getImage("ioo/pipe_down.png")));
}
//返回true是游戏已经结束,返回false表示游戏继续进行
boolean ifGameOver(){
//碰到地面
if(bird_y + birdRadius > 512 - ground.getHeight()){
System.out.println("hit ground");
return true;
}
//碰到顶
if(bird_y - birdRadius < 0){
System.out.println("hit sky");
return true;
}
//未过左边界时
if(bird_x + birdRadius <= barrier.location_x){
return false;
}
//接近左边界时
if(bird_x + birdRadius > barrier.location_x && bird_x < barrier.location_x){
if(bird_y < barrier.topHeight || bird_y + birdRadius*0.7 > 512 - barrier.bottomHeight){
System.out.println("hit left edge");
return true;
}
return false;
}
//通过管道时
if(bird_x >= barrier.location_x && bird_x < barrier.location_x + barrier.width){
boolean y1 = bird_y + birdRadius > 512 - barrier.bottomHeight;
boolean y2 = bird_y <barrier.topHeight;
if(y1 || y2){
System.out.println("hit inside");
}
return y1 || y2;
}
//已通过管道
if(bird_x >= barrier.location_x + barrier.width){
return false;
}
return false;
}
//ifGameOver=false时才执行
boolean ifGetScore(){
return bird_x + birdRadius > barrier.location_x;
}
//第二次之后的绘图
public void drawItems(Graphics g){
//鸟
bird.draw(g);
//下障碍物
g.drawImage(barrier.img, barrier.location_x, 512 - barrier.bottomHeight,33,barrier.bottomHeight, null);
//上障碍物
g.drawImage(barrier1.img,barrier.location_x, 0,33,barrier.topHeight, null);
//地面
g.drawImage(ground.getBufferedImage(),0,512-30, null);
ground.checkGround();
barrier.checkBarrier();
}
//更新各个物体的位置(每秒30次)
public void itemMove() {
//计算鸟的速度
speed_y += G*0.033;
//鸟最大的向下速度为220
if(speed_y > 220){
speed_y = 220;
}
//计算鸟的纵坐标
bird_y += speed_y*0.033;
bird.y=bird_y;
//计算障碍物和地面的横坐标
barrier.location_x -= speed_x;
ground.setX(ground.getX()-speed_x);
}
//变速方法,根据分数调整速度
public void shift(int score){
if(score < 1) {
speed_x = 3;
}
else if (score < 100){
speed_x = 4;
}
else if (score < 200){
speed_x = 5;
}
else if (score < 300){
speed_x = 6;
}
else if (score < 400){
speed_x = 7;
}
else if (score < 500){
speed_x = 8;
}
else speed_x = 9;
}
}
线程类用于重复绘图
public class playingThread implements Runnable {
Scene stage;
private Image iBuffer;
private Graphics gBuffer;
List<rank_information> rfs;
user_inf user;
MainFrame mainframe;
Graphics g ;
GameplayingFrame playingframe ;
public static boolean flag = true;//控制计分板的变量
public int score = 0;//分数
playingThread(Scene stage,Graphics g,GameplayingFrame playingframe ,user_inf user,List<rank_information> rfs,MainFrame mainframe)
{
this.mainframe=mainframe;
this.rfs=rfs;
this.user=user;
this.stage=stage;
this.g=g;
this.playingframe=playingframe;
}
@Override
public void run() {
while (!stage.ifGameOver()){
stage.drawItems(g);//绘画
stage.itemMove();//物体移动
//33ms刷新一次
try {
sleep(33);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(stage.ifGetScore()){
score++;
}
stage.shift(score);
//playingframe.update(g);
//清除上一次绘画结果
//双缓冲方法清除上一次绘画结果
if (iBuffer == null){
iBuffer = playingframe.createImage(playingframe.getSize().width,playingframe.getSize().height);
gBuffer = iBuffer.getGraphics();
}
playingframe.paint(gBuffer);
g.drawImage(iBuffer,0,0,null);
// stage.drawItems(g);//再绘画
}
user.setCoin(user.getCoin()+score);
new user_dao().update(user);
playingframe.setVisible(false);
rank_information rf=new rank_information();
rf.setScore(score);
rf.setName(user.getUser_name());
rfs.add(rf);
new rank_dao().update_rank(rfs);
new resultFrame(score,user,rfs,mainframe);
System.out.println("game over");
}
}
总结
通过此次的《布谷鸟闯关-升级版》实现,让我对JAVA的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。
java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。
以上就是Java实现升级版布谷鸟闯关游戏的示例代码的详细内容,更多关于Java布谷鸟闯关游戏的资料请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341