用java制作小游戏:小恐龙跑酷

用java制作小游戏:小恐龙跑酷

插入链接与图片

运行图片:( 第一次做游戏,画风比较丑哈!最左边的就是主角小恐龙了,中间的是障碍物仙人掌,右边的小狗也是障碍物,右上角的是分数条)在这里插入图片描述

图片: ![Alt](https://avatar.csdn.net/7/7/B/1_ralf_hx163com.jpg =30x30)

图片: 在这里插入图片描述
以下是Java工程中的每一个类的代码:
**

MainFrame.java类:

**

import java.awt.Container;
import javax.swing.JFrame;

public class MainFrame extends JFrame {
GamePanel p;

public MainFrame() {
	setDefaultCloseOperation(EXIT_ON_CLOSE);//设置退出方式
	p = new GamePanel();
	Container c = getContentPane();
	c.add(p);
	
	addKeyListener(p);
}

public static void main(String[] args) {
	MainFrame frame = new MainFrame();
	frame.setBounds(500, 235, 1020, 780);//设置窗体的大小和位置
	frame.setVisible(true);
}

public void restart() {
	Container c=getContentPane();
	c.removeAll();
	
	GamePanel np=new GamePanel();
	c.add(np);
	addKeyListener(np);
	
	c.validate();
}

}

**

GamePanel.java类:

**

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
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;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class GamePanel extends JPanel implements KeyListener {
BufferedImage image;
Graphics2D g2;
Dinosaur golden;

boolean finish = false;

static final int FRESH = 15;

BackgroundImage background;

List<Obstacle> list = new ArrayList<Obstacle>();

int addObstacleTimer = 0;

int score=0;
int addScoreTimer=0;

public GamePanel() {
	image = new BufferedImage(1000, 735, BufferedImage.TYPE_INT_BGR);
	g2 = image.createGraphics();
	golden = new Dinosaur();
	background = new BackgroundImage();

	list.add(new Obstacle());
	FreshThread t = new FreshThread(this);
	t.start();
}

private void painImage() {
	golden.move();
	background.roll();

	g2.drawImage(background.image, 0, 0, this);
	
	//Rectangle rt=golden.getfeetBounds();
	//g2.setColor(Color.black);
	//g2.fillRect(rt.x, rt.y, rt.width, rt.height);
	
	g2.drawImage(golden.image, golden.x, golden.y, this);

	if (addObstacleTimer >= 2000) {
		Random r=new Random();
		int a=r.nextInt(100);//创建一个100以内的随机数
		if(a>60) {//有百分之六十的概率出现新障碍
			list.add(new Obstacle());
		}
		addObstacleTimer = 0;
	}

	for (int i = 0; i < list.size(); i++) {
		Obstacle o = list.get(i);
		o.move();
		//rt=o.getBounds();
		//g2.fillRect(rt.x, rt.y, rt.width, rt.height);
		g2.drawImage(o.image, o.x, o.y, this);
		
		if(o.getBounds().intersects(golden.getfeetBounds())) {
			gameOver();
		}
	}
	
	if(addScoreTimer>=500) {
		score+=10;
		addScoreTimer=0;
	}
	g2.setColor(Color.black);
	g2.setFont(new Font("黑体", Font.BOLD, 24));//设置分数字体为黑体加粗,24号大小
	g2.drawString(String.format("%05d", score), 800, 20);//给分数设置格式
	
	addObstacleTimer+=FRESH;
	addScoreTimer+=FRESH;

}

public void gameOver() {
	finish=true;
}

@Override
public void paint(Graphics g) {
	painImage();
	g.drawImage(image, 0, 0, this);
}

public boolean isFinish() {
	return finish;
}

@Override
public void keyPressed(KeyEvent arg0) {
	// TODO Auto-generated method stub

}

@Override
public void keyReleased(KeyEvent arg0) {
	int code = arg0.getKeyCode();
	if (code == KeyEvent.VK_SPACE) {
		golden.jump();
	}

}

@Override
public void keyTyped(KeyEvent arg0) {
	// TODO Auto-generated method stub

}

}




**

## Dinosaur.java类:

**


import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class Dinosaur {
	int x, y;
	BufferedImage image;
	BufferedImage image1, image2, image3;
	int stepTime = 0;
	int fresh = GamePanel.FRESH;

	boolean jumpState = false;//初始化恐龙的跳跃状态

	int jumpHeight = 370;//跳跃高度
	final int LOWEST_Y = 620;//恐龙站在地面的的y坐标
	
	int jumpValue=0;

	public Dinosaur() {
		try {
			image1 = ImageIO.read(new File("src/小恐龙1.jpg"));//读取图片
			image2 = ImageIO.read(new File("src/小恐龙2.jpg"));
			image1 = ImageIO.read(new File("src/小恐龙1.jpg"));

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		x = 5;
		y = LOWEST_Y;
	}

	public void move() {
		step();
		if(jumpState) {
			if(y>=LOWEST_Y) {
				jumpValue=-10;
			}
			if(y<=LOWEST_Y-jumpHeight) {
				jumpValue=10;
			}
			y+=jumpValue;
			if(y>=LOWEST_Y) {
				jumpState=false;
			}
		}
	

	}

	void step() {
		int tmp = stepTime / 150 % 3;//恐龙摆臂快慢
		switch (tmp) {
		case 0:
			image = image1;
			break;
		case 1:
			image = image2;
			break;
		default:
			image = image1;
			break;
		}

		stepTime += fresh;
	}

	public void jump() {
		jumpState = true;
	}
	
	public Rectangle getfeetBounds() {
		return new Rectangle(x+40, y+90, 85, 27);
	}
	

}



**

## FreshThread.java类:

**


import java.awt.Container;

import javax.swing.JOptionPane;

public class FreshThread extends Thread {
	GamePanel p;
	
	public FreshThread(GamePanel p) {
		this.p=p;
	}

	@Override
	public void run() {
		while(!p.isFinish()) {//判断是否重启游戏
			p.repaint();
			try {
				Thread.sleep(p.FRESH);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		Container c=p.getParent();
		while(!(c instanceof MainFrame)) {
			c=c.getParent();
		}
		MainFrame f=(MainFrame) c;
		
		JOptionPane.showMessageDialog(f, "游戏结束"	);
		f.restart();
	}

}



**

## BackgroundImage.java类:

**

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class BackgroundImage {
	BufferedImage image;
	BufferedImage image1, image2;
	Graphics2D g2;
	int x1, x2;
	static final int SPEED = 4;

	public BackgroundImage() {
		try {
			image1 = ImageIO.read(new File("src/background.jpg"));
			image2 = ImageIO.read(new File("src/background.jpg"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		image = new BufferedImage(1000, 735, BufferedImage.TYPE_INT_BGR);
		g2 = image.createGraphics();
		x1 = 0;
		x2 = 1000;
		g2.drawImage(image1, x1, 0, null);
		g2.drawImage(image2, x2, 0, null);
	}

	public void roll() {
		x1 -= SPEED;
		x2 -= SPEED;
		if(x1<=-1000) {
			x1=1000;
		}
		if(x2<=-1000) {
			x2=1000;
		}
		g2.drawImage(image1, x1, 0, null);
		g2.drawImage(image2, x2, 0, null);
	}

}



**

## Obstacle.java类

**

import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;

public class Obstacle {
	int x,y;
	BufferedImage image;	
	BufferedImage dog,cacti;
	int speed;
	
	public Obstacle() {
		try {
			dog=ImageIO.read(new File("src/b43538a4a9ba48ef562ac71bb0350bc3.gif"));
			cacti=ImageIO.read(new File("src/仙人掌_看图王.jpg"));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Random r=new Random();
		int temp=r.nextInt(2);//创建一个随机数,随机出现一个障碍物
		if(temp==0) {
			image=dog;
		}else {
			image=cacti;
		}
		speed=BackgroundImage.SPEED;//背景滚动的速度
		x=1000;
		y=620;
		
		
	}
	
	public void move() {
		x-=speed;
	}
	
	public Rectangle getBounds() {
		if(image==cacti) {
			return new Rectangle(x, y,image.getWidth(), image.getHeight());
		}else {
			return new Rectangle(x, y,image.getWidth()-17, image.getHeight());
		}

	}
	



图片素材:![在这里插入图片描述](https://img-blog.csdnimg.cn/20190412222616882.gif)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190412222650230.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0MTYwMTA3,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190412222717830.jpg)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190412222728885.jpg)
  • 5
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值