android 2D游戏开发,引擎设计(二)脚本思考

30 篇文章 0 订阅

上回说到拍电影模式来设计游戏引擎。实际上不讲数据结构,光是类设计得不停的再思考。毕竟没有人能一步设计到位。


想对骨架进行剖析;我不是很想画图,程序员沟通不是靠画图和留文档。(别人来看图读文档,说明你已经离职在交接工程了)

所以我会以白话文来阐述讲清楚。


假如你跳开自己是程序员,把自己当做一名导演来看。

你想拍好一步电影。你要如何规范这些演员。是我当然是希望这些演员是万能演员,给什么脚本他就演什么,轻松修改剧情也能很好按照导演的指示扮演,


                                          如何让演员万能起来

有人按下空格键开按键宝箱,会被宝箱追着咬。宝箱触发开箱事件,然后自动跑。

这里可以想象,演员的脚本无论多么复杂都离不开这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);                                                                                                                        ......更多抽象
}

现在我们的(导演)就把拍电影的演员和舞台 道具 特效.............都是归纳为扮演者。

是不是足够灵活了,期待和实验下吧。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值