libgdx游戏引擎(四)之舞台和演员
2014-01-11 22:32
501 查看
我们先看几个游戏截图再来理解何为舞台。
![](http://img.blog.csdn.net/20140111160944171?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWHVhbll1WnVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
请仔细观察图片中的元素,有些东西是不能动,有些有特效,有些没有。有些是按钮,有些是图片,但是其实它们都可以统称为演员(Actor)。
![](http://img.blog.csdn.net/20140111161450640?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWHVhbll1WnVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
再看一个射击类游戏
![](http://img.blog.csdn.net/20140111161555921?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWHVhbll1WnVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
而其中的演员是
![](http://img.blog.csdn.net/20140111161724921?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWHVhbll1WnVv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
演员是游戏射击中常用的一个对象,它接受舞台的统一管理,拥有一些公共的事件,比如触摸,点击,但是同时还有自身的响应和属性。
而舞台就是容纳演员的场所。它统一管理所有演员,接受输入,同时操作一个方便的框架操作演员的时间变化。
一、介绍
1、Actor演员类:
定义:在二维场景图中,一个演员拥有的位置,矩形的大小,起点,规模,旋转和颜色等属性。位置对应且不成比例。演员的位置相对于演员的父母,它的起点是相对位置,同时可用于缩放和旋转。一个演员也有一个行动,可以操纵演员在时间段内活动,同时可以加入监听来实现演员接收事件通知。
演员是游戏设计中常用的一个对象,它接受舞台的统一管理,拥有一些公共的事件,比如触摸、点击,但同时还有自身的响应和属性。
2、Stage舞台类:
定义:包含拥有层次结构的一个二维场景,场景中有许多演员。舞台负责操作视觉和处理分配输入事件。
一个Stage可以充满整个屏幕。设置视角(一般是浮点型和布尔类型),同时设置阶段内使用的相机,调配Actor、Group与Screen之间的关系转换(包括坐标)。一个Stage必须负责接收输入事件,同时将它分配给演员。这通常是通过Stage的setinputprocessor来实现。如果一个演员通过返回true从输入的方法中处理一个事件,那么Stage的输入方法也会返回true,导致随后的inputprocessor不接收事件。
3、Aniamation动画类
定义:动画是由多个帧,在设定的时间间隔序列显示。比如,一个走路的人一个动画可以通过运行时播放这些图像无限拍照他了。简单的说就是管理动画,设置随即播放顺序。
二、代码实现
功能:点击屏幕出现宠物的移动画面。
程序入口:
一个演员类:
分析:
1、在MyGame类中,我们实例化了舞台和演员,在render()中让舞台开始绘画,里面所添加的各种演员就会自动调用自己的draw()进行绘画,不需要手动调用。
2、这里还使用了AssetManager:一个资源异步加载和资源自动管理类。
3、manager.load()方法只是将资源放入加载列表,而真正的加载要不停地调用manager.update()才可以,这个方法也是 render()中系统自己调用的。
请仔细观察图片中的元素,有些东西是不能动,有些有特效,有些没有。有些是按钮,有些是图片,但是其实它们都可以统称为演员(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()中系统自己调用的。
相关文章推荐
- Android游戏引擎libgdx使用教程4:舞台和演员的游戏实例
- libgdx游戏引擎开发笔记(六)舞台、演员、动画综合讲解 推荐
- libgdx游戏引擎开发笔记(六)舞台、演员、动画综合讲解
- Android游戏引擎libgdx使用教程6:演员与演出
- android游戏开发框架libgdx的使用(四)--舞台和演员
- 【游戏引擎LibGdx】利用演员制作简单动画(简单仿制保卫萝卜开头画面)
- android游戏开发框架libgdx的使用(四)--舞台和演员
- Android游戏引擎libgdx使用教程5:常用UI类与舞台
- android游戏开发框架libgdx的使用(四)--舞台和演员
- libgdx游戏引擎教程(十)演员类的复杂动画(一)(附源码)
- libgdx游戏引擎教程(十一)演员类的复杂动画(二)(附源码)
- Android游戏引擎libgdx使用教程10:双舞台
- libgdx游戏引擎教程(十三)演员类的用户交互功能详解(附源码)
- libgdx引擎-android游戏开发(三)
- libgdx游戏引擎(一)
- libgdx游戏引擎开发笔记(七)SuperJumper游戏例子的讲解(篇一)---- 游戏框架的搭建
- Android 游戏引擎libgdx之Box2D
- Android游戏引擎之Libgdx学习(二)
- Android游戏引擎libgdx使用教程16:使用TexturePacker工具加快开发速度
- Java游戏引擎libgdx的简介