【Java 2D游戏开发(二)】GameObject与Sprite/显示出第一个物体

效果图:
【Java 2D游戏开发(二)】GameObject与Sprite/显示出第一个物体


为了更好地管理游戏,目前的框架是这样的:
Game 包含>> Sprite 继承自>> GameObject

Game:游戏的核心类,储存多个GameObject,处理游戏的渲染、输入等
Sprite:一个显示出贴图的预制GameObject
GameObject:最基本的类,游戏主要的逻辑处理


新建类GameObject,所有的游戏物体都会继承此类

package com.game.engine;

import java.awt.Graphics;

public class GameObject 
{
	protected int x;//坐标x
	protected int y;//坐标y
	
	/**
	 * 渲染此GameObject
	 * @param g 目标Graphics
	 */
	public void draw(Graphics g)
	{
		
	}
	
	/**
	 * 设置坐标
	 */
	public void setPosition(int x, int y)
	{
		this.x = x;
		this.y = y;
	}
	
	/**
	 * 移动指定偏移坐标
	 */
	public void transfer(int x, int y)
	{
		this.x += x;
		this.y += y;
	}
	
	//下面就不解释了
	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;
	}
	
	
}

再新建一个类Sprite(精灵)继承GameObject,重写draw方法

package com.game.engine;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

public class Sprite extends GameObject
{
	private Image image;
	
	public Sprite(String filePath)
	{
		image = Toolkit.getDefaultToolkit().createImage(filePath);//从文件里加载图片
		this.x = 0;
		this.y = 0;
	}
	
	@Override
	public void draw(Graphics g)
	{
		//在(x,y)处绘制图片,不拉伸,原图片多大,画出来就多大
		g.drawImage(image, x, y, null);
	}

}

为了能储存当前所有的GameObject,在Game类下创建一个ArrayList

private ArrayList<GameObject> gameObjects;

修改构造方法

	public Game(int windowWidth, int windowHeight, String title)
	{
		width = windowWidth;
		height = windowHeight;
		windowTitle = title;
		backgroundColor = Color.BLACK;
		
		gameObjects = new ArrayList<GameObject>();//初始化ArrayList
		createWindow();
	}

添加addGameObject方法

	public void addGameObject(GameObject gameObject)
	{
		gameObjects.add(gameObject);
	}

在paint方法里需要遍历list,调用所有GameObject的draw方法,这样就能把所有的物体都显示出来

	//重写窗体绘制方法
	@Override
	public void paint(Graphics g)
	{
		//渲染所有的sprite
		for(int i = 0; i < gameObjects.size(); i++)
		{
			gameObjects.get(i).draw(g);
		}
	}

这里提供一个素材(来自Undertale):
【Java 2D游戏开发(二)】GameObject与Sprite/显示出第一个物体
修改main方法,加入一个Sprite

Game game = new Game(700, 500, "Java 2D Game");
Sprite s = new Sprite("C:\\Users\\Administrator\\Desktop\\char_forward_0.png");//新建Sprite
s.setPosition(50, 50);//设置坐标
game.addGameObject(s);//加入到游戏里

运行一下,效果图:
【Java 2D游戏开发(二)】GameObject与Sprite/显示出第一个物体
好像什么效果都没有?
仔细查看代码,在创建Game对象的时候就已经创建了窗口

	public Game(int windowWidth, int windowHeight, String title)
	{
		width = windowWidth;
		height = windowHeight;
		windowTitle = title;
		backgroundColor = Color.BLACK;
		gameObjects = new ArrayList<GameObject>();
		
		//创建窗口-----------------------------------------------------------
		createWindow();
	}

创建了之后窗口就要显示出来,paint方法会立即被调用,而此时Sprite还没有创建,所以什么都没有

现在将窗口最小化,再恢复,你会发现Sprite又显示出来了:
【Java 2D游戏开发(二)】GameObject与Sprite/显示出第一个物体
因为窗口的状态被改变了,系统就通知窗口重画了一遍,所以Sprite显示了出来
显然游戏不能这样,这是下一篇文章里要解决的


下一篇:【Java 2D游戏开发(三)】渲染线程/让Sprite动起来
上一篇:【Java 2D游戏开发(一)】GUI基础 / 显示出一个窗口