游戲屏幕最常見的就是一個變化較少的背景加上一系列和用戶交互的角色和部件。為了方便管理你還可以為背景建個Group方便管理。
但是有時候寫的時候沒有想到這個問題,或者是背景不是單純的一個圖片什麼的,背景和角色還有一些混合邏輯分布在兩個Stage裡。我重寫太麻煩,想想反正都是SpritBatch繪制出來的,用雙舞台大不了多個攝像頭。馬上試試還真行。
先看看Stage的draw方法:
Java代碼
- /** Renders the stage */
- public void draw () {
- camera.update();
- if (!root.visible) return;
- batch.setProjectionMatrix(camera.combined);
- batch.begin();
- root.draw(batch, 1);
- batch.end();
- }
batch的話兩個舞台可以共用。用Stage(width, height, stretch, batch)實例化第二個舞台。
代碼如下:
Java代碼
- package com.cnblogs.htynkn.game;
-
- import com.badlogic.gdx.ApplicationListener;
- import com.badlogic.gdx.Gdx;
- import com.badlogic.gdx.InputProcessor;
- import com.badlogic.gdx.graphics.GL10;
- import com.badlogic.gdx.graphics.Texture;
- import com.badlogic.gdx.graphics.g2d.TextureRegion;
- import com.badlogic.gdx.scenes.scene2d.Stage;
- import com.badlogic.gdx.scenes.scene2d.ui.Image;
-
- public class JavaGame implements ApplicationListener {
-
- Stage stage1;
- Stage stage2;
- float width;
- float height;
-
- @Override
- public void create() {
- width = Gdx.graphics.getWidth();
- height = Gdx.graphics.getHeight();
- stage1 = new Stage(width, height, true);
- stage2 = new Stage(width, height, true,stage1.getSpriteBatch());
- Image image = new Image(new TextureRegion(new Texture(Gdx.files
- .internal("img/sky.jpg")), 50, 50, 480, 320));
- stage1.addActor(image);
- Image image2 = new Image(new TextureRegion(new Texture(Gdx.files
- .internal("img/baihu.png")), 217, 157));
- image2.x=(width-image2.width)/2;
- image2.y=(height-image2.height)/2;
- stage2.addActor(image2);
- }
-
- @Override
- public void dispose() {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void pause() {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void render() {
- Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
- stage1.act(Gdx.graphics.getDeltaTime());
- stage2.act(Gdx.graphics.getDeltaTime());
- stage1.draw();
- stage2.draw();
- }
-
- @Override
- public void resize(int width, int height) {
- // TODO Auto-generated method stub
-
- }
-
- @Override
- public void resume() {
- // TODO Auto-generated method stub
-
- }
- }
效果:
如果你對於效率追求比較極致,可以考慮對於SpritBatch的緩沖數進行修改。
還有一個需要注意,背景舞台應該先繪制,其他部件後繪制,不然效果就是下圖:
關於舞台的輸入控制,不能簡單的使用:
Java代碼
- Gdx.input.setInputProcessor(stage1);
- Gdx.input.setInputProcessor(stage2);
應該這樣做:
Java代碼
- InputMultiplexer inputMultiplexer=new InputMultiplexer();
- inputMultiplexer.addProcessor(stage1);
- inputMultiplexer.addProcessor(stage2);