1 /******************************************************************************* 2 * Copyright 2011 See AUTHORS file. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 ******************************************************************************/ 16 17 package com.badlogic.gdx.tests; 18 19 import com.badlogic.gdx.Gdx; 20 import com.badlogic.gdx.InputProcessor; 21 import com.badlogic.gdx.graphics.Color; 22 import com.badlogic.gdx.graphics.GL20; 23 import com.badlogic.gdx.graphics.Texture; 24 import com.badlogic.gdx.graphics.Texture.TextureFilter; 25 import com.badlogic.gdx.graphics.g2d.BitmapFont; 26 import com.badlogic.gdx.graphics.g2d.TextureRegion; 27 import com.badlogic.gdx.graphics.glutils.ShapeRenderer; 28 import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType; 29 import com.badlogic.gdx.math.Vector2; 30 import com.badlogic.gdx.scenes.scene2d.Actor; 31 import com.badlogic.gdx.scenes.scene2d.Group; 32 import com.badlogic.gdx.scenes.scene2d.InputEvent; 33 import com.badlogic.gdx.scenes.scene2d.InputListener; 34 import com.badlogic.gdx.scenes.scene2d.Stage; 35 import com.badlogic.gdx.scenes.scene2d.Touchable; 36 import com.badlogic.gdx.scenes.scene2d.ui.Image; 37 import com.badlogic.gdx.scenes.scene2d.ui.Label; 38 import com.badlogic.gdx.tests.utils.GdxTest; 39 import com.badlogic.gdx.utils.Align; 40 import com.badlogic.gdx.utils.Array; 41 import com.badlogic.gdx.utils.Scaling; 42 import com.badlogic.gdx.utils.viewport.ScreenViewport; 43 44 public class StageTest extends GdxTest implements InputProcessor { 45 private static final int NUM_GROUPS = 4; 46 private static final int NUM_SPRITES = (int)Math.sqrt(150 / NUM_GROUPS); 47 private static final float SPACING = 5; 48 ShapeRenderer renderer; 49 Stage stage; 50 Stage ui; 51 Texture texture; 52 Texture uiTexture; 53 BitmapFont font; 54 55 boolean rotateSprites = false; 56 boolean scaleSprites = false; 57 float angle; 58 Array<Actor> sprites = new Array(); 59 float scale = 1; 60 float vScale = 1; 61 Label fps; 62 63 @Override create()64 public void create () { 65 texture = new Texture(Gdx.files.internal("data/badlogicsmall.jpg")); 66 texture.setFilter(TextureFilter.Linear, TextureFilter.Linear); 67 font = new BitmapFont(Gdx.files.internal("data/arial-15.fnt"), false); 68 69 stage = new Stage(new ScreenViewport()); 70 71 float loc = (NUM_SPRITES * (32 + SPACING) - SPACING) / 2; 72 for (int i = 0; i < NUM_GROUPS; i++) { 73 Group group = new Group(); 74 group.setX((float)Math.random() * (stage.getWidth() - NUM_SPRITES * (32 + SPACING))); 75 group.setY((float)Math.random() * (stage.getHeight() - NUM_SPRITES * (32 + SPACING))); 76 group.setOrigin(loc, loc); 77 78 fillGroup(group, texture); 79 stage.addActor(group); 80 } 81 82 uiTexture = new Texture(Gdx.files.internal("data/ui.png")); 83 uiTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear); 84 ui = new Stage(new ScreenViewport()); 85 86 Image blend = new Image(new TextureRegion(uiTexture, 0, 0, 64, 32)); 87 blend.setAlign(Align.center); 88 blend.setScaling(Scaling.none); 89 blend.addListener(new InputListener() { 90 public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { 91 if (stage.getBatch().isBlendingEnabled()) 92 stage.getBatch().disableBlending(); 93 else 94 stage.getBatch().enableBlending(); 95 return true; 96 } 97 }); 98 blend.setY(ui.getHeight() - 64); 99 100 Image rotate = new Image(new TextureRegion(uiTexture, 64, 0, 64, 32)); 101 rotate.setAlign(Align.center); 102 rotate.setScaling(Scaling.none); 103 rotate.addListener(new InputListener() { 104 public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { 105 rotateSprites = !rotateSprites; 106 return true; 107 } 108 }); 109 rotate.setPosition(64, blend.getY()); 110 111 Image scale = new Image(new TextureRegion(uiTexture, 64, 32, 64, 32)); 112 scale.setAlign(Align.center); 113 scale.setScaling(Scaling.none); 114 scale.addListener(new InputListener() { 115 public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) { 116 scaleSprites = !scaleSprites; 117 return true; 118 } 119 }); 120 scale.setPosition(128, blend.getY()); 121 122 { 123 Actor shapeActor = new Actor() { 124 public void drawDebug (ShapeRenderer shapes) { 125 shapes.set(ShapeType.Filled); 126 shapes.setColor(getColor()); 127 shapes.rect(getX(), getY(), getOriginX(), getOriginY(), getWidth(), getHeight(), getScaleX(), getScaleY(), 128 getRotation()); 129 } 130 }; 131 shapeActor.setBounds(0, 0, 100, 150); 132 shapeActor.setOrigin(50, 75); 133 shapeActor.debug(); 134 sprites.add(shapeActor); 135 136 Group shapeGroup = new Group(); 137 shapeGroup.setBounds(300, 300, 300, 300); 138 shapeGroup.setOrigin(50, 75); 139 shapeGroup.setTouchable(Touchable.childrenOnly); 140 shapeGroup.addActor(shapeActor); 141 stage.addActor(shapeGroup); 142 } 143 144 ui.addActor(blend); 145 ui.addActor(rotate); 146 ui.addActor(scale); 147 148 fps = new Label("fps: 0", new Label.LabelStyle(font, Color.WHITE)); 149 fps.setPosition(10, 30); 150 fps.setColor(0, 1, 0, 1); 151 ui.addActor(fps); 152 153 renderer = new ShapeRenderer(); 154 Gdx.input.setInputProcessor(this); 155 } 156 fillGroup(Group group, Texture texture)157 private void fillGroup (Group group, Texture texture) { 158 float advance = 32 + SPACING; 159 for (int y = 0; y < NUM_SPRITES * advance; y += advance) 160 for (int x = 0; x < NUM_SPRITES * advance; x += advance) { 161 Image img = new Image(new TextureRegion(texture)); 162 img.setAlign(Align.center); 163 img.setScaling(Scaling.none); 164 img.setBounds(x, y, 32, 32); 165 img.setOrigin(16, 16); 166 group.addActor(img); 167 sprites.add(img); 168 } 169 } 170 171 private final Vector2 stageCoords = new Vector2(); 172 173 @Override render()174 public void render () { 175 Gdx.gl.glViewport(0, 0, Gdx.graphics.getBackBufferWidth(), Gdx.graphics.getBackBufferHeight()); 176 Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1); 177 Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 178 179 if (Gdx.input.isTouched()) { 180 stage.screenToStageCoordinates(stageCoords.set(Gdx.input.getX(), Gdx.input.getY())); 181 Actor actor = stage.hit(stageCoords.x, stageCoords.y, true); 182 if (actor != null) 183 actor.setColor((float)Math.random(), (float)Math.random(), (float)Math.random(), 0.5f + 0.5f * (float)Math.random()); 184 } 185 186 Array<Actor> actors = stage.getActors(); 187 int len = actors.size; 188 if (rotateSprites) { 189 for (int i = 0; i < len; i++) 190 actors.get(i).rotateBy(Gdx.graphics.getDeltaTime() * 10); 191 } 192 193 scale += vScale * Gdx.graphics.getDeltaTime(); 194 if (scale > 1) { 195 scale = 1; 196 vScale = -vScale; 197 } 198 if (scale < 0.5f) { 199 scale = 0.5f; 200 vScale = -vScale; 201 } 202 203 len = sprites.size; 204 for (int i = 0; i < len; i++) { 205 Actor sprite = sprites.get(i); 206 if (rotateSprites) 207 sprite.rotateBy(-40 * Gdx.graphics.getDeltaTime()); 208 else 209 sprite.setRotation(0); 210 211 if (scaleSprites) { 212 sprite.setScale(scale); 213 } else { 214 sprite.setScale(1); 215 } 216 } 217 218 stage.draw(); 219 220 renderer.begin(ShapeType.Point); 221 renderer.setColor(1, 0, 0, 1); 222 len = actors.size; 223 for (int i = 0; i < len; i++) { 224 Group group = (Group)actors.get(i); 225 renderer.point(group.getX() + group.getOriginX(), group.getY() + group.getOriginY(), 0); 226 } 227 renderer.end(); 228 229 fps.setText("fps: " + Gdx.graphics.getFramesPerSecond() + ", actors " + sprites.size + ", groups " + sprites.size); 230 ui.draw(); 231 } 232 233 @Override touchDown(int x, int y, int pointer, int button)234 public boolean touchDown (int x, int y, int pointer, int button) { 235 return ui.touchDown(x, y, pointer, button); 236 } 237 resize(int width, int height)238 public void resize (int width, int height) { 239 ui.getViewport().update(width, height, true); 240 stage.getViewport().update(width, height, true); 241 } 242 243 @Override dispose()244 public void dispose () { 245 ui.dispose(); 246 renderer.dispose(); 247 texture.dispose(); 248 uiTexture.dispose(); 249 font.dispose(); 250 } 251 } 252