上回说到拍电影模式来设计游戏引擎。实际上不讲数据结构,光是类设计得不停的再思考。毕竟没有人能一步设计到位。
想对骨架进行剖析;我不是很想画图,程序员沟通不是靠画图和留文档。(别人来看图读文档,说明你已经离职在交接工程了)
,
所以我会以白话文来阐述讲清楚。
假如你跳开自己是程序员,把自己当做一名导演来看。
你想拍好一步电影。你要如何规范这些演员。是我当然是希望这些演员是万能演员,给什么脚本他就演什么,轻松修改剧情也能很好按照导演的指示扮演,
如何让演员万能起来
有人按下空格键开按键宝箱,会被宝箱追着咬。宝箱触发开箱事件,然后自动跑。
这里可以想象,演员的脚本无论多么复杂都离不开这2个类别,
脚本script addScript
一个是根据时间事件(timeScript 继承至script) 每隔一段自己会动
一个是根据事件触发(eventScript 继承至script)类似玩家按下某个按键,
以下就是脚本接口设计
public interface IScript {
public void addEventScript(IEventScript script);
public void addITimeScript(ITimeScript script);
}
public interface IEventScript extends IScript{
public void eventScript(IAct a);
}
public interface ITimeScript extends IScript{
public void timeScript(GameStage stage,GameCanvas canvas,IAct a);
}
package game.engines;
import game.engines.inteface.IAct;
import game.engines.inteface.IEventScript;
import game.engines.inteface.IScript;
import game.engines.inteface.ITimeScript;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Script implements IScript, IEventScript, ITimeScript {
//事件脚本
protected List<IEventScript> eventScriptList;
//时间脚本
protected List<ITimeScript> timeActionList;
/**
* 添加事件脚本
*/
public void addEventScript(IEventScript script) {
// TODO Auto-generated method stub
if (eventScriptList == null) {
eventScriptList = new ArrayList<IEventScript>();
}
eventScriptList.add(script);
}
/**
* 时间脚本
*/
public void addITimeScript(ITimeScript script) {
// TODO Auto-generated method stub
if (timeActionList == null) {
timeActionList = new ArrayList<ITimeScript>();
}
timeActionList.add(script);
}
/**
* 遍历事件脚本
*/
public void eventScript(IAct act) {
if (act == null) {
return;
}
Iterator<IEventScript> it = eventScriptList.iterator();
while (it.hasNext()) {
it.next().eventScript(act);
}
}
/**
* 遍历时间脚本
*/
public void timeScript(GameStage stage,GameCanvas canvas,IAct act) {
if (act == null) {
return;
}
Iterator<ITimeScript> it = timeActionList.iterator();
while (it.hasNext()) {
it.next().timeScript(stage,canvas,act);
}
}
}
这样脚本里面就可以套脚本。可以轻松给演员替换和追加脚本
这里演员能演桌子,还能演桌子上的茶几,演员在图层里。图层有自己脚本。图层在场景里,场景有自己的脚本。
那么就是说一切皆演员。
对于2D游戏来说其核心代码就是
伪代码:
new Thread(new Runnable() {
public void run() {
while (true) {
// 绘制舞台
// draw(stage);
// 当前场景
// draw(stage.getScene())
// for遍历当前场景的所有画布(画布list)
// for遍历每个画布上的精灵(精灵list)
// 调用所有精灵的时间
// 。。。。。。。。。。。。。
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
你会发现这是一个树形结构。我们可以借鉴dom4j所有节点继承至interface org.dom4j.Node接口源码
package org.dom4j;
import java.io.IOException;
import java.io.Writer;
import java.util.List;
public interface Node extends Cloneable {
boolean supportsParent();
Element getParent();
void setParent(Element parent);
Document getDocument();
void setDocument(Document document);
boolean isReadOnly();
boolean hasContent();
String getName();
void setName(String name);
String getText();
void setText(String text);
String getStringValue();
String getPath();
String getPath(Element context);
String getUniquePath();
String getUniquePath(Element context);
String asXML();
void write(Writer writer) throws IOException;
short getNodeType();
String getNodeTypeName();
...........
}
为了足够的灵活继承不适合。所以我们定一个接口(扮演者 IACT),所有显示的角色都继承至它
你可能会对这样写接口表示理解不能,但是如果你使用过dom4j,dom4j的框架设计的很灵活,
所有的类都实现了一个根接口,只要你实现这些方法,你就是一名合格的扮演者
/**
* 扮演者
*/
public interface IAct {
public void setScript(Script script);
public Script getScript();
public HashMap<String, String> getAttributes();
public void setAttributes(HashMap<String, String> attributes);
public double getX() ;
public void setX(double x);
public double getY();
public void setY(double y);
public int getWidth();
public void setWidth(int width) ;
public int getHeight();
public void setHeight(int height);
public double getMove();
public void setMove(double move);
public Model getModel();
public void setModel(Model model);
public void setDirection(Direction direction);
public Direction getDirection();
public GameStage getGameStage();
public void setGameStage();
public void getLayer();
public void setLayer(Layer layer); ......更多抽象
}
现在我们的(导演)就把拍电影的演员和舞台 道具 特效.............都是归纳为扮演者。
是不是足够灵活了,期待和实验下吧。