【WiEngine 游戏引擎】基础(1)搭建一个最简单的Demo:添加一个精灵

通过这个demo将了解WiEngine创建一个游戏的基本流程,在看代码之前先了解一下一些基本概念。

copy自官网:

基本概念

坐标系

Android的缺省坐标系是原点在左上角,x和y轴的正向是往右和往下。而OpenGL的坐标系是原点在左下角,x和y轴的正向是往右和往上。WiEngine采用了OpenGL的坐标系,所以要注意设置某些坐标的时候,是要相对于左下角来说的。

场景(Scene)

不管是应用还是游戏,都可以认为是由一个个界面组成的,界面之间的跳转就形成了这个应用或者游戏的操作流程。在WiEngine里,这一个个界面叫做场景。一个典型的游戏,应该是包含一个载入界面,一个菜单界面再加一个游戏界面,那么就可以划分为三个场景。WiEngine提供了场景对象,同时支持场景之间切换的各种特效。

节点(Node)

从类结构上去看,场景并不是最顶层的类,它实际上是Node的子类。节点是WiEngine中的顶层概念,它代表游戏中的某个“东西”。做个不是特别恰当 的比方,它类似于Java中的Object类。Node类是很多类的父类,比如菜单,比如贴图,等等。节点可以包含子节点,因此它们可以形成一个树型的结构,在游戏绘制时,它从根部开始,一直绘制完所有节点,就完成了一帧的渲染。

节点有一些比较基本,也是比较关键的概念:

  1. 大小:节点一般是有个大小的,可以通过setContentSize来设置一个节点有多大。大小为0也没问题,只要确实需要。
  2. 锚点(Anchor):锚点是相对于节点本身的坐标系来说的,通过setAnchorPercent方法设置锚点的相对位置。比如说,锚点是(0.5, 0.5), 而节点的大小是100×200, 那么这个锚点相对于本节点的坐标是(50, 100)。节点缺省的锚点位置是(0.5, 0.5), 也就是在节点的中间.
  3. 位置:节点的位置可以通过setPosition方法设置。但是位置具体表示哪个点则受到relativeAnchorPoint标志的影响。当该标志为true时,位置和锚点是同一个点,当为false时,位置表示节点的左下角,和锚点是不同点。这个逻辑可能理解起来有点奇怪,由于WiEngine参考了cocos2d的一些命名,所以这个标志的名称也沿用了过来。但是我们觉得relativeAnchorPoint这个标志的名称起的有些令人费解,不排除在WiEngine的后续版本中修改该标志名称。relativeAnchorPoint不管是true还是false,一些基本操作,比如旋转,缩放等,都会根据节点锚点来进行。

导演(Director)

翻译成导演其实没错,但是感觉怪怪的,还是用Director吧。Director是单例模式的,游戏开始结束时都需要调用Director的方法进行初始化或者销毁工作。Director提供了一些管理场景的方法,比如runWithScene, pushScene, replaceScene等,通过这些API可以实现在各个场景之间切换。

也可以通过Director设置或者获取一些系统信息,比如调整一些OpenGL相关的设置,得到屏幕大小等,因此Director也是开发者和WiEngine系统间的一个桥梁。

层(Layer)

层也是节点的子类,它可以做为场景的子节点加入到场景中。所以场景也可以有多个层,可以根据需要显示不同的层,当然,你也可以不用层,这些都由你来把握。

精灵(Sprite)

Sprite在WiEngine中主要就是代表一个图片相关资源,比如从某个PNG图片中载入的一个人物形象。Sprite是节点的子类,所以Sprite具有节点应该具有的一些特性。另外还有一个AtlasSprite,它和Sprite的区别只是图片的来源不一样,关于什么是Atlas请看下一小节。

图片集(Atlas)

OpenGL对贴图的宽高尺寸有一个2的整数幂的要求,也就是长宽必须是2, 4, 8, 16, 32, 64等等。但是大部分时候图片都不是正好这个大小,这样的话每个图片都可能浪费一些内存,累积起来就会比较可观。为了节省资源,可以把若干张图片拼成一大张,这张大图片就叫做图片集。在使用时,图片集被整个载入,但是绘制的时候,可以只绘制指定的部分,这样就好像是单张图片一样了。AtlasSprite就是指这个Sprite来自于某个图片集,它一般要结合TextureAtlas使用,图片的载入工作是由TextureAtlas完成的,AtlasSprite只是指定一下绘制区域的相关坐标。

动作(Action)

游戏里经常会需要进行一些动画或者交互操作,Action为这种需求提供一种通用框架。Action说明了一个效果该怎么去做,而节点是效果的载体,通过Node.runAction()方法,可以在任意节点上执行一个Action。Action有许多子类,每个都对应于一种动作或者特效,而且多个Action还可以组合起来构成新的效果,比如同时既旋转又缩放。

================================================================================


创建一个Android项目,将WiEngine的库导入进去,创建一个Activity并实现IDirectorLifecycleListener接口,代码如下:

public class MainActivity extends Activity implements IDirectorLifecycleListener
{
	static
	{
		System.loadLibrary("wiskia");
		System.loadLibrary("xml2");
		System.loadLibrary("wiengine");
		System.loadLibrary("wiengine_binding");
		System.loadLibrary("lua");
		System.loadLibrary("chipmunk");
		System.loadLibrary("box2d");
		System.loadLibrary("wisound");
	}
	protected WYGLSurfaceView	mGLSurfaceView;
	protected Scene				mScene;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);

		mGLSurfaceView = new WYGLSurfaceView(this);
		setContentView(mGLSurfaceView);
		// 设置显示FPS
		Director.getInstance().setDisplayFPS(true);
		// 添加一个生命周期监听器
		Director.getInstance().addLifecycleListener(this);

	}

	private void createScene()
	{
		// 创建一个场景,并向其中添加一个Layer
		mScene = Scene.make();
		mScene.addChild(new VLayer());
		mScene.autoRelease(true);
	}

	@Override
	public void onSurfaceChanged(int arg0, int arg1)
	{
		createScene();
		// 运行场景
		Director.getInstance().runWithScene(mScene);
	}

	@Override
	public void onSurfaceCreated()
	{
	}

	@Override
	public void onSurfaceDestroyed()
	{
	}

	@Override
	protected void onDestroy()
	{
		Director.getInstance().end();
		super.onDestroy();
	}

	@Override
	protected void onPause()
	{
		super.onPause();
		Director.getInstance().pause();
	}

	@Override
	protected void onResume()
	{
		super.onResume();
		Director.getInstance().resume();
	}

	@Override
	public void onDirectorEnded()
	{
	}

	@Override
	public void onDirectorPaused()
	{
	}

	@Override
	public void onDirectorResumed()
	{
	}

	@Override
	public void onDirectorScreenCaptured(String arg0)
	{
	}
}

Activity的view 为WYGLSurfaceView

mScene = Scene.make();
mScene.addChild(new VLayer());
mScene.autoRelease(true);

创建了一个场景mScene,并向其中添加了一个Layer,下边是VLayer的具体实现

VLayer.java

public class VLayer extends Layer implements INodeVirtualMethods
{
	private Sprite	mSprite;

	public VLayer()
	{
		// 制造精灵
		mSprite = Sprite.make(R.drawable.role_3_0);
		addChild(mSprite);
		// 设置精灵的位置
		mSprite.setPosition(100, 200);
	}

	@Override
	public void jDraw()
	{
		// TODO Auto-generated method stub
	}

	@Override
	public void jOnEnter()
	{
		// TODO Auto-generated method stub
	}

	@Override
	public void jOnEnterTransitionDidFinish()
	{
		// TODO Auto-generated method stub
	}

	@Override
	public void jOnExit()
	{
		// TODO Auto-generated method stub
	}
}

国际惯例,上图:





转载请注明出处:http://blog.csdn.net/Vestigge




你可能感兴趣的:(【WiEngine 游戏引擎】基础(1)搭建一个最简单的Demo:添加一个精灵)