java小恐龙游戏_【分享】 chrome恐龙小游戏 java

本文介绍了一个使用Java开发的小游戏项目,包括游戏逻辑、图形界面及键盘事件处理等核心内容。通过继承JPanel并重写paint方法实现游戏画面更新,利用多线程技术控制游戏帧率,实现了简单的碰撞检测和游戏得分等功能。

本帖最后由 leiyanfu 于 2019-5-3 14:27 编辑

最近学习java也有一段时间了 前些天打开网站老是出出现小恐龙所以就萌生了想模仿着写一个 无奈一些东西我还没学到 比如java的窗口 键盘事件的监听啊 什么的

所以就去网上找了一下  哎 还真有 果断下载 idea打开阅读一帆 尝试着自己写一写还不错  我就把源码分享给大家

55fd2b2273b5a8b4531f72773c469d6e.gif

1.jpg (24.45 KB, 下载次数: 3)

2019-5-3 14:24 上传

55fd2b2273b5a8b4531f72773c469d6e.gif

QQ截图20190503142359.jpg (21.84 KB, 下载次数: 2)

2019-5-3 14:24 上传

[Java] 纯文本查看 复制代码package tn;

import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;

import javax.imageio.ImageIO;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.File;

public class BackgroundImage {

BufferedImage image;//主图片

BufferedImage image1, image2,image_over,image_yun;//轮播图片

Graphics2D g2;//美工

int x1, x2;//两个图片的坐标

int x_yun=800,y_yun=50;

int x_over=240,y_over=50;

static final int SPEED = 3;//速度

public BackgroundImage() {

try {

image1 = ImageIO.read(new File("image/map.png"));

image2 = ImageIO.read(new File("image/map1.png"));

image_over = ImageIO.read(new File("image/game_over.png"));

image_yun = ImageIO.read(new File("image/yun.png"));

} catch (Exception e) {

e.printStackTrace();

}

image = new BufferedImage(734, 286, BufferedImage.TYPE_INT_BGR);

g2 = image.createGraphics();

x1 = 0;

x2 = 734;

g2.drawImage(image1, x1, 0, null);

g2.drawImage(image2, x2, 0, null);

}

//背景滚动

public void roll() {

x1 -= SPEED;

x2 -= SPEED;

if (x1 <= -734) {

x1 = 734;

}

if (x2 <= -734) {

x2 = 734;

}

g2.drawImage(image1, x1, 0, null);

g2.drawImage(image2, x2, 0, null);

x_yun-=1;

if (x_yun<=0){

g2.drawImage(image_yun, x_yun, y_yun, null);

x_yun=750;

if ((y_yun+=26)<80)

y_yun+=26;

}

}

}

[Java] 纯文本查看 复制代码package tn;

import sun.applet.Main;

import javax.swing.*;

import java.awt.*;

//线程类

public class FreshThread extends Thread {

GamePanl p;

public FreshThread(GamePanl p) {

this.p = p;//给类成员属性赋值

}

@Override

public void run() {

while (!p.isFinish()) {

p.repaint();//重新绘制图片

try {

Thread.sleep(p.FRESH);//休眠刷新时间

} catch (InterruptedException e) {

e.printStackTrace();

}

}

Container c=p.getParent();

while(!(c instanceof MainFrame)){

c=c.getParent();

}

MainFrame f= (MainFrame) c;

JOptionPane.showMessageDialog(f," G A M E O V E R");

f.restart();

}

}

[Java] 纯文本查看 复制代码package tn;

import javax.imageio.ImageIO;

import javax.swing.*;

import java.awt.*;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

/**

* 继承窗体面板的图片

*/

@SuppressWarnings("all")

public class GamePanl extends JPanel implements KeyListener {

//主图片

BufferedImage image;

//绘图工具,美工

Graphics2D g2;

kLong klong;//恐龙

boolean finish = false;//游戏结束

static final int FRESH = 10;//刷新时间,毫秒

BackgroundImage background;

List list = new ArrayList();//障碍物集合

int addObjectTimer = 0;

object ob=new object();

int score=0;//分数

int addScoreTimer=0;

//构造方法

public GamePanl() {

image = new BufferedImage(734, 286, BufferedImage.TYPE_INT_BGR);

g2 = image.createGraphics();

klong = new kLong();//实例化恐龙类

background = new BackgroundImage();//实例化背景图片

list.add(new object());

FreshThread t = new FreshThread(this);//刷新线程

t.start();

}

private void painImage() {//绘制图片

klong.move();//让小恐龙移动

background.roll();//调用滚动图片

g2.drawImage(background.image, 0, 0, this);//绘制背景

g2.drawImage(background.image_yun, background.x_yun,background.y_yun, this);//绘制白云

g2.drawImage(klong.image, klong.x, klong.y, this);//绘制恐龙

if (addObjectTimer >= 1400) {//计算分数时间判断

list.add(new object());

addObjectTimer = 0;

}

for (int i = 0; i < list.size(); i++) {

object o = list.get(i);

o.move();

o.bridMove();

g2.drawImage(o.image, o.x, o.y, this);//绘制障碍

//判断障碍物是否和头、脚相撞

if (o.bounds().intersects(klong.bounds1()) || o.bounds().intersects(klong.bounds2())){

gameOver();//游戏结束

}

}

//分数++

if (addObjectTimer>=50){

score+=1;

addScoreTimer=0;

}

//分数显示代码---"%05d"---指的是分数以五位数显示

g2.drawString(String.format("%05d",score),600,35 );

g2.drawString("Hi",536,35 );

g2.drawString(String.format("%05d",+MainFrame.topScore),550,35 );

addObjectTimer += FRESH;

addScoreTimer +=FRESH;

}

//游戏结束

public void gameOver(){

finish=true;

// image=background.image_over;

g2.drawImage(background.image_over,background.x_over,background.y_over,null);

if (score>MainFrame.topScore){//判断最高分

MainFrame.topScore=score;

}

}

@Override

public void paint(Graphics g) {

painImage();

g.drawImage(image, 0, 0, this);

}

public boolean isFinish() {

return finish;

}

//键盘监听

@Override

public void keyTyped(KeyEvent e) {//按键类型

}

@Override

public void keyPressed(KeyEvent e) {//按键按下

int code = e.getKeyCode();//获取按下的编码

if (code == KeyEvent.VK_SPACE) {

klong.jump();

}

}

@Override

public void keyReleased(KeyEvent e) {//按键抬起

}

}

[Java] 纯文本查看 复制代码package tn;

import javax.imageio.ImageIO;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

/**

* 恐龙类

*/

public class kLong {

public int x, y;//坐标

BufferedImage image;//图片

BufferedImage image1, image2, image3,image_over;

int stepTime = 0;//计时器

int fresh = GamePanl.FRESH;

boolean jumpState = false;//跳跃的状态

int jumpHeight = 100;//跳跃高度

final int LOWEST_Y = 200;//最低坐标

int jumpValue = 5;//跳跃的增变量

public kLong() {

try {

image1 = ImageIO.read(new File("image/long1.png"));

image2 = ImageIO.read(new File("image/long2.png"));

image3 = ImageIO.read(new File("image/long3.png"));

image_over = ImageIO.read(new File("image/over.png"));

} catch (IOException e) {

e.printStackTrace();

}

x = 50;//起始坐标

y = LOWEST_Y;//起始

}

public void move() {//移动

step();//踏步

if (jumpState) {

if (y >= LOWEST_Y) {

jumpValue = -4;

}

if (y <= LOWEST_Y - jumpHeight) {

jumpValue = 4;

}

y += jumpValue;

image = image3;

if (y >= LOWEST_Y) {

jumpState = false;

}

}

}

//踏步

void step() {

int tmp = stepTime / 100 % 2;

if (tmp == 1) {

image = image1;

} else {

image = image2;

}

stepTime += fresh;

}

public void jump() {//跳跃

jumpState = true;

}

//接触死亡区域

public Rectangle bounds1(){

return new Rectangle(x+20,y,20,10);

} //接触死亡区域

public Rectangle bounds2(){

return new Rectangle(x+5,y+35,20,10);

}

}

[Java] 纯文本查看 复制代码package tn;

import javax.swing.*;

import java.awt.*;

public class MainFrame extends JFrame {

GamePanl p;

public MainFrame() {

//窗口关闭

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

p = new GamePanl();

//获取窗体的主容器

Container c = getContentPane();

c.add(p);//把面板添加到主容器中

addKeyListener(p);//添加键盘监听

}

public static void main(String[] args) {

MainFrame frame = new MainFrame();

//窗体大小

frame.setBounds(340, 220, 734, 320);

//窗体可见

frame.setVisible(true);

//屏幕居中

frame.setLocationRelativeTo(null);

frame.setTitle("跳一跳");

}

//复活,把死掉的东西删掉,重新来过

public void restart(){

Container c=getContentPane();

//删除所有死的组件

c.removeAll();;

GamePanl gp=new GamePanl();

c.add(gp);

addKeyListener(gp);

c.validate();//重新验证容器组件

}

public static int topScore=0;//最高分

}

[Java] 纯文本查看 复制代码package tn;

import javax.imageio.ImageIO;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.File;

import java.io.IOException;

import java.util.Random;

/**

* 障碍物类

*/

public class object {

kLong klong=new kLong();

Random r = new Random();

int x, y;

public boolean judge=false;

BufferedImage image;

BufferedImage cactus01, cactus02, cactus03,bird1,bird2;//创建仙人掌+鸟

int speed = BackgroundImage.SPEED -1;

int temp = r.nextInt(4) + 1;//1-2-3

public object() {

//读取图片

try {

cactus01 = ImageIO.read(new File("image/cactus01.png"));

cactus02 = ImageIO.read(new File("image/cactus02.png"));

cactus03 = ImageIO.read(new File("image/cactus03.png"));

bird1= ImageIO.read(new File("image/bird1.png"));

bird2= ImageIO.read(new File("image/bird2.png"));

} catch (IOException e) {

e.printStackTrace();

}

x = 800;

y = 209;

//随机输出障碍物

switch (temp) {

case 1:

image = cactus01;

break;

case 2:

image = cactus02;

break;

case 3:

image = cactus03;

y = 200;

break;

default:

judge=true;

}

}

//鸟的运动

void bridMove() {

if (judge){

// if (temp>2){

// y-=20;

// }

int tmp = klong.stepTime / 100 % 2;

if (tmp == 1) {

image = bird1;

} else {

image = bird2;

}

klong.stepTime += klong.fresh;

}

}

//滚动

public void move() {

x -= speed;

x -= speed;

}

//死亡区域

public Rectangle bounds() {

return new Rectangle(x,y+2,image.getWidth()-2,image.getHeight()-10);

}

}

最后附上图片资源以及源码

c557529e2ea4bb8d5cb558b7b5575102.gif

跳一跳.rar

(84.83 KB, 下载次数: 190)

2019-5-3 14:27 上传

点击文件名下载附件

下载积分: 吾爱币 -1 CB

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值