Java学习笔记_17 项目实战之天天酷跑(四):游戏主界面

这篇博客介绍了如何使用Java实现游戏主界面,包括背景滚动、玩家动态效果、五种障碍物生成、碰撞逻辑、暂停/继续及结束功能。文章通过详细讲解和示例代码展示了具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接上文,本文将实现游戏主界面,功能如下:

移动的背景图片、动态的玩家、玩家的移动功能、
五种障碍物持续出现、玩家和障碍物的碰撞、
暂停、继续功能。

首先,看一下整体效果:

动图实在太大,几秒钟的 Gif 就十几兆了。无奈,图片展示效果。

跳跃、得分、下落、障碍物:
在这里插入图片描述
碰到障碍物后,玩家被推着走。
在这里插入图片描述

下面,分别解释一下每个功能的逻辑:

一、创建一个显示窗体,承载游戏的主面板类。

GameFrame.java

package cn.sqc.runday.view;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

import cn.sqc.runday.controller.GamePanel;

/**
 * @author Huey
 *2020-11-27  下午12:40:22
 * 游戏主界面:显示窗体,承载游戏的主面板类
 */

public class GameFrame extends JFrame {
   
	//设置窗体宽高属性
	public static final int WIDTH=1500;
	public static final int HEIGHT=900;
	public GameFrame() {
   
		//2.4创建游戏面板对象,并添加到窗体上去
		GamePanel panel = new GamePanel();
		panel.action();//程序启动的方法
		this.addKeyListener(panel);//谁实现就监听谁
		this.add(panel);
		
		/**1.设置窗体基本属性*/
		this.setSize(WIDTH,HEIGHT);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setIconImage(new ImageIcon("Image/115.png").getImage());
		this.setUndecorated(true);
		this.setVisible(true);	
	}
	
	public static void main(String[] args) {
   
		new GameFrame();
	}
}

二、游戏主面板类(核心逻辑类):

1、背景图片滚动效果

使用两张背景图片,实现背景图片滚动效果的逻辑如下:
在这里插入图片描述
下面用动图演示一下:
在这里插入图片描述

2、玩家动态效果

我国早期很有名的一部动画片《大闹天宫》,由于当时没有电脑,所以需要一帧一帧的画,随后快速播放图片,形成动态的画面(我愿称之:真·动画),并为之配音,短短10分钟的动画却要画7000到10000张原画!

而此处,我们的玩家的奔跑姿态,同理是由九张图片构成。
在这里插入图片描述
下面动图演示:
在这里插入图片描述
下面是实现玩家的(生成、移动、绘制)的基本代码,后面的障碍物的实现,也都遵循这一编写逻辑。

为更方便读懂代码,已尽力注释,若仍有不清楚的地方,欢迎留言交流。

Person.java

package cn.sqc.runday.model;

import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import cn.sqc.runday.view.GameFrame;

/**
 * @author Huey
 * @date 2020-11-23
 * 玩家的实体类
 */
public class Person {
   //1.声明属性
	private Image image;//1.1 玩家当前显示图片
	private Image[] images;//1.2 玩家所有图片
	
	public static final int WIDTH = 120;//1.3玩家宽高
	public static final int HEIGHT = 120;
	
	//1.4玩家初始位置坐标
	private int x,y;
	int index;//下面用作切换图片
	//玩家得分
	private int score;
	//玩家跑酷距离
	private int distance;
	
	public Person() {
   //2.赋值
		//给图片数组images赋值
		init();//2.1	先写,会提示要不要实现!自动生成方法
		//默认当前显示图片位第一张图片 2.6
		image = images[0];
		
		x = 90;//2.7
		y = 580;//脚踩地板
		index = 0;
		score = 0;
		distance = 0;
	}
	//玩家自由下落方法5.1
	public void drop() {
   
		y += 5;
		if(y>=580){
   // 下落归下落,也得温柔点,不能让小人儿踩破了地板
			y = 580;
		}
	}
	//玩家移动的方法
	public void step(){
   
		//玩家图片的切换
		image = images[index ++ /3%images.length];
		//玩家坐标改变(玩家坐标通过键盘控制,此次不做处理)
	}
	//绘制玩家的方法
	public void paintPerson(Graphics g){
   
		g.drawImage(image, x, y, WIDTH, HEIGHT, null);
	}

	//判断玩家是否越界的方法
	public boolean outOfBounds(){
   
		return this.x >= GameFrame.WIDTH || this.x <= -WIDTH;
	}
	private void init() {
   //2.2
		images = new Image[9];
		for(int i = 0; i<images.length; i++){
   //2.3
			try {
   //2.5
				images[i] = ImageIO.read(new File("Image/"+(i+1) + ".png"));//2.4
			} catch (IOException e) {
   //2.5
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
//2.8  右键,Source,GGAS
	public Image getImage() {
   
		return image;
	}

	public void setImage(Image image) {
   
		this.image = image;
	}

	public Image[] getImages() {
   
		return images;
	}

	public void setImages(Image[] images) {
   
		this.images = images;
	}

	public int getX() {
   
		return x;
	}

	public void setX(int x) {
   
		this.x = x;
	}

	public int getY() {
   
		return y;
	}

	public void setY(int y) {
   
		this.y = y;
	}

	public static int getWidth() {
   
		return WIDTH;
	}

	public static int getHeight() {
   
		return HEIGHT;
	}
	public int getIndex() {
   
		return index;
	}
	public void setIndex(int index) {
   
		this.index = index;
	}
	public int getScore() {
   
		return score;
	}
	public void setScore(int score) {
   
		this.score = score;
	}
	public int getDistance() {
   
		return distance;
	}
	public void setDistance(int distance) {
   
		this.distance = distance;
	}
	
}

3、几种障碍物的出现

障碍物一:螃蟹

在这里插入图片描述

package cn.sqc.runday.model;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Paint;
import java.io.File;

import javax.imageio.ImageIO;

import cn.sqc.runday.view.GameFrame;

public class Barrs_1 {
   
	private Image image;
	private Image [] images;
	public static final int WIDTH=100;
	public static final int HEIGHT=110;
	private int x,y;
	int  index;
	private int speed;
	
	public Barrs_1() {
   //		螃蟹!
		images = new Image[2];
		try {
   
			images[0]=ImageIO.read(new File("image/a2.png"));
			images[1]=ImageIO.read(new File("image/a4.png"));		
		} catch (Exception e) {
   
			// TODO: handle exception
		}		
		image = images[0];
		x=GameFrame.WIDTH+100;
		y=580;
		speed =30;
		index = 0;
	}
	
	public  void step() {
   //切换图片
		image =images[index++/5%images.length];
		x-=speed;//切换图片实现螃蟹爪子张合的动态效果的同时,使其向左移动
	}
  public void paintBarrs(Graphics g) {
   
	g.drawImage(image, x,y,WIDTH,HEIGHT, null);
}
  public boolean outofBounds(){
   
		return this.x <=-WIDTH;
	}
public Image getImage() {
   
	return image;
}
public 
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值