libgdx Actor

直接上代码吧

 1 package com.mygdx.game;

 2 

 3 import com.badlogic.gdx.Gdx;

 4 import com.badlogic.gdx.graphics.g2d.Animation;

 5 import com.badlogic.gdx.graphics.g2d.Batch;

 6 import com.badlogic.gdx.graphics.g2d.TextureRegion;

 7 import com.badlogic.gdx.scenes.scene2d.Actor;

 8 import com.badlogic.gdx.scenes.scene2d.InputEvent;

 9 import com.badlogic.gdx.scenes.scene2d.InputListener;

10 

11 /**

12  * Created by HanHongmin on 14-7-20.

13  */

14 public class Plane extends Actor {

15     private Animation animation;

16     private float stateTime;

17 

18     public Plane(Animation animation){

19         this.animation = animation;

20         setBounds(getX(), getY(), animation.getKeyFrames()[0].getRegionWidth(), animation.getKeyFrames()[0].getRegionHeight());

21 

22         this.addListener(new InputListener(){

23             public boolean touchDown(InputEvent event, float x, float y, int pointer, int buttons){

24                 System.out.println("Touched" + getName());

25                 return true;

26             }

27         });

28     }

29 

30     public void draw(Batch batch, float alpha){

31         stateTime = stateTime+Gdx.graphics.getDeltaTime();

32 

33         TextureRegion toDraw = animation.getKeyFrame(stateTime);

34 

35         batch.draw(toDraw, getX(), getY(), getOriginX(), getOriginY(), getWidth(), getHeight(),

36                 getScaleX(), getScaleY(), getRotation());

37     }

38 

39 

40 }

 

 1 package com.mygdx.game;

 2 

 3 import com.badlogic.gdx.ApplicationListener;

 4 import com.badlogic.gdx.Gdx;

 5 import com.badlogic.gdx.Input;

 6 import com.badlogic.gdx.graphics.GL20;

 7 import com.badlogic.gdx.graphics.Texture;

 8 import com.badlogic.gdx.graphics.g2d.Animation;

 9 import com.badlogic.gdx.graphics.g2d.TextureRegion;

10 import com.badlogic.gdx.scenes.scene2d.*;

11 import com.badlogic.gdx.utils.Array;

12 

13 public class MyGdxGame implements ApplicationListener {

14     private Plane plane;

15     private Stage stage;

16     private Texture t1;

17     private Texture t2;

18     private Texture t3;

19 

20     private float moveSpeed = 200;

21 

22     @Override

23     public void create() {

24         stage = new Stage();

25 

26         t1 = new Texture("plane1.png");

27         t2 = new Texture("plane2.png");

28         t3 = new Texture("plane3.png");

29         Array<TextureRegion> frames = new Array(4);

30         frames.add(new TextureRegion(t1));

31         frames.add(new TextureRegion(t2));

32         frames.add(new TextureRegion(t3));

33         frames.add(new TextureRegion(t2));

34 

35         Animation animation = new Animation(0.05f,frames, Animation.PlayMode.LOOP);

36 

37         plane = new Plane(animation);

38 

39         plane.setCenterPosition(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2);

40         plane.setName("飞机1");

41 

42         stage.addActor(plane);

43 

44         Gdx.input.setInputProcessor(stage);

45     }

46 

47     @Override

48     public void dispose() {

49         t1.dispose();

50         t2.dispose();

51         t3.dispose();

52         stage.dispose();

53     }

54 

55     @Override

56     public void render () {

57         Gdx.gl.glClearColor(0, 0, 0, 1);

58         Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

59         float time = Gdx.graphics.getDeltaTime();

60         if(Gdx.input.isKeyPressed(Input.Keys.W)){

61             plane.setY(plane.getY()+moveSpeed*time);

62         }

63         if(Gdx.input.isKeyPressed(Input.Keys.A)){

64             if(plane.getScaleX()==1){

65                 plane.setScaleX(-1);

66                 plane.setX(plane.getX()+plane.getWidth());

67             }

68 

69             plane.setX(plane.getX()-moveSpeed*time);

70         }

71         if(Gdx.input.isKeyPressed(Input.Keys.S)){

72             plane.setY(plane.getY()-moveSpeed*time);

73         }

74         if(Gdx.input.isKeyPressed(Input.Keys.D)){

75             if(plane.getScaleX()==-1){

76                 plane.setScaleX(1);

77                 plane.setX(plane.getX()-plane.getWidth());

78             }

79 

80             plane.setX(plane.getX()+moveSpeed*time);

81         }

82 

83         stage.act(Gdx.graphics.getDeltaTime());

84         stage.draw();

85     }

86 

87     @Override

88     public void resize(int width, int height) {

89     }

90 

91     @Override

92     public void pause() {

93     }

94 

95     @Override

96     public void resume() {

97     }

98 }

 

三张图片资源如下:

 

 

//==============add 2014-07-22

代码控制图片翻转的地方总觉得不妥,用的方法不对。

2dx里面有个锚点可以控制,翻转旋转都是以锚点为基点的,libgdx里面要手动控制吗?怎么想怎么不对。

看看源码发现有个Origin属性,测试看看。

plane.setOrigin(plane.getWidth()/2,plane.getHeight()/2);

没有问题~·

最后加上了描框,方便测试以及调试碰撞检测等~~

全代码如下:

  1 package com.mygdx.game;

  2 

  3 import com.badlogic.gdx.ApplicationListener;

  4 import com.badlogic.gdx.Gdx;

  5 import com.badlogic.gdx.Input;

  6 import com.badlogic.gdx.graphics.Color;

  7 import com.badlogic.gdx.graphics.GL20;

  8 import com.badlogic.gdx.graphics.Texture;

  9 import com.badlogic.gdx.graphics.g2d.Animation;

 10 import com.badlogic.gdx.graphics.g2d.TextureRegion;

 11 import com.badlogic.gdx.graphics.glutils.ShapeRenderer;

 12 import com.badlogic.gdx.math.Rectangle;

 13 import com.badlogic.gdx.scenes.scene2d.*;

 14 import com.badlogic.gdx.utils.Array;

 15 

 16 public class MyGdxGame implements ApplicationListener {

 17     private Plane plane;

 18     private Stage stage;

 19     private Texture t1;

 20     private Texture t2;

 21     private Texture t3;

 22 

 23     private float moveSpeed = 200;

 24     ShapeRenderer debugRenderer;

 25 

 26     @Override

 27     public void create() {

 28         stage = new Stage();

 29 

 30         t1 = new Texture("plane1.png");

 31         t2 = new Texture("plane2.png");

 32         t3 = new Texture("plane3.png");

 33         Array<TextureRegion> frames = new Array(4);

 34         frames.add(new TextureRegion(t1));

 35         frames.add(new TextureRegion(t2));

 36         frames.add(new TextureRegion(t3));

 37         frames.add(new TextureRegion(t2));

 38 

 39         Animation animation = new Animation(0.05f,frames, Animation.PlayMode.LOOP);

 40 

 41         plane = new Plane(animation);

 42 

 43         plane.setCenterPosition(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2);

 44         //plane.setPosition(Gdx.graphics.getWidth()/2,Gdx.graphics.getHeight()/2);

 45         plane.setOrigin(plane.getWidth()/2,plane.getHeight()/2);

 46         plane.setName("飞机1");

 47 

 48         stage.addActor(plane);

 49 

 50         Gdx.input.setInputProcessor(stage);

 51 

 52         debugRenderer = new ShapeRenderer();

 53 

 54         debugRenderer.setProjectionMatrix(stage.getCamera().combined);

 55     }

 56 

 57     @Override

 58     public void dispose() {

 59         t1.dispose();

 60         t2.dispose();

 61         t3.dispose();

 62         stage.dispose();

 63     }

 64 

 65     @Override

 66     public void render () {

 67         Gdx.gl.glClearColor(0, 0, 0, 1);

 68         Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

 69         float time = Gdx.graphics.getDeltaTime();

 70         if(Gdx.input.isKeyPressed(Input.Keys.W)){

 71             plane.setY(plane.getY()+moveSpeed*time);

 72         }

 73         if(Gdx.input.isKeyPressed(Input.Keys.A)){

 74             //System.out.println(plane.getRotation());

 75             if(plane.getScaleX()==1){

 76                 plane.setScaleX(-1);

 77                 //plane.setX(plane.getX()+plane.getWidth());

 78             }

 79             //plane.setRotation(plane.getRotation()+1);

 80             plane.setX(plane.getX()-moveSpeed*time);

 81         }

 82         if(Gdx.input.isKeyPressed(Input.Keys.S)){

 83             plane.setY(plane.getY()-moveSpeed*time);

 84         }

 85         if(Gdx.input.isKeyPressed(Input.Keys.D)){

 86             if(plane.getScaleX()==-1){

 87                 plane.setScaleX(1);

 88                 //plane.setX(plane.getX()-plane.getWidth());

 89             }

 90 

 91             plane.setX(plane.getX()+moveSpeed*time);

 92         }

 93 

 94         stage.act(Gdx.graphics.getDeltaTime());

 95         stage.draw();

 96 

 97         drawDebug();

 98     }

 99 

100     private void drawDebug(){

101         debugRenderer.begin(ShapeRenderer.ShapeType.Line);

102 

103         Rectangle rect = new Rectangle(plane.getX(), plane.getY(), plane.getWidth(), plane.getHeight());

104         //float x1 = plane.getX() + rect.x;

105         //float y1 = plane.getY() + rect.y;

106         debugRenderer.setColor(new Color(0, 1, 0, 1));

107         debugRenderer.rect(rect.x, rect.y, rect.width, rect.height);

108         debugRenderer.end();

109     }

110 

111     @Override

112     public void resize(int width, int height) {

113     }

114 

115     @Override

116     public void pause() {

117     }

118 

119     @Override

120     public void resume() {

121     }

122 }

 

 

libgdx Actor

 

//================add 2014-07-23显示FPS

1. 在create函数中添加代码

1 Label.LabelStyle labelStyle = new Label.LabelStyle(new BitmapFont(), Color.WHITE); //创建一个Label样式

2 Label label = new Label("FPS:", labelStyle); //创建标签,显示的文字是FPS:

3 label.setName("fpsLabel"); //设置标签名称为fpsLabel

4 label.setY(0); //设置Y为0,即显示在最下面

5 label.setX(0); //设置X值,显示为最后一个字紧靠屏幕最右侧

6 stage.addActor(label); //将标签添加到舞台

2. 在render函数中设置当前FPS值

1 Label label = (Label) stage.getRoot().findActor("fpsLabel"); //获取名为fpsLabel的标签

2 label.setText("FPS:" + Gdx.graphics.getFramesPerSecond());

本例中已可以显示FPS。

通常来讲一个游戏一般有两个camera,一个用于显示游戏类的动画等,另一个用于显示UI。stage中默认是有一个camera的。

如果共同使用一个SpriteBatch:

1 sb.end(); 2 sb.setProjectionMatrix(uiCamera.combined);//往视角里画东西

3 sb.begin();

4 label.draw(sb,1);

5 sb.end();

用一个SpriteBatch,一个stage应该也是可以的。

你可能感兴趣的:(libgdx)