/* * The MIT License (MIT) * * Copyright (c) 2014-2017 Sri Harsha Chilakapati * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package com.shc.silenceengine.tests; import com.shc.silenceengine.collision.CollisionTag; import com.shc.silenceengine.collision.broadphase.DynamicTree2D; import com.shc.silenceengine.collision.colliders.CollisionSystem2D; import com.shc.silenceengine.core.SilenceEngine; import com.shc.silenceengine.graphics.Color; import com.shc.silenceengine.graphics.IGraphicsDevice; import com.shc.silenceengine.graphics.SceneRenderSystem; import com.shc.silenceengine.graphics.Sprite; import com.shc.silenceengine.graphics.cameras.OrthoCam; import com.shc.silenceengine.graphics.opengl.GLContext; import com.shc.silenceengine.graphics.opengl.Texture; import com.shc.silenceengine.input.Keyboard; import com.shc.silenceengine.input.Touch; import com.shc.silenceengine.io.FilePath; import com.shc.silenceengine.math.geom2d.Rectangle; import com.shc.silenceengine.scene.Component; import com.shc.silenceengine.scene.Entity; import com.shc.silenceengine.scene.Scene; import com.shc.silenceengine.scene.components.BoundsRenderComponent2D; import com.shc.silenceengine.scene.components.CollisionComponent2D; import com.shc.silenceengine.scene.components.SpriteComponent; /** * @author Sri Harsha Chilakapati */ public class SpriteRendererTest extends SilenceTest { private static CollisionTag heroTag = new CollisionTag(); private static CollisionTag subHeroTag = new CollisionTag(); private static CollisionTag wallsTag = new CollisionTag(); private Scene scene; private Sprite sprite; private OrthoCam camera; @Override public void init() { IGraphicsDevice.Programs.dynamic.applyToRenderer(IGraphicsDevice.Renderers.dynamic); // Normal initialization camera = new OrthoCam(SilenceEngine.display.getWidth(), SilenceEngine.display.getHeight()); SilenceEngine.io.getImageReader().readImage(FilePath.getResourceFile("test_resources/test_texture.png"), image -> { sprite = new Sprite(Texture.fromImage(image).getSubTexture(0, 0, 1, 1, 48, 48)); image.dispose(); initTest(); }); } @Override public void update(float deltaTime) { if (Keyboard.isKeyTapped(Keyboard.KEY_ESCAPE)) SilenceEngine.display.close(); if (scene == null) return; scene.update(deltaTime); SilenceEngine.display.setTitle("UPS: " + SilenceEngine.gameLoop.getUPS() + " | FPS: " + SilenceEngine.gameLoop.getFPS() + " | RC: " + IGraphicsDevice.Data.renderCallsThisFrame + " | SpriteRendererTest"); } @Override public void render(float deltaTime) { if (scene == null) return; camera.apply(); scene.render(deltaTime); } @Override public void resized() { camera.initProjection(SilenceEngine.display.getWidth(), SilenceEngine.display.getHeight()); camera.apply(); GLContext.viewport(0, 0, SilenceEngine.display.getWidth(), SilenceEngine.display.getHeight()); } private void initTest() { if (SilenceEngine.display.getPlatform() != SilenceEngine.Platform.ANDROID) SilenceEngine.input.setSimulateTouch(true); Scene scene = new Scene(); CollisionSystem2D collider = new CollisionSystem2D(new DynamicTree2D()); collider.register(heroTag, wallsTag); collider.register(subHeroTag, wallsTag); scene.registerUpdateSystem(collider); scene.registerRenderSystem(new SceneRenderSystem()); Entity wall = new Entity(); wall.addComponent(new CollisionComponent2D(wallsTag, new Rectangle(48, 48).createPolygon())); wall.addComponent(new SpriteComponent(sprite)); wall.addComponent(new BoundsRenderComponent2D()); wall.transformComponent.setPosition(SilenceEngine.display.getWidth() / 2, SilenceEngine.display.getHeight() / 2); scene.addEntity(wall); for (int i = 0; i < SilenceEngine.display.getWidth(); i += 48) { wall = new Entity(); wall.addComponent(new CollisionComponent2D(wallsTag, new Rectangle(48, 48).createPolygon())); wall.addComponent(new SpriteComponent(sprite)); wall.addComponent(new BoundsRenderComponent2D()); wall.transformComponent.setPosition(i + 24, 24); Entity wall2 = new Entity(); wall2.addComponent(new CollisionComponent2D(wallsTag, new Rectangle(48, 48).createPolygon())); wall2.addComponent(new SpriteComponent(sprite)); wall2.addComponent(new BoundsRenderComponent2D()); wall2.transformComponent.setPosition(i + 24, SilenceEngine.display.getHeight() - 24); scene.addEntity(wall); scene.addEntity(wall2); } for (int i = 48; i < SilenceEngine.display.getHeight() - 48; i += 48) { wall = new Entity(); wall.addComponent(new CollisionComponent2D(wallsTag, new Rectangle(48, 48).createPolygon())); wall.addComponent(new SpriteComponent(sprite)); wall.addComponent(new BoundsRenderComponent2D()); wall.transformComponent.setPosition(24, i + 24); Entity wall2 = new Entity(); wall2.addComponent(new CollisionComponent2D(wallsTag, new Rectangle(48, 48).createPolygon())); wall2.addComponent(new SpriteComponent(sprite)); wall2.addComponent(new BoundsRenderComponent2D()); wall2.transformComponent.setPosition(SilenceEngine.display.getWidth() - 24, i + 24); scene.addEntity(wall); scene.addEntity(wall2); } scene.addEntity(new Hero(sprite, scene)); this.scene = scene; } private static class Hero extends Entity { private static SpriteComponent renderComponent; private static SpriteComponent subRenderComponent; private static Entity subHero; Hero(Sprite sprite, Scene scene) { transformComponent.setPosition(SilenceEngine.display.getWidth() / 2 - 24, SilenceEngine.display.getHeight() / 2 - 24); addComponent(new Behaviour()); addComponent(new CollisionComponent2D(heroTag, new Rectangle(48, 48).createPolygon(), this::onHeroCollision)); addComponent(renderComponent = new SpriteComponent(sprite)); addComponent(new BoundsRenderComponent2D()); subHero = new Entity(); subHero.transformComponent.setPosition(100, 30); subHero.addComponent(new CollisionComponent2D(subHeroTag, new Rectangle(48, 48).createPolygon(), this::onSubHeroCollision)); subHero.addComponent(subRenderComponent = new SpriteComponent(sprite)); subHero.addComponent(new BoundsRenderComponent2D()); subHero.transformComponent.setParent(transformComponent); scene.addEntity(subHero); } private void onHeroCollision(CollisionComponent2D other) { renderComponent.tint.set(Color.YELLOW_GREEN); } private void onSubHeroCollision(CollisionComponent2D other) { subRenderComponent.tint.set(Color.RED); } private static class Behaviour extends Component { @Override public void onUpdate(float deltaTime) { transformComponent.rotate(45 * deltaTime); if (Touch.isFingerDown(Touch.FINGER_0)) transformComponent.setPosition(Touch.getFingerPosition(Touch.FINGER_0)); subHero.transformComponent.rotate(45 * deltaTime); renderComponent.tint.set(Color.AQUA); subRenderComponent.tint.set(Color.GREEN); } } } }