libgdx游戏引擎开发笔记(六)舞台、演员、动画综合讲解

简介:

   今天要讲解的舞台和演员是libgdx游戏引擎中重要的两个类,先简单介绍一下,待会用个显示动画的实例来综合应用一下!

先上一张图:

   在这张图中,我们可以看到有动的小鸟,不动的按钮,有特效,没有特效。。。。等等这些都称之为演员,而管理这些演员的自然就是舞台了。


一.介绍

1.Actor 演员类:

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

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


2.Stage 舞台类:

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

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

可以参http://smallwoniu.blog.51cto.com/3911954/1255187那副结构图就更明了了


3.Aniamation 动画类:

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


二.代码实现

  1.功能:点击屏幕出现宠物的移动动画(不清楚的直接看注解哦!)

   2.代码:


程序入口:

1
2
3
4
5
6
7
8
9
10
11
12
13
package  com.zhf.android_libgdx_animation;
import  com.badlogic.gdx.backends.android.AndroidApplication;
import  android.os.Bundle;
public  class  MainActivity  extends  AndroidApplication{
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         //在此启动游戏,MyGame实现了ApplicationListener的类
         initialize( new  MyGame(),  false );
          //specifying the configuration for the GLSurfaceView.
         //第二个参数如果设为true,则在opengl 2.0可用的情况下会使用opengl 2.0。
     }
}


主界面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package  com.zhf.android_libgdx_animation;
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;
public  class  MyGame  implements  ApplicationListener {
     private  Stage stage;   //舞台
     private  MyActor myActor;  //演员
     private  AssetManager assetmanager;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
     boolean  hasinit;   //是否已经初始化
     @Override
     public  void  create() {
         //新建一个舞台
         stage =  new  Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(),  true );
         //实例化AssetMangager
         assetmanager =  new  AssetManager();
         //传入AssetManger的引用,便于动画的资源初始化,但是注意了,只有在调用iniResourse()后资源才被初始化
         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()才可以,且update()函数有一个返回值,载入完成返回true,未完成返回false.*/
         }
     }
     @Override
     public  void  dispose() {
         myActor.dispose();
         assetmanager.clear();
         assetmanager.dispose();
     }
     @Override
     public  void  pause() {
     }
     @Override
     public  void  render() {
         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  resize( int  arg0,  int  arg1) {
     }
     @Override
     public  void  resume() {
     }
}

一个演员类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package  com.zhf.android_libgdx_animation;
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;
/**
  * 演员是游戏设计中常用的一个对象,它接受舞台的统一管理,拥有一些公共**的事件,比如触摸,点击,但是同时还有自身的响应和属性。
  * 实现Disposable接口,为的是能及时释放内存。
  * @author ZHF
  *
  */
public  class  MyActor  extends  Actor  implements  Disposable{
     ArrayList<Texture> TexArray =  new  ArrayList<Texture>();
     ArrayList<TextureRegion> TexReArray =  new  ArrayList<TextureRegion>();
     Animation animation;   //动画
     TextureRegion[] walksFrame;
     float  stateTime;
     TextureRegion currentFrame;  // 当前帧
     AssetManager manager;
     public  MyActor(AssetManager manager) {
         this .manager = manager;
     }
     /**
      *
      * 这是一个系统自动调用的方法,描述这个演员Actor实例怎么绘制,draw()方法并不需要我们人工去调用,而是在把Actor加入舞台Stage中后,
      * 在ApplicationListener的render
      * ()函数中不停地调用stage.draw(),系统会自动调用已经加入stage中的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() {
         Texture tex;
         int  j;
         for  ( int  i =  1 ; i <  30 ; i++) {
             TexArray.add(manager.get( "animal/" +i+ ".png" , Texture. class ));
         }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
         for  ( int  i =  0 ; i < TexArray.size(); i++) {
             tex = TexArray.get(i);
             TextureRegion temTexRe =  new  TextureRegion(tex); //区域
             TexReArray.add(temTexRe);  //添加进去
         }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
         j = TexReArray.size();   //数组长度
         walksFrame =  new  TextureRegion[j];   //装区域的数组
         for ( int  i=  0 ; i < j; i++) {
             walksFrame[i] = TexReArray.get(i);   //将集合中的“区域”给了数组
         }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
         //设置的0.06s一帧
         animation =  new  Animation( 0 .06f, walksFrame);
     }
     @Override
     public  void  dispose() {
         for  ( int  i =  0 ; i <TexArray.size(); i++) {
             TexArray.get(i).dispose();
         }
     }
}

效果图:

分析:

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

   2.这里们还使用了AssetManager:一个资源异步加载和资源自动管理类,简单介绍一下:

  2.1什么时候需要资源预加载?

       (资源预加载的目的很明确,提升用户体验。当然就开发者而言,比较好的预加载实现方式还可以方便管理。)

   1.资源数量大:音乐、图片、视频什么的,如果你的游戏这些东西太多,推荐使用

   2.部分资源反复使用:有些资源会反复使用到,比如一些背景音乐,一些小图标


     2.2下面资源类型可以由AssetManager直接创建:

Pixmaps、Textures、BitmapFonts、TextureAtlases、TiledAtlases、TileMapRenderers 、  Music instances、 Sound instances、

    加载某个资源很简单:

1
2
manager.load( "data/testin.png" , Texture. class );
manager.load( "data/ testin.fnt" , BitmapFont. class );


 2.3. 在加载前,AssetManager需要知道加载什么类型的资源,这个功能通过资源加载器实现。有两个变量,同步资源加载器SynchronourAssetLoader和异步资源加载器AsynchronousAssetLoader。前者加载任何资源都在渲染进程中,后者加载资源在另外一个线程中。比如说,一个Texture需要一个Pixmap,然后加载OpenGL依赖于渲染线程。

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



  ok! 有点扯远了哈!Stage和Actor的简单使用就是这些,同时我们也应该关注AssetManager,这个资源管理类!


   源码下载:http://down.51cto.com/data/885211

     本文转自zhf651555765 51CTO博客,原文链接:http://blog.51cto.com/smallwoniu/1258251,如需转载请自行联系原作者


相关文章
|
3月前
|
Swift iOS开发 UED
揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【9月更文挑战第5天】本文通过具体案例介绍如何在iOS应用中使用Swift与UIKit实现自定义按钮动画,当用户点击按钮时,按钮将从圆形变为椭圆形并从蓝色渐变到绿色,释放后恢复原状。文中详细展示了代码实现过程及动画平滑过渡的技巧,帮助读者提升应用的视觉体验与特色。
69 11
|
4月前
|
Swift iOS开发 UED
【绝妙创意】颠覆你的视觉体验!揭秘一款iOS应用中令人惊叹的自定义动画效果,带你领略编程艺术的魅力所在!
【8月更文挑战第13天】本文通过一个具体案例,介绍如何使用Swift与UIKit在iOS应用中创建独特的按钮动画效果。当按钮被按下时,其形状从圆形变化为椭圆形,颜色则从蓝色渐变为绿色;释放后,动画反向恢复原状。利用UIView动画方法及弹簧动画效果,实现了平滑自然的过渡。通过调整参数,开发者可以进一步优化动画体验,增强应用的互动性和视觉吸引力。
59 7
|
3月前
|
图形学 开发者
【独家揭秘】Unity游戏开发秘籍:从基础到进阶,掌握材质与纹理的艺术,打造超现实游戏视效的全过程剖析——案例教你如何让每一面墙都会“说话”
【8月更文挑战第31天】Unity 是全球领先的跨平台游戏开发引擎,以其高效性能和丰富的工具集著称,尤其在提升游戏视觉效果方面表现突出。本文通过具体案例分析,介绍如何利用 Unity 中的材质与纹理技术打造逼真且具艺术感的游戏世界。材质定义物体表面属性,如颜色、光滑度等;纹理则用于模拟真实细节。结合使用两者可显著增强场景真实感。以 FPS 游戏为例,通过调整材质参数和编写脚本动态改变属性,可实现自然视觉效果。此外,Unity 还提供了多种高级技术和优化方法供开发者探索。
58 0
|
4月前
|
开发者 图形学 前端开发
绝招放送:彻底解锁Unity UI系统奥秘,五大步骤教你如何缔造令人惊叹的沉浸式游戏体验,从Canvas到动画,一步一个脚印走向大师级UI设计
【8月更文挑战第31天】随着游戏开发技术的进步,UI成为提升游戏体验的关键。本文探讨如何利用Unity的UI系统创建美观且功能丰富的界面,包括Canvas、UI元素及Event System的使用,并通过具体示例代码展示按钮点击事件及淡入淡出动画的实现过程,助力开发者打造沉浸式的游戏体验。
116 0
|
4月前
|
图形学 C# 开发者
Unity粒子系统全解析:从基础设置到高级编程技巧,教你轻松玩转绚丽多彩的视觉特效,打造震撼游戏画面的终极指南
【8月更文挑战第31天】粒子系统是Unity引擎的强大功能,可创建动态视觉效果,如火焰、爆炸等。本文介绍如何在Unity中使用粒子系统,并提供示例代码。首先创建粒子系统,然后调整Emission、Shape、Color over Lifetime等模块参数,实现所需效果。此外,还可通过C#脚本实现更复杂的粒子效果,增强游戏视觉冲击力和沉浸感。
266 0
|
7月前
|
算法 程序员 UED
探索编程之道:从功能实现到艺术创造
【2月更文挑战第18天】 在数字世界的构建中,编程已不仅仅是逻辑与算法的堆砌,它正逐步演变成一种创造性表达的手段。本文将探讨编程从基础的功能实现向高级的艺术创造的转变过程,分析编程者如何通过技术深入、创新思维和持续实践,提升其技艺至艺术境界。我们将审视几个关键要素——技术的深度理解、设计的美学融入以及代码的工艺精神,并讨论它们如何共同作用于编程实践中,以培养出能够编织数字世界之美的编程艺术家。
|
7月前
|
图形学
【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)
【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)
304 0
|
缓存 算法 API
《unity游戏优化》第六章读书笔记
《unity游戏优化》第六章读书笔记
103 0
|
Java 图形学
java游戏开发杂谈 - 游戏物体
java游戏开发杂谈 - 游戏物体现实生活中,有很多物体,每个物体的长相、行为都不同。 物体存在于不同的空间内,它只在这个空间内发生作用。 物体没用了,空间就把它剔除,不然既占地方,又需要花精力管理。
1211 0
|
图形学 异构计算 数据可视化