• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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