效果图:
为了更好地管理游戏,目前的框架是这样的:
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):
修改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);//加入到游戏里
运行一下,效果图:
好像什么效果都没有?
仔细查看代码,在创建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又显示出来了:
因为窗口的状态被改变了,系统就通知窗口重画了一遍,所以Sprite显示了出来
显然游戏不能这样,这是下一篇文章里要解决的
下一篇:【Java 2D游戏开发(三)】渲染线程/让Sprite动起来
上一篇:【Java 2D游戏开发(一)】GUI基础 / 显示出一个窗口