package propra2012.gruppe33.bomberman.graphics; import java.awt.Color; import java.awt.Font; import java.awt.Transparency; import java.awt.image.BufferedImage; import java.io.File; import propra2012.gruppe33.bomberman.ServerApp; import com.indyforge.foxnet.rmi.InvokerManager; import com.indyforge.foxnet.rmi.pattern.change.Session; import com.indyforge.foxnet.rmi.util.Future; import com.indyforge.foxnet.rmi.util.FutureCallback; import com.indyforge.twod.engine.graphics.ImageDesc; import com.indyforge.twod.engine.graphics.rendering.scenegraph.GraphicsEntity; import com.indyforge.twod.engine.graphics.rendering.scenegraph.RenderedImage; import com.indyforge.twod.engine.graphics.rendering.scenegraph.Scene; import com.indyforge.twod.engine.graphics.rendering.scenegraph.SceneProcessor; import com.indyforge.twod.engine.graphics.rendering.scenegraph.SceneProcessor.NetworkMode; import com.indyforge.twod.engine.graphics.rendering.scenegraph.Text.Alignment; import com.indyforge.twod.engine.graphics.rendering.scenegraph.gui.Button; import com.indyforge.twod.engine.graphics.rendering.scenegraph.gui.Label; import com.indyforge.twod.engine.graphics.rendering.scenegraph.gui.MenuButton; import com.indyforge.twod.engine.graphics.rendering.scenegraph.gui.TextField; import com.indyforge.twod.engine.resources.Resource; import com.indyforge.twod.engine.resources.TransientSystemFontResource; import com.indyforge.twod.engine.resources.assets.Asset; import com.indyforge.twod.engine.resources.assets.AssetManager; import com.indyforge.twod.engine.sound.SoundManager; import com.indyforge.twod.engine.util.task.Task; public class Gui { public static Scene createGUI(final SceneProcessor processor) throws Exception { SoundManager.closeCurrentSounds(); final Scene scene = new Scene(new AssetManager(new File( "res/default.zip")), 1024, 1024); scene.soundManager().putSound("back", "assets/sounds/menu2.wav"); scene.soundManager().playSound("back", 0.4f, false); scene.scale(scene.sizeAsVector()); // Bis hierhin ist ja alles Standard.... Asset<BufferedImage> selectedA = scene.assetManager().loadImage( "assets/images/gui/progui/button_selected.png", true); Asset<BufferedImage> deselectedA = scene.assetManager().loadImage( "assets/images/gui/progui/button.png", true); Asset<BufferedImage> selectedB = scene.assetManager().loadImage( "assets/images/gui/progui/button_2_selected.png", true); Asset<BufferedImage> deselectedB = scene.assetManager().loadImage( "assets/images/gui/progui/button_2.png", true); Asset<BufferedImage> backImage = scene.assetManager().loadImage( "assets/images/gui/progui/back.jpg", true); RenderedImage background = new RenderedImage(backImage); scene.attach(background); final Resource<Font> font = new TransientSystemFontResource( "Sans Serif", Font.BOLD, 48); final Resource<Font> tinyFont = new TransientSystemFontResource( "Sans Serif", Font.BOLD, 32); /* * Used to initialize! */ ImageDesc desc1 = new ImageDesc().width(400).height(96) .transparency(Transparency.TRANSLUCENT); ImageDesc desc2 = new ImageDesc().width(256).height(96) .transparency(Transparency.TRANSLUCENT); ImageDesc desc3 = new ImageDesc().width(96).height(96) .transparency(Transparency.TRANSLUCENT); /* * MAIN */ Button spB = new MenuButton(selectedA, deselectedA, desc2, tinyFont, "SINGLEPLAYER", true); Button mpB = new MenuButton(selectedA, deselectedA, desc2, tinyFont, "MULTIPLAYER", true); Button optB = new MenuButton(selectedA, deselectedA, desc2, font, "OPTIONS", true); Button quitB = new Button(selectedA, deselectedA, desc2, font, "QUIT") { /** * */ private static final long serialVersionUID = 1L; /* * (non-Javadoc) * * @see * com.indyforge.twod.engine.graphics.rendering.scenegraph.gui.Button * #onButtonPressed() */ @Override protected void onButtonPressed() { super.onButtonPressed(); System.exit(0); } }; /* * SINGLEPLAYER */ final TextField epTf = new TextField(desc3, tinyFont); epTf.background().imageResource(deselectedA); epTf.text().alignment(Alignment.Center).textColor(Color.WHITE); final TextField botSTf = new TextField(desc3, tinyFont); botSTf.background().imageResource(deselectedA); botSTf.text().alignment(Alignment.Center).textColor(Color.WHITE); Label epL = new Label(desc2, tinyFont); epL.background().imageResource(deselectedA); epL.text().text("Enemys(1-3)"); Label botSTL = new Label(desc2, tinyFont); botSTL.background().imageResource(deselectedA); botSTL.text().text("Difficulty(1-3)"); Button backMainSPB = new MenuButton(selectedA, deselectedA, desc2, font, "Back", false); Button startB = new Button(selectedA, deselectedA, desc2, font, "Start") { /** * */ private static final long serialVersionUID = 1L; /* * (non-Javadoc) * * @see * com.indyforge.twod.engine.graphics.rendering.scenegraph.gui.Button * #onButtonPressed() */ @Override protected void onButtonPressed() { } }; /* * MULTIPLAYER */ final TextField ipTf = new TextField(desc1, font); ipTf.background().imageResource(deselectedA); ipTf.text().alignment(Alignment.Center).textColor(Color.WHITE); final TextField usernameTf = new TextField(desc1, font); usernameTf.background().imageResource(deselectedA); usernameTf.text().alignment(Alignment.Center).textColor(Color.WHITE); Button backMainMPB = new MenuButton(selectedB, deselectedB, desc2, font, "Back", false); Button connectB = new Button(selectedA, deselectedA, desc2, font, "Connect") { /** * */ private static final long serialVersionUID = 1L; /* * (non-Javadoc) * * @see * com.indyforge.twod.engine.graphics.rendering.scenegraph.gui.Button * #onButtonPressed() */ @Override protected void onButtonPressed() { super.onButtonPressed(); SoundManager.closeCurrentSounds(); // Connect the scene Session<SceneProcessor> session; try { processor.networkMode(NetworkMode.Client); session = processor.openClient(ipTf.text().text(), 1337) .linkClient(usernameTf.text().text()); // Get the invoker manager InvokerManager man = InvokerManager.of(session); man.closeFuture().add(new FutureCallback() { @Override public void completed(Future future) throws Exception { processor.taskQueue().tasks().offer(new Task() { /** * */ private static final long serialVersionUID = 1L; @Override public boolean update(float tpf) { processor.networkMode(NetworkMode.Offline); try { processor.root(createGUI(processor)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return true; } }); } }); Label cont = new Label(new ImageDesc().width(256) .height(64).transparency(Transparency.TRANSLUCENT), font); cont.text().text("Waiting..."); scene.detachAll(); scene.attach(cont); cont.position().set(0.5f, 0.5f); } catch (Exception e) { e.printStackTrace(); } } }; Label ipL = new Label(desc2, font); ipL.background().imageResource(deselectedA); ipL.text().text("Host/IP"); Label usernameL = new Label(desc2, font); usernameL.background().imageResource(deselectedA); usernameL.text().text("Username"); /* * HOST */ final TextField usernameHostTf = new TextField(desc1, font); usernameHostTf.background().imageResource(deselectedA); usernameHostTf.text().alignment(Alignment.Center) .textColor(Color.WHITE); final TextField playerSlotsTf = new TextField(desc1, font); playerSlotsTf.background().imageResource(deselectedA); playerSlotsTf.text().alignment(Alignment.Center).textColor(Color.WHITE); Button backHostMPB = new MenuButton(selectedB, deselectedB, desc2, font, "Back", false); Button hostStartB = new Button(selectedA, deselectedA, desc2, font, "Start") { /** * */ private static final long serialVersionUID = 1L; @Override protected void onButtonPressed() { super.onButtonPressed(); int count = Integer.parseInt(playerSlotsTf.text().text()); if (count < 1 || count > 4) { return; } SoundManager.closeCurrentSounds(); // HERE SERVER START!!! final ServerApp sa = new ServerApp(count); sa.start(); // Connect the scene Session<SceneProcessor> session; try { processor.networkMode(NetworkMode.Client); session = processor.openClient("localhost", 1337) .linkClient(usernameTf.text().text()); // Get the invoker manager InvokerManager man = InvokerManager.of(session); man.closeFuture().add(new FutureCallback() { @Override public void completed(Future future) throws Exception { processor.taskQueue().tasks().offer(new Task() { /** * */ private static final long serialVersionUID = 1L; @Override public boolean update(float tpf) { try { // SHUTDOWN THE SERVER sa.processor().shutdownRequest(true); } catch (Exception e) { e.printStackTrace(); } processor.networkMode(NetworkMode.Offline); try { processor.root(createGUI(processor)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return true; } }); } }); Label cont = new Label(new ImageDesc().width(256) .height(64).transparency(Transparency.TRANSLUCENT), font); cont.text().text("Waiting..."); scene.detachAll(); scene.attach(cont); cont.position().set(0.5f, 0.5f); } catch (Exception e) { e.printStackTrace(); } } }; Label nameL = new Label(desc2, font); nameL.background().imageResource(deselectedA); nameL.text().text("Username"); Label playerSlotL = new Label(desc2, font); playerSlotL.background().imageResource(deselectedA); playerSlotL.text().text("Player (1-4)"); /* * MULTIPLAYERSELECTION */ Button hostMainB = new MenuButton(selectedA, deselectedA, desc2, font, "Host", true); Button connectMainB = new MenuButton(selectedA, deselectedA, desc2, font, "Join", true); Button backMainB = new MenuButton(selectedB, deselectedB, desc2, font, "Back", false); /* * OPTIONS */ Button backMainOPTB = new MenuButton(selectedA, deselectedA, desc2, font, "Back", false); /* * MAIN SETTINGS */ spB.scale().set(0.3f, 0.3f); spB.position().set(0.2f, 0.1f); spB.container().attach(epTf, botSTf, epL, botSTL, startB, backMainSPB); spB.guiContainerVisible(false); spB.select(); mpB.scale().set(0.3f, 0.3f); mpB.position().set(0.4f, 0.3f); mpB.container().attach(connectMainB, hostMainB, backMainB); mpB.guiContainerVisible(false); optB.scale().set(0.3f, 0.3f); optB.position().set(0.6f, 0.5f); optB.container().attach(backMainOPTB); optB.guiContainerVisible(false); quitB.scale().set(0.3f, 0.3f); quitB.position().set(0.8f, 0.7f); /* * SINGLEPLAYER SETTINGS */ epTf.position().set(1f, 0.8f); epTf.scale().set(0.9f, 0.9f); botSTf.position().set(1f, 1.4f); botSTf.scale().set(0.9f, 0.9f); epL.position().set(0f, 0.8f); epL.scale().set(0.9f, 0.9f); botSTL.position().set(0f, 1.4f); botSTL.scale().set(0.9f, 0.9f); startB.position().set(1f, 2f); startB.scale().set(0.9f, 0.9f); backMainSPB.position().set(0f, 2f); backMainSPB.scale().set(0.9f, 0.9f); /* * MULTIPLAYER SETTINGS */ float offsetX = 0.4f; float offsetY = -0.3f; ipTf.position().set(0.1f + offsetX, 0.2f + offsetY); ipTf.scale().set(0.9f, 0.9f); ipL.position().set(-0.8f + offsetX, 0.2f + offsetY); ipL.scale().set(0.9f, 0.9f); connectB.position().set(-0.35f + offsetX, 0.8f + offsetY); connectB.scale().set(0.9f, 0.9f); usernameTf.position().set(0.1f + offsetX, -0.6f + offsetY); usernameTf.scale().set(0.9f, 0.9f); usernameL.position().set(-0.8f + offsetX, -0.6f + offsetY); usernameL.scale().set(0.9f, 0.9f); backMainMPB.position().set(0.9f + offsetX, 2.0f + offsetY); backMainMPB.scale().set(0.9f, 0.9f); backMainMPB.rotation(-0.2f); /* * MULTIPLAYERSELECTION SETTINGS */ hostMainB.position().set(1f, 1f); hostMainB.scale().set(0.9f, 0.9f); hostMainB.container().attach(usernameHostTf, playerSlotsTf, hostStartB, backHostMPB, nameL, playerSlotL); hostMainB.guiContainerVisible(false); backMainB.position().set(1.5f, 2f); backMainB.scale().set(0.9f, 0.9f); backMainB.rotation(-0.2f); connectMainB.position().set(-0.4f, 0.5f); connectMainB.scale().set(0.9f, 0.9f); connectMainB.container().attach(usernameTf, ipTf, connectB, backMainMPB, usernameL, ipL); connectMainB.guiContainerVisible(false); /* * HOST SETTINGS */ nameL.position().set(-2f, -1f); nameL.scale().set(0.9f, 0.9f); usernameHostTf.position().set(-1f, -1f); usernameHostTf.scale().set(0.9f, 0.9f); playerSlotL.position().set(-2f, -0.3f); playerSlotL.scale().set(0.9f, 0.9f); playerSlotsTf.position().set(-1f, -0.3f); playerSlotsTf.scale().set(0.9f, 0.9f); hostStartB.position().set(-0.35f, 0.8f); hostStartB.scale().set(0.9f, 0.9f); hostStartB.position().set(-1f, 0.5f); hostStartB.scale().set(0.9f, 0.9f); backHostMPB.position().set(0f, 1.15f); backHostMPB.scale().set(0.9f, 0.9f); backHostMPB.rotation(-0.2f); /* * OPTIONS SETTINGS */ backMainOPTB.scale().set(0.9f, 0.9f); backMainOPTB.position().set(0f, 0f); GraphicsEntity guiRoot = new GraphicsEntity(); guiRoot.attach(spB, mpB, optB, quitB); scene.attach(guiRoot); return scene; } /** * @param args */ public static void main(String[] args) throws Exception { if (args.length >= 1 && args[0].equals("-m")) { SoundManager.mute(true); } final SceneProcessor processor = new SceneProcessor( "Left 2 Bomb - Inglorious Bomberman EDITION", 800, 600); processor.onlyRenderWithFocus(false); processor.root(createGUI(processor)); while (!processor.isShutdownRequested()) { try { // Process the whole scene! processor.process(50); } catch (Exception e) { e.printStackTrace(); processor.root(createGUI(processor)); } } // Dispose the scene processor processor.dispose(); System.exit(0); } }