成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android游戲引擎libgdx使用教程5:常用UI類與舞臺(tái)

移動(dòng)開(kāi)發(fā) Android
像按鈕、下拉框、列表、標(biāo)簽、圖片、復(fù)選框、編輯框、分割面板、滑動(dòng)面板、滑動(dòng)條等都是比較常用的UI類,它們都屬于Actor,可以很方便的納入到舞臺(tái)的管理中,而且都包含在com.badlogic.gdx.scenes.scene2d.ui包中。

像按鈕、下拉框、列表、標(biāo)簽、圖片、復(fù)選框、編輯框、分割面板、滑動(dòng)面板、滑動(dòng)條等都是比較常用的UI類,它們都屬于Actor,可以很方便的納入到舞臺(tái)的管理中,而且都包含在com.badlogic.gdx.scenes.scene2d.ui包中,

其實(shí)仔細(xì)看看UI類的實(shí)現(xiàn)代碼不難發(fā)現(xiàn)其實(shí)它們都是大部分繼承自Widget或者Table,如果需要自定義UI可以繼承以上兩個(gè)類(它們繼承自Actor),這里要說(shuō)明一下libgdx的布局部分使用了TWL,有興趣的朋友可以去看看。

在介紹每個(gè)控件之前我們先來(lái)看一下NinePatch,這是最近的一個(gè)比較重大的更新。

何為NinePatch?其實(shí)android原生即有NinePatch類,常在按鈕中使用。

Android游戲引擎libgdx使用教程5:常用UI類與舞臺(tái)

如圖,將圖片分成九份。中間部分可以根據(jù)需要擴(kuò)大,使按鈕的大小內(nèi)容變動(dòng)不受圖片的限制。

而在libgdx的NinePatch其實(shí)就是九個(gè)TextureRegion對(duì)象。

常用的實(shí)例化方法有兩個(gè):

public NinePatch (Texture texture, int left, int right, int top, int bottom)

public NinePatch (TextureRegion region, int left, int right, int top, int bottom)

關(guān)于其中的四個(gè)int型參數(shù)如何取值我們可以參考一下源碼:

  1. public NinePatch (TextureRegion region, int left, int right, int top, int bottom) {     
  2. int middleWidth = region.getRegionWidth() - left - right;     
  3. int middleHeight = region.getRegionHeight() - top - bottom;     
  4. this.patches = new TextureRegion[] {new TextureRegion(region, 00, left, top),     
  5. new TextureRegion(region, left, 0, middleWidth, top), new TextureRegion(region, left + middleWidth, 0, right, top),     
  6. new TextureRegion(region, 0, top, left, middleHeight), new TextureRegion(region, left, top, middleWidth, middleHeight),     
  7. new TextureRegion(region, left + middleWidth, top, right, middleHeight),     
  8. new TextureRegion(region, 0, top + middleHeight, left, bottom),     
  9. new TextureRegion(region, left, top + middleHeight, middleWidth, bottom),     
  10. new TextureRegion(region, left + middleWidth, top + middleHeight, right, bottom)};     
  11. }   

先計(jì)算中間部分的寬度和高度。然后開(kāi)始切圖,首先取頂部的最左邊的那個(gè),即圖中編號(hào)1的那塊,然后去它右邊的,然后再右邊的。

取完最上邊的那行,然后取中間的那行,然后取最后一行的。

由上自下,由左自右。

而在繪制時(shí)又是如何處理的呢?看源碼:

  1. public void draw (SpriteBatch batch, float x, float y, float width, float height) {     
  2. float centerColumnX = x;     
  3. if (patches[BOTTOM_LEFT] != null)     
  4. centerColumnX += patches[BOTTOM_LEFT].getRegionWidth();     
  5. else if (patches[MIDDLE_LEFT] != null)     
  6. centerColumnX += patches[MIDDLE_LEFT].getRegionWidth();     
  7. else if (patches[TOP_LEFT] != null//     
  8. centerColumnX += patches[TOP_LEFT].getRegionWidth();     
  9. float rightColumnX = x + width;     
  10. if (patches[BOTTOM_RIGHT] != null)     
  11. rightColumnX -= patches[BOTTOM_RIGHT].getRegionWidth();     
  12. else if (patches[MIDDLE_RIGHT] != null)     
  13. rightColumnX += patches[MIDDLE_RIGHT].getRegionWidth();     
  14. else if (patches[TOP_RIGHT] != null//     
  15. rightColumnX += patches[TOP_RIGHT].getRegionWidth();     
  16. float middleRowY = y;     
  17. if (patches[TOP_LEFT] != null)     
  18. middleRowY += patches[TOP_LEFT].getRegionHeight();     
  19. else if (patches[TOP_CENTER] != null)     
  20. middleRowY += patches[TOP_CENTER].getRegionHeight();     
  21. else if (patches[TOP_RIGHT] != null//     
  22. middleRowY += patches[TOP_RIGHT].getRegionHeight();     
  23. float topRowY = y + height;     
  24. if (patches[TOP_LEFT] != null)     
  25. topRowY -= patches[TOP_LEFT].getRegionHeight();     
  26. else if (patches[TOP_CENTER] != null)     
  27. topRowY -= patches[TOP_CENTER].getRegionHeight();     
  28. else if (patches[TOP_RIGHT] != null//     
  29. topRowY -= patches[TOP_RIGHT].getRegionHeight();     
  30. // Bottom row     
  31. if (patches[BOTTOM_LEFT] != null) batch.draw(patches[BOTTOM_LEFT], x, y, centerColumnX - x, middleRowY - y);     
  32. if (patches[BOTTOM_CENTER] != null)     
  33. batch.draw(patches[BOTTOM_CENTER], centerColumnX, y, rightColumnX - centerColumnX, middleRowY - y);     
  34. if (patches[BOTTOM_RIGHT] != null)     
  35. batch.draw(patches[BOTTOM_RIGHT], rightColumnX, y, x + width - rightColumnX, middleRowY - y);     
  36. // Middle row     
  37. if (patches[MIDDLE_LEFT] != null) batch.draw(patches[MIDDLE_LEFT], x, middleRowY, centerColumnX - x, topRowY - middleRowY);     
  38. if (patches[MIDDLE_CENTER] != null)     
  39. batch.draw(patches[MIDDLE_CENTER], centerColumnX, middleRowY, rightColumnX - centerColumnX, topRowY - middleRowY);     
  40. if (patches[MIDDLE_RIGHT] != null)     
  41. batch.draw(patches[MIDDLE_RIGHT], rightColumnX, middleRowY, x + width - rightColumnX, topRowY - middleRowY);     
  42. // Top row     
  43. if (patches[TOP_LEFT] != null) batch.draw(patches[TOP_LEFT], x, topRowY, centerColumnX - x, y + height - topRowY);     
  44. if (patches[TOP_CENTER] != null)     
  45. batch.draw(patches[TOP_CENTER], centerColumnX, topRowY, rightColumnX - centerColumnX, y + height - topRowY);     
  46. if (patches[TOP_RIGHT] != null)     
  47. batch.draw(patches[TOP_RIGHT], rightColumnX, topRowY, x + width - rightColumnX, y + height - topRowY);     
  48. }   

先計(jì)算左右欄的寬度,在計(jì)算中間和頂部的高度。然后從下自上的繪制。說(shuō)實(shí)話我覺(jué)得這段代碼看著很好玩的。

現(xiàn)在來(lái)說(shuō)說(shuō)幾個(gè)常用的控件的使用吧。先構(gòu)建一個(gè)舞臺(tái)。

先來(lái)試試Label吧,label是有緩存的,所以替換顯示內(nèi)容不是用setText方法,而是使用setWrappedText方法。

代碼如下:

  1. package com.cnblogs.htynkn.listener;     
  2. import com.badlogic.gdx.ApplicationListener;     
  3. import com.badlogic.gdx.Gdx;     
  4. import com.badlogic.gdx.graphics.GL10;     
  5. import com.badlogic.gdx.graphics.g2d.BitmapFont;     
  6. import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;     
  7. import com.badlogic.gdx.scenes.scene2d.Stage;     
  8. import com.badlogic.gdx.scenes.scene2d.actors.Label;     
  9. public class FirstGame implements ApplicationListener {     
  10. private Stage stage;     
  11. Label label;     
  12. @Override     
  13. public void create() {     
  14. stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(),     
  15. true);     
  16. label = new Label("fpsLabel"new BitmapFont(Gdx.files.internal("cf.fnt"),Gdx.files.internal("cf.png"),false), "label1");     
  17. label.x=5;     
  18. label.y=Gdx.graphics.getHeight()-label.height-5;     
  19. stage.addActor(label);     
  20. Gdx.input.setInputProcessor(stage);     
  21. }     
  22. @Override     
  23. public void dispose() {     
  24. stage.dispose();     
  25. }     
  26. @Override     
  27. public void pause() {     
  28. // TODO Auto-generated method stub     
  29. }     
  30. @Override     
  31. public void render() {     
  32. Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);     
  33. label.setWrappedText("FPS: "+Gdx.graphics.getFramesPerSecond(),     
  34. HAlignment.CENTER);     
  35. stage.act(Gdx.graphics.getDeltaTime());     
  36. stage.draw();     
  37. }     
  38. @Override     
  39. public void resize(int width, int height) {     
  40. // TODO Auto-generated method stub     
  41. }     
  42. @Override     
  43. public void resume() {     
  44. // TODO Auto-generated method stub     
  45. }     
  46. }   

效果:

Android游戲引擎libgdx使用教程5:常用UI類與舞臺(tái)

然后再看看Button吧,實(shí)例化需要一個(gè)ButtonStyle,定義了按鈕三種狀態(tài)對(duì)應(yīng)的圖片樣式,按下和松開(kāi)時(shí)的X,Y偏移還有Button中文字繪制所需的BitmapFont和Color。

按鈕的三種狀態(tài)的圖片我就省了,只用一張圖片。

Android游戲引擎libgdx使用教程5:常用UI類與舞臺(tái)

修改代碼如下:

  1. package com.cnblogs.htynkn.listener;     
  2. import com.badlogic.gdx.ApplicationListener;     
  3. import com.badlogic.gdx.Gdx;     
  4. import com.badlogic.gdx.graphics.Color;     
  5. import com.badlogic.gdx.graphics.GL10;     
  6. import com.badlogic.gdx.graphics.Texture;     
  7. import com.badlogic.gdx.graphics.g2d.BitmapFont;     
  8. import com.badlogic.gdx.graphics.g2d.NinePatch;     
  9. import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;     
  10. import com.badlogic.gdx.scenes.scene2d.Stage;     
  11. import com.badlogic.gdx.scenes.scene2d.actors.Label;     
  12. import com.badlogic.gdx.scenes.scene2d.ui.Button;     
  13. import com.badlogic.gdx.scenes.scene2d.ui.Button.ButtonStyle;     
  14. public class FirstGame implements ApplicationListener {     
  15. private Stage stage;     
  16. Label label;     
  17. Texture texture;     
  18. Button button;     
  19. @Override     
  20. public void create() {     
  21. stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(),     
  22. true);     
  23. texture = new Texture(Gdx.files.internal("06.png"));     
  24. NinePatch n1 = new NinePatch(texture, 7799);     
  25. BitmapFont bitmapFont = new BitmapFont(Gdx.files.internal("cf.fnt"),     
  26. Gdx.files.internal("cf.png"), false);     
  27. label = new Label("fpsLabel", bitmapFont, "label1");     
  28. label.x = 5;     
  29. label.y = Gdx.graphics.getHeight() - label.height - 5;     
  30. stage.addActor(label);     
  31. button = new Button("button"new ButtonStyle(n1, n1, n1, 0f, 0f, 0f,     
  32. 0f, bitmapFont, new Color(1100.5f)), "button");     
  33. button.x=10;     
  34. button.y=10;     
  35. button.width=100f;     
  36. button.height=32f;     
  37. stage.addActor(button);     
  38. Gdx.input.setInputProcessor(stage);     
  39. }     
  40. @Override     
  41. public void dispose() {     
  42. stage.dispose();     
  43. }     
  44. @Override     
  45. public void pause() {     
  46. // TODO Auto-generated method stub     
  47. }     
  48. @Override     
  49. public void render() {     
  50. Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);     
  51. label.setWrappedText("FPS: " + Gdx.graphics.getFramesPerSecond(),     
  52. HAlignment.CENTER);     
  53. stage.act(Gdx.graphics.getDeltaTime());     
  54. stage.draw();     
  55. }     
  56. @Override     
  57. public void resize(int width, int height) {     
  58. // TODO Auto-generated method stub     
  59. }     
  60. @Override     
  61. public void resume() {     
  62. // TODO Auto-generated method stub     
  63. }     
  64. }   

效果:

Android游戲引擎libgdx使用教程5:常用UI類與舞臺(tái)

按鈕自然應(yīng)該有點(diǎn)擊事件,通過(guò)setClickListener來(lái)設(shè)置:

  1. button.setClickListener(new ClickListener() {     
  2. @Override     
  3. public void click(Actor actor) {     
  4. Gdx.app.log("Info""點(diǎn)擊事件觸發(fā)了");     
  5. }     
  6. });   

然后再看看CheckBox。CheckBox的樣式定義在CheckBoxStyle中,需要4個(gè)參數(shù),兩種狀態(tài)的各一張圖片,一個(gè)BitmapFont和Color。

這里我再添加一張圖片:

Android游戲引擎libgdx使用教程5:常用UI類與舞臺(tái)

原理差不多,直接貼代碼了。

  1. package com.cnblogs.htynkn.listener;     
  2. import android.graphics.Paint.Align;     
  3. import com.badlogic.gdx.ApplicationListener;     
  4. import com.badlogic.gdx.Gdx;     
  5. import com.badlogic.gdx.graphics.Color;     
  6. import com.badlogic.gdx.graphics.GL10;     
  7. import com.badlogic.gdx.graphics.Texture;     
  8. import com.badlogic.gdx.graphics.g2d.BitmapFont;     
  9. import com.badlogic.gdx.graphics.g2d.NinePatch;     
  10. import com.badlogic.gdx.graphics.g2d.TextureRegion;     
  11. import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;     
  12. import com.badlogic.gdx.scenes.scene2d.Actor;     
  13. import com.badlogic.gdx.scenes.scene2d.Stage;     
  14. import com.badlogic.gdx.scenes.scene2d.actors.Label;     
  15. import com.badlogic.gdx.scenes.scene2d.ui.Button;     
  16. import com.badlogic.gdx.scenes.scene2d.ui.CheckBox;     
  17. import com.badlogic.gdx.scenes.scene2d.ui.ClickListener;     
  18. import com.badlogic.gdx.scenes.scene2d.ui.Button.ButtonStyle;     
  19. import com.badlogic.gdx.scenes.scene2d.ui.CheckBox.CheckBoxStyle;     
  20. public class FirstGame implements ApplicationListener {     
  21. private Stage stage;     
  22. Label label;     
  23. Texture texture1;     
  24. Texture texture2;     
  25. CheckBox checkBox;     
  26. @Override     
  27. public void create() {     
  28. stage = new Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(),     
  29. true);     
  30. texture1 = new Texture(Gdx.files.internal("06.png"));     
  31. texture2 = new Texture(Gdx.files.internal("07.png"));     
  32. NinePatch n1 = new NinePatch(texture1, 7799);     
  33. BitmapFont bitmapFont = new BitmapFont(Gdx.files.internal("cf.fnt"),     
  34. Gdx.files.internal("cf.png"), false);     
  35. label = new Label("fpsLabel", bitmapFont, "label1");     
  36. label.x = 5;     
  37. label.y = Gdx.graphics.getHeight() - label.height - 5;     
  38. CheckBoxStyle style = new CheckBoxStyle(new TextureRegion(texture1),     
  39. new TextureRegion(texture2), bitmapFont, new Color(111,     
  40. 0.5f));     
  41. checkBox = new CheckBox("checkbox", style, "checkbox");     
  42. checkBox.x = 100;     
  43. checkBox.y = 100;     
  44. checkBox.width = 158f;     
  45. checkBox.height = 32f;     
  46. checkBox.setText("Yes");     
  47. checkBox.setClickListener(new ClickListener() {     
  48. @Override     
  49. public void click(Actor actor) {     
  50. if (checkBox.isChecked) {     
  51. checkBox.setText("Yes");     
  52. else {     
  53. checkBox.setText("NO");     
  54. }     
  55. }     
  56. });     
  57. stage.addActor(checkBox);     
  58. stage.addActor(label);     
  59. Gdx.input.setInputProcessor(stage);     
  60. }     
  61. @Override     
  62. public void dispose() {     
  63. stage.dispose();     
  64. }     
  65. @Override     
  66. public void pause() {     
  67. // TODO Auto-generated method stub     
  68. }     
  69. @Override     
  70. public void render() {     
  71. Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);     
  72. label.setWrappedText("FPS: " + Gdx.graphics.getFramesPerSecond(),     
  73. HAlignment.CENTER);     
  74. stage.act(Gdx.graphics.getDeltaTime());     
  75. stage.draw();     
  76. }     
  77. @Override     
  78. public void resize(int width, int height) {     
  79. // TODO Auto-generated method stub     
  80. }     
  81. @Override     
  82. public void resume() {     
  83. // TODO Auto-generated method stub     
  84. }     
  85. }   

效果:

Android游戲引擎libgdx使用教程5:常用UI類與舞臺(tái)

Android游戲引擎libgdx使用教程5:常用UI類與舞臺(tái)

其他的UI大致用法差不多,顯示的樣式在對(duì)應(yīng)的Style或者Skin中定義。但是要注意有些UI類需要手動(dòng)設(shè)置width和height,不然有些顯示會(huì)很奇怪的。

最后說(shuō)一下Slider的用法

SliderStyle需要一個(gè)NinePath和Texture,我最初沒(méi)有想通為什么不是兩個(gè)NinePath,仔細(xì)看一下源碼才了解到,NinePath是作為背景,而Texture那個(gè)是中間的那個(gè)滑動(dòng)的方塊。

關(guān)于用配置文件設(shè)置Style的問(wèn)題,google code的wiki上似乎沒(méi)有寫(xiě),但是在libgdx的論壇里面有,比如:

  1. somePatch1: [    
  2. { height: 13, width: 9, x: 761, y: 78 },    
  3. { height: 13, width: 1, x: 770, y: 78 },    
  4. { height: 13, width: 9, x: 771, y: 78 },    
  5. { height: 1, width: 9, x: 761, y: 91 },    
  6. { height: 1, width: 1, x: 770, y: 91 },    
  7. { height: 1, width: 9, x: 771, y: 91 },    
  8. { height: 13, width: 9, x: 761, y: 92 },    
  9. { height: 13, width: 1, x: 770, y: 92 },    
  10. { height: 13, width: 9, x: 771, y: 92 }    
  11. ]   

或者

  1. somePatch2: [    
  2. { height: 13, width: 9, x: 761, y: 78 },    
  3. ]  
責(zé)任編輯:閆佳明 來(lái)源: jizhuomi
相關(guān)推薦

2013-12-06 10:31:14

Android游戲引擎libgdx教程

2013-12-04 16:28:29

Android游戲引擎libgdx教程

2013-12-04 13:30:45

Android游戲引擎libgdx教程

2013-12-04 17:27:10

Android游戲引擎libgdx教程

2013-12-06 09:59:53

Android游戲引擎libgdx教程

2013-12-06 10:35:28

Android游戲引擎libgdx教程

2013-12-04 16:21:02

Android游戲引擎libgdx教程

2013-12-06 10:12:49

Android游戲引擎libgdx教程

2013-12-06 10:22:42

Android游戲引擎libgdx教程

2013-12-04 16:07:27

Android游戲引擎libgdx教程

2011-07-18 11:39:58

iPhone 游戲 引擎

2011-07-18 10:53:09

2011-07-18 11:07:12

iPhone 游戲 引擎

2011-07-18 12:29:10

2011-07-18 11:23:29

iPhone 游戲 動(dòng)畫(huà)

2014-06-03 09:35:19

Javalibgdx

2015-07-08 16:38:10

Cocos游戲引擎

2014-07-15 10:34:14

Android游戲引擎

2012-03-06 10:56:32

HTML 5

2016-04-18 16:20:55

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日本人爽p大片免费看 | 亚洲色图综合 | 亚洲综合五月天婷婷 | 亚洲永久 | 成人综合一区二区 | 久久专区 | 玖玖玖在线观看 | 国产精品久久久久久网站 | 国产剧情一区 | 亚洲综合小视频 | 日韩精品一区二区三区在线播放 | 少妇一级淫片aaaaaaaaa | 天天干天天爱天天爽 | 精品国产一区二区三区久久久四川 | 成人在线免费av | 一区二区精品 | 日本不卡免费新一二三区 | 色欧美片视频在线观看 | 99re国产视频 | 日韩免费福利视频 | 91视频导航 | 精品91视频 | 国产乱码精品一区二区三区中文 | 久久久久久久久淑女av国产精品 | av在线免费网站 | 免费黄色片在线观看 | 日韩在线一区二区三区 | 国产激情一区二区三区 | 亚洲视频区 | 国产一区二 | 日日夜夜精品视频 | 特级a欧美做爰片毛片 | 欧美在线一区二区三区 | 久久久久久亚洲国产精品 | 久久久久久久国产精品 | 日韩欧美成人精品 | 一区二区免费在线视频 | 午夜寂寞福利视频 | 91视频免费视频 | 中文字幕亚洲一区二区va在线 | 在线日韩福利 |