package com.tacoid.superflu.actors; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.GL10; import com.badlogic.gdx.graphics.GL11; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.Texture.TextureWrap; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.glutils.ImmediateModeRenderer10; import com.badlogic.gdx.scenes.scene2d.Actor; import com.tacoid.superflu.GameScreen; import com.tacoid.superflu.entities.Transfert; public class TransfertCreator extends Actor { /* Singleton Instance */ static TransfertCreator instance = null; ImmediateModeRenderer10 renderer; private float start_x = 0; private float start_y = 0; private float end_x = 0; private float end_y = 0; private boolean enabled = false; Texture arrow; float tex_offset = 0.0f; private float norm; private float ortho_x; private float ortho_y; private VilleActor dest_ville = null; private VilleActor start_ville = null; private static final float target_size = 30.0f; public static TransfertCreator getInstance() { if (null == instance) { instance = new TransfertCreator(); } return instance; } private TransfertCreator() { this.x = 0; this.y = 0; this.width = Gdx.graphics.getWidth(); this.height = Gdx.graphics.getHeight(); renderer = new ImmediateModeRenderer10(); arrow = new Texture(Gdx.files.internal("images/transfert_arrow.png")); } private void drawTarget() { if(dest_ville != null) { Gdx.gl11.glDisable(GL11.GL_TEXTURE_2D); Gdx.gl11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); renderer.begin(GL11.GL_LINE_LOOP); { renderer.vertex(dest_ville.x + target_size , dest_ville.y, 0); renderer.vertex(dest_ville.x, dest_ville.y + target_size , 0); renderer.vertex(dest_ville.x - target_size , dest_ville.y, 0); renderer.vertex(dest_ville.x, dest_ville.y- target_size , 0); } renderer.end(); Gdx.gl11.glEnable(GL10.GL_TEXTURE_2D); } } private void drawTransfertBar() { int l = 6; int rayon = 20; float x = start_x + rayon*(end_x-start_x)/norm; float y = start_y + rayon*(end_y-start_y)/norm; Gdx.gl11.glPushMatrix(); Gdx.gl11.glColor4f(1.0f, 1.0f, 1.0f, 1); Gdx.gl11.glLineWidth(3); Gdx.gl11.glEnable(GL11.GL_BLEND); Gdx.gl11.glEnable(GL11.GL_TEXTURE_2D); arrow.setWrap( TextureWrap.Repeat, TextureWrap.Repeat ); arrow.bind(); renderer.begin(GL11.GL_TRIANGLE_STRIP); { renderer.texCoord(0, -tex_offset); renderer.vertex( x-l*ortho_x, y-l*ortho_y,0); renderer.texCoord(0, norm/(l*2)-tex_offset); renderer.vertex( end_x-l*ortho_x, end_y-l*ortho_y, 0); renderer.texCoord(1, -tex_offset); renderer.vertex( x+l*ortho_x, y+l*ortho_y,0); renderer.texCoord(1,norm/(l*2)-tex_offset); renderer.vertex( end_x+l*ortho_x, end_y+l*ortho_y, 0); } renderer.end(); tex_offset += 0.1f; if(tex_offset >= 16.0f) tex_offset = 0.0f; Gdx.gl11.glEnable(GL10.GL_TEXTURE_2D); Gdx.gl11.glDisable(GL11.GL_BLEND); Gdx.gl11.glPopMatrix(); } @Override public void draw(SpriteBatch arg0, float arg1) { if(enabled) { drawTransfertBar(); drawTarget(); } } @Override public Actor hit(float arg0, float arg1) { return null; } public void enable(float x, float y) { enabled = true; start_x = x; start_y = y; end_x = x; end_y = y; start_ville = (VilleActor) GameScreen.getInstance().getGroupVilles().hit(start_x, start_y); System.out.println(start_ville.getVille()); } public void updateTarget(float x, float y) { end_x = x; end_y = y; norm = (float) Math.sqrt((end_x-start_x)*(end_x-start_x)+(end_y-start_y)*(end_y-start_y)); ortho_x = (end_y-start_y)/norm; ortho_y = -(end_x-start_x)/norm; /*XXX: Je compare des r�f�rences, c'est peut �tre pas top... */ if((VilleActor) GameScreen.getInstance().getGroupVilles().hit(end_x, end_y) != start_ville) { dest_ville = (VilleActor) GameScreen.getInstance().getGroupVilles().hit(end_x, end_y); } } public void disable() { if(start_ville != null && dest_ville != null) { GameScreen.getInstance().getGameLogic().addTransfert(new Transfert(start_ville.getVille(), dest_ville.getVille(), start_ville.getVille().getStockTraitements(), 0, GameScreen.getInstance().getGameLogic().getTime())); } start_ville = null; dest_ville = null; enabled = false; } }