libgdx游戏引擎(四)之舞台和演员

       我们先看几个游戏截图再来理解何为舞台。

    

     请仔细观察图片中的元素,有些东西是不能动,有些有特效,有些没有。有些是按钮,有些是图片,但是其实它们都可以统称为演员(Actor)。

     再看一个射击类游戏

    

而其中的演员是

演员是游戏射击中常用的一个对象,它接受舞台的统一管理,拥有一些公共的事件,比如触摸,点击,但是同时还有自身的响应和属性。

而舞台就是容纳演员的场所。它统一管理所有演员,接受输入,同时操作一个方便的框架操作演员的时间变化。

一、介绍

1、Actor演员类:

     定义:在二维场景图中,一个演员拥有的位置,矩形的大小,起点,规模,旋转和颜色等属性。位置对应且不成比例。演员的位置相对于演员的父母,它的起点是相对位置,同时可用于缩放和旋转。一个演员也有一个行动,可以操纵演员在时间段内活动,同时可以加入监听来实现演员接收事件通知。

    演员是游戏设计中常用的一个对象,它接受舞台的统一管理,拥有一些公共的事件,比如触摸、点击,但同时还有自身的响应和属性。

2、Stage舞台类:

      定义:包含拥有层次结构的一个二维场景,场景中有许多演员。舞台负责操作视觉和处理分配输入事件。

      一个Stage可以充满整个屏幕。设置视角(一般是浮点型和布尔类型),同时设置阶段内使用的相机,调配Actor、Group与Screen之间的关系转换(包括坐标)。一个Stage必须负责接收输入事件,同时将它分配给演员。这通常是通过Stage的setinputprocessor来实现。如果一个演员通过返回true从输入的方法中处理一个事件,那么Stage的输入方法也会返回true,导致随后的inputprocessor不接收事件。

3、Aniamation动画类

定义:动画是由多个帧,在设定的时间间隔序列显示。比如,一个走路的人一个动画可以通过运行时播放这些图像无限拍照他了。简单的说就是管理动画,设置随即播放顺序。

二、代码实现

功能:点击屏幕出现宠物的移动画面。

程序入口:

package com.lichunan.libgdx.activity;

import com.badlogic.gdx.backends.android.AndroidApplication;
import com.lichunan.libgdx.game.MyGame;

import android.os.Bundle;
import android.util.Log;

public class LibgdxActivity extends AndroidApplication {
	private static final String LOG_TAG = "LIBGDX";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.i(LOG_TAG, "游戏开始启动!");
		//在此启动游戏
		initialize(new MyGame(), false);
		//第二个参数设为true,则在opengl 2.0可用的情况下会使用opengl 2.0
		Log.i(LOG_TAG, "游戏启动完成!");
	}

}
主界面:

package com.lichunan.libgdx.game;


import android.util.Log;

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.lichunan.libgdx.domain.MyActor;

public class MyGame implements ApplicationListener {
	
	private static final String LOG_TAG = "LIBGDX";

	private Stage stage;// 舞台
	private MyActor myActor;// 演员
	private AssetManager assetManager;
	private boolean hasinit = false;// 是否已经初始化

	@Override
	public void create() {
		Log.i(LOG_TAG, "->create start!");
		// 新建一个舞台
		stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(),
				true);
		// 实例化AssetManager
		assetManager = new AssetManager();
		// 传入AssetManager的引用,便于动画资源的初始化,但是注意了,只要在调用iniResource()后,资源才被初始化
		myActor = new MyActor(assetManager);
		// 把资源加入载入列表,在asset文件夹下animal下有29张图片
		for(int i=1; i<30; i++){
			assetManager.load("animal/" + i + ".png", Texture.class);
			//manager.load()方法只是将资源放入加载列表,而真正的加载要不停地调用manager.update()才可以
		}
		Log.i(LOG_TAG, "->create end!");
	}

	@Override
	public void render() {
		Log.i(LOG_TAG, "->render start!");
		Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);//清屏
		Gdx.gl.glClearColor(0f, 0f, 0f, 0f);

		stage.act(Gdx.graphics.getDeltaTime());
		stage.draw();
		
		// 加载完成之前且没有初始化过MyActor,且在手触摸屏幕时初始化MyActor,加入MyActor对象
		if(!hasinit && assetManager.update() && Gdx.input.isTouched()){
			myActor.initResource();// 初始化图片资源
			stage.addActor(myActor);
			hasinit = true;
		}
	}

	@Override
	public void dispose() {
		/**
		 * 释放内存
		 */
		myActor.dispose();
		assetManager.clear();
		assetManager.dispose();
	}

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

	}

	@Override
	public void resize(int arg0, int arg1) {
		// TODO Auto-generated method stub

	}

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

	}

}

一个演员类:

package com.lichunan.libgdx.domain;

import java.util.ArrayList;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.assets.AssetManager;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Animation;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.utils.Disposable;

/**
 * @title FirstActor.java
 * @description 1 、演员是游戏设计中常用的一个对象,它接受舞台的统一管理,拥有一些公共的事件
 *              2、实现Disposable接口,为的是能及时释放内存
 * @date 2014-01-11
 * @author lichunan
 * @version 1.0
 */
public class MyActor extends Actor implements Disposable {
	private ArrayList<Texture> texArray = new ArrayList<Texture>();
	private ArrayList<TextureRegion> texReArray = new ArrayList<TextureRegion>();
	private Animation animation;// 动画
	private TextureRegion[] walksFrame;;
	private float stateTime;
	private TextureRegion currentFrame;// 当前帧
	private AssetManager manager;

	public MyActor(AssetManager manager) {
		this.manager = manager;
	}

	/**
	 * 这是一个系统自动调用的方法,描述这个演员Actor实例怎么绘制,draw()方法并不需要我们人工去调用,而是在
	 * ApplicationListener的render()函数中不停地调用stage.draw,系统会自动调用已经加入state中的actor的
	 * draw()方法,也就将actor一起绘制
	 */
	@Override
	public void draw(SpriteBatch batch, float parentAlpha) {
		stateTime += Gdx.graphics.getDeltaTime();
		// 得到下一帧
		currentFrame = animation.getKeyFrame(stateTime, true);// 循环
		// 以(0, 0)绘制为起点(左下角为100,100)画出动画,大小为128 * 128
		batch.draw(currentFrame, 100, 100, 128, 128);
	}

	@Override
	public Actor hit(float x, float y, boolean touchable) {
		return this;
	}
	
	//初始化方法,在Progress中的AssetManager初始化完成后通知AnimalActor初始化
	public void initResource(){
		for(int i=1; i<30; i++){
			texArray.add(manager.get("animal/" + i + ".png", Texture.class));
		}
		for(Texture tex : texArray){
			TextureRegion texRe = new TextureRegion(tex);//区域
			texReArray.add(texRe);
		}
		int size = texReArray.size();//数组的长度
		walksFrame = new TextureRegion[size];//转区域的数组
		for(int i=0; i<size; i++){
			walksFrame[i] = texReArray.get(i);
		}
		//设置为0.06s一帧
		animation = new Animation(0.06f, walksFrame);
	}
	
	@Override
	public void dispose() {
		for(Texture tex : texArray){
			tex.dispose();
		}
	}

}

分析:

1、在MyGame类中,我们实例化了舞台和演员,在render()中让舞台开始绘画,里面所添加的各种演员就会自动调用自己的draw()进行绘画,不需要手动调用。

2、这里还使用了AssetManager:一个资源异步加载和资源自动管理类。

3、manager.load()方法只是将资源放入加载列表,而真正的加载要不停地调用manager.update()才可以,这个方法也是 render()中系统自己调用的。









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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值