/******************************************************************************* * Copyright 2011 See AUTHORS file. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package com.badlogic.gdx.tests; import java.util.Comparator; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.tests.utils.GdxTest; import com.badlogic.gdx.utils.Array; /** Demonstrates how to do simple z-sorting of sprites * @author mzechner */ public class SortedSpriteTest extends GdxTest { /** Sprite based class that adds a z-coordinate for depth sorting. Note that allt he constructors were auto-generated in Eclipse * (alt + shift + s, c). * @author mzechner */ public class MySprite extends Sprite { public float z; public MySprite () { super(); } public MySprite (Sprite sprite) { super(sprite); } public MySprite (Texture texture, int srcX, int srcY, int srcWidth, int srcHeight) { super(texture, srcX, srcY, srcWidth, srcHeight); } public MySprite (Texture texture, int srcWidth, int srcHeight) { super(texture, srcWidth, srcHeight); } public MySprite (Texture texture) { super(texture); } public MySprite (TextureRegion region, int srcX, int srcY, int srcWidth, int srcHeight) { super(region, srcX, srcY, srcWidth, srcHeight); } public MySprite (TextureRegion region) { super(region); } } /** Comparator used for sorting, sorts in ascending order (biggset z to smallest z). * @author mzechner */ public class MySpriteComparator implements Comparator<MySprite> { @Override public int compare (MySprite sprite1, MySprite sprite2) { return (sprite2.z - sprite1.z) > 0 ? 1 : -1; } } /** spritebatch used for rendering **/ SpriteBatch batch; /** the texture used by the sprites **/ Texture texture; /** array of sprites **/ Array<MySprite> sprites = new Array<MySprite>(); /** a comparator, we keep it around so the GC shuts up **/ MySpriteComparator comparator = new MySpriteComparator(); @Override public void create () { // create the SpriteBatch batch = new SpriteBatch(); // load a texture, usually you dispose of this // eventually. texture = new Texture("data/badlogicsmall.jpg"); // create 100 sprites, tinted red, from dark to light. // red color component is also used as z-value so we // can see that the sorting works. for (int i = 0; i < 100; i++) { // create the sprite and set a random position MySprite sprite = new MySprite(texture); sprite.setPosition(MathUtils.random() * Gdx.graphics.getWidth(), MathUtils.random() * Gdx.graphics.getHeight()); // create a random z coordinate in the range 0-1 sprite.z = MathUtils.random(); // set the tinting color to the z coordinate as well // for visual inspection sprite.setColor(sprite.z, 0, 0, 1); // add the sprite to the array sprites.add(sprite); } } @Override public void render () { Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // sort the sprites (not necessary if we know // the are already sorted). sprites.sort(comparator); // draw the sprites batch.begin(); for (MySprite sprite : sprites) { sprite.draw(batch); } batch.end(); } @Override public void dispose () { batch.dispose(); texture.dispose(); } }