OSDN Git Service

[added] InputMultiplexer.
authornathan.sweet <nathan.sweet@6c4fd544-2939-11df-bb46-9574ba5d0bfa>
Wed, 3 Nov 2010 05:50:15 +0000 (05:50 +0000)
committernathan.sweet <nathan.sweet@6c4fd544-2939-11df-bb46-9574ba5d0bfa>
Wed, 3 Nov 2010 05:50:15 +0000 (05:50 +0000)
[changed] Game and Screen a little. Still need to make more use of them to be sure I'm happy.
[added] gdx-twl Layout class to make DialogLayout less verbose.
[added] TWl class to make using TWL much easier.

13 files changed:
backends/gdx-backend-android/src/com/badlogic/gdx/backends/android/AndroidTexture.java
extensions/twl/gdx-twl-tests/src/com/badlogic/gdx/twl/tests/ButtonTest.java
extensions/twl/gdx-twl-tests/src/com/badlogic/gdx/twl/tests/TextAreaTest.java
extensions/twl/gdx-twl/src/com/badlogic/gdx/twl/Layout.java [new file with mode: 0644]
extensions/twl/gdx-twl/src/com/badlogic/gdx/twl/TWL.java [moved from extensions/twl/gdx-twl/src/com/badlogic/gdx/twl/renderer/TwlInputProcessor.java with 60% similarity]
extensions/twl/gdx-twl/src/com/badlogic/gdx/twl/renderer/GdxCacheContext.java
extensions/twl/gdx-twl/src/com/badlogic/gdx/twl/renderer/GdxFont.java
extensions/twl/gdx-twl/src/com/badlogic/gdx/twl/renderer/GdxImage.java
extensions/twl/gdx-twl/src/com/badlogic/gdx/twl/renderer/GdxRenderer.java [moved from extensions/twl/gdx-twl/src/com/badlogic/gdx/twl/renderer/TwlRenderer.java with 89% similarity]
extensions/twl/gdx-twl/src/com/badlogic/gdx/twl/renderer/GdxTexture.java
gdx/src/com/badlogic/gdx/Game.java
gdx/src/com/badlogic/gdx/InputMultiplexer.java [new file with mode: 0644]
gdx/src/com/badlogic/gdx/Screen.java

index e39e76b..a25609b 100644 (file)
@@ -28,6 +28,7 @@ import com.badlogic.gdx.graphics.GL10;
 import com.badlogic.gdx.graphics.Pixmap;\r
 import com.badlogic.gdx.graphics.Texture;\r
 import com.badlogic.gdx.utils.GdxRuntimeException;\r
+import com.badlogic.gdx.utils.MathUtils;\r
 \r
 /**\r
  * An implementation of {@link Texture} for Android\r
@@ -140,10 +141,6 @@ final class AndroidTexture implements Texture {
                return (Bitmap)pixmap.getNativePixmap();\r
        }\r
 \r
-       private static boolean isPowerOfTwo (int value) {\r
-               return ((value != 0) && (value & (value - 1)) == 0);\r
-       }\r
-\r
        private void buildMipmap () {\r
                Bitmap obitmap = null;\r
                if (file != null)\r
@@ -157,7 +154,7 @@ final class AndroidTexture implements Texture {
                int width = bitmap.getWidth();\r
                Log.d("texture", "creating texture mipmaps: " + bitmap.getWidth() + ", " + bitmap.getHeight());\r
 \r
-               if (!isPowerOfTwo(bitmap.getWidth()) || !isPowerOfTwo(bitmap.getHeight()))\r
+               if (!MathUtils.isPowerOfTwo(bitmap.getWidth()) || !MathUtils.isPowerOfTwo(bitmap.getHeight()))\r
                        throw new GdxRuntimeException("Dimensions have to be a power of two");\r
 \r
                while (height >= 1 || width >= 1 && level < 4) {\r
index 7a103f9..6da2219 100644 (file)
@@ -2,54 +2,47 @@
 package com.badlogic.gdx.twl.tests;\r
 \r
 import com.badlogic.gdx.ApplicationListener;\r
-import com.badlogic.gdx.Gdx;\r
 import com.badlogic.gdx.Files.FileType;\r
+import com.badlogic.gdx.Gdx;\r
+import com.badlogic.gdx.InputMultiplexer;\r
+import com.badlogic.gdx.InputProcessor;\r
 import com.badlogic.gdx.graphics.GL10;\r
-import com.badlogic.gdx.twl.renderer.TwlInputProcessor;\r
-import com.badlogic.gdx.twl.renderer.TwlRenderer;\r
+import com.badlogic.gdx.twl.Layout;\r
+import com.badlogic.gdx.twl.TWL;\r
 \r
 import de.matthiasmann.twl.Button;\r
-import de.matthiasmann.twl.DialogLayout;\r
 import de.matthiasmann.twl.FPSCounter;\r
-import de.matthiasmann.twl.GUI;\r
 \r
-public class ButtonTest implements ApplicationListener {\r
-       GUI gui;\r
-       TwlInputProcessor guiInputListener;\r
-       private TwlRenderer twl;\r
+public class ButtonTest implements ApplicationListener, InputProcessor {\r
+       private TWL twl;\r
+       private InputMultiplexer input = new InputMultiplexer();\r
 \r
        @Override public void create () {\r
-               if (gui != null) return;\r
-\r
                Button button = new Button("Click Me");\r
                FPSCounter fpsCounter = new FPSCounter(4, 2);\r
 \r
-               DialogLayout layout = new DialogLayout();\r
-               layout.setTheme("");\r
-               layout.setHorizontalGroup(layout.createParallelGroup().addWidgets(button, fpsCounter));\r
-               layout.setVerticalGroup(layout.createSequentialGroup().addWidget(button).addGap(5).addWidget(fpsCounter).addGap(5));\r
+               Layout layout = new Layout();\r
+               layout.horizontal().sequence(0).parallel(button, fpsCounter).end().gap();\r
+               layout.vertical().sequence(0, button, 5, fpsCounter, 0);\r
 \r
-               twl = new TwlRenderer();\r
-               gui = new GUI(layout, twl, null);\r
-               twl.applyTheme(gui, "data/widgets.xml", FileType.Internal);\r
+               twl = new TWL("data/widgets.xml", FileType.Internal, layout);\r
 \r
-               guiInputListener = new TwlInputProcessor(gui);\r
+               input.addProcessor(twl);\r
+               input.addProcessor(this);\r
        }\r
 \r
        @Override public void resize (int width, int height) {\r
-               gui.setSize();\r
-               twl.setSize();\r
        }\r
 \r
        @Override public void render () {\r
                Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);\r
 \r
-               Gdx.input.processEvents(guiInputListener);\r
-               gui.update();\r
+               Gdx.input.processEvents(input);\r
+               twl.render();\r
        }\r
 \r
        @Override public void dispose () {\r
-               gui.destroy();\r
+               twl.dispose();\r
        }\r
 \r
        @Override public void pause () {\r
@@ -57,4 +50,29 @@ public class ButtonTest implements ApplicationListener {
 \r
        @Override public void resume () {\r
        }\r
+\r
+       public boolean keyDown (int keycode) {\r
+               return false;\r
+       }\r
+\r
+       public boolean keyUp (int keycode) {\r
+               return false;\r
+       }\r
+\r
+       public boolean keyTyped (char character) {\r
+               return false;\r
+       }\r
+\r
+       public boolean touchDown (int x, int y, int pointer) {\r
+               System.out.println("Not handled by TWL!");\r
+               return false;\r
+       }\r
+\r
+       public boolean touchUp (int x, int y, int pointer) {\r
+               return false;\r
+       }\r
+\r
+       public boolean touchDragged (int x, int y, int pointer) {\r
+               return false;\r
+       }\r
 }\r
index 4012329..df882ae 100644 (file)
@@ -2,32 +2,27 @@
 package com.badlogic.gdx.twl.tests;\r
 \r
 import com.badlogic.gdx.ApplicationListener;\r
-import com.badlogic.gdx.Gdx;\r
 import com.badlogic.gdx.Files.FileType;\r
+import com.badlogic.gdx.Gdx;\r
 import com.badlogic.gdx.graphics.GL10;\r
-import com.badlogic.gdx.twl.renderer.TwlInputProcessor;\r
-import com.badlogic.gdx.twl.renderer.TwlRenderer;\r
+import com.badlogic.gdx.twl.Layout;\r
+import com.badlogic.gdx.twl.TWL;\r
 \r
 import de.matthiasmann.twl.DialogLayout;\r
 import de.matthiasmann.twl.FPSCounter;\r
-import de.matthiasmann.twl.GUI;\r
 import de.matthiasmann.twl.ScrollPane;\r
 import de.matthiasmann.twl.TextArea;\r
 import de.matthiasmann.twl.Timer;\r
 import de.matthiasmann.twl.textarea.HTMLTextAreaModel;\r
 import de.matthiasmann.twl.textarea.Style;\r
 import de.matthiasmann.twl.textarea.StyleAttribute;\r
-import de.matthiasmann.twl.textarea.Value;\r
 import de.matthiasmann.twl.textarea.TextAreaModel.Element;\r
+import de.matthiasmann.twl.textarea.Value;\r
 \r
 public class TextAreaTest implements ApplicationListener {\r
-       GUI gui;\r
-       TwlRenderer twl;\r
-       TwlInputProcessor guiInputListener;\r
+       TWL twl;\r
 \r
        @Override public void create () {\r
-               if (gui != null) return;\r
-\r
                final HTMLTextAreaModel htmlText = new HTMLTextAreaModel();\r
                TextArea textArea = new TextArea(htmlText);\r
                htmlText\r
@@ -36,14 +31,11 @@ public class TextAreaTest implements ApplicationListener {
                scrollPane.setFixed(ScrollPane.Fixed.HORIZONTAL);\r
                FPSCounter fpsCounter = new FPSCounter(4, 2);\r
 \r
-               DialogLayout layout = new DialogLayout();\r
-               layout.setTheme("");\r
-               layout.setHorizontalGroup(layout.createParallelGroup().addWidgets(scrollPane, fpsCounter));\r
-               layout.setVerticalGroup(layout.createSequentialGroup().addWidget(scrollPane).addGap(5).addWidget(fpsCounter).addGap(5));\r
+               Layout layout = new Layout();\r
+               layout.horizontal().parallel(scrollPane, fpsCounter);\r
+               layout.vertical().sequence(scrollPane, 5, fpsCounter, 5);\r
 \r
-               twl = new TwlRenderer();\r
-               gui = new GUI(layout, twl, null);\r
-               twl.applyTheme(gui, "data/widgets.xml", FileType.Internal);\r
+               twl = new TWL("data/widgets.xml", FileType.Internal, layout);\r
 \r
                textArea.addCallback(new TextArea.Callback() {\r
                        Timer timer;\r
@@ -52,7 +44,7 @@ public class TextAreaTest implements ApplicationListener {
                        public void handleLinkClicked (String href) {\r
                                final Element element = htmlText.getElementById("badlogic");\r
                                if (timer == null) {\r
-                                       timer = gui.createTimer();\r
+                                       timer = twl.getGUI().createTimer();\r
                                        timer.setDelay(32);\r
                                        timer.setContinuous(true);\r
                                        timer.setCallback(new Runnable() {\r
@@ -73,23 +65,19 @@ public class TextAreaTest implements ApplicationListener {
                                speed = -speed;\r
                        }\r
                });\r
-\r
-               guiInputListener = new TwlInputProcessor(gui);\r
        }\r
 \r
        @Override public void resize (int width, int height) {\r
-               gui.setSize();\r
-               twl.setSize();\r
        }\r
 \r
        @Override public void render () {\r
                Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);\r
-               Gdx.input.processEvents(guiInputListener);\r
-               gui.update();\r
+               Gdx.input.processEvents(twl);\r
+               twl.render();\r
        }\r
 \r
        @Override public void dispose () {\r
-               gui.destroy();\r
+               twl.dispose();\r
        }\r
 \r
        @Override public void pause () {\r
diff --git a/extensions/twl/gdx-twl/src/com/badlogic/gdx/twl/Layout.java b/extensions/twl/gdx-twl/src/com/badlogic/gdx/twl/Layout.java
new file mode 100644 (file)
index 0000000..f77acee
--- /dev/null
@@ -0,0 +1,121 @@
+\r
+package com.badlogic.gdx.twl;\r
+\r
+import de.matthiasmann.twl.DialogLayout;\r
+import de.matthiasmann.twl.Widget;\r
+\r
+public class Layout extends DialogLayout {\r
+       public Layout () {\r
+               setTheme("");\r
+       }\r
+\r
+       public Direction horizontal () {\r
+               return new Direction(true);\r
+       }\r
+\r
+       public Direction vertical () {\r
+               return new Direction(false);\r
+       }\r
+\r
+       public class Direction {\r
+               private final boolean horizontal;\r
+\r
+               Direction (boolean horizontal) {\r
+                       this.horizontal = horizontal;\r
+               }\r
+\r
+               public Group sequence (Object... widgets) {\r
+                       DialogLayout.Group dialogGroup = createSequentialGroup();\r
+                       if (horizontal)\r
+                               setHorizontalGroup(dialogGroup);\r
+                       else\r
+                               setVerticalGroup(dialogGroup);\r
+                       return new Group(null, dialogGroup).add(widgets);\r
+               }\r
+\r
+               public Group parallel (Object... widgets) {\r
+                       DialogLayout.Group dialogGroup = createParallelGroup();\r
+                       if (horizontal)\r
+                               setHorizontalGroup(dialogGroup);\r
+                       else\r
+                               setVerticalGroup(dialogGroup);\r
+                       return new Group(null, dialogGroup).add(widgets);\r
+               }\r
+\r
+               public class Group {\r
+                       private final Group parent;\r
+                       private final DialogLayout.Group dialogGroup;\r
+\r
+                       Group (Group parent, DialogLayout.Group dialogGroup) {\r
+                               this.parent = parent;\r
+                               this.dialogGroup = dialogGroup;\r
+                       }\r
+\r
+                       public Group sequence (Object... widgets) {\r
+                               DialogLayout.Group dialogGroup = createSequentialGroup();\r
+                               this.dialogGroup.addGroup(dialogGroup);\r
+                               return new Group(this, dialogGroup).add(widgets);\r
+                       }\r
+\r
+                       public Group parallel (Object... widgets) {\r
+                               DialogLayout.Group dialogGroup = createParallelGroup();\r
+                               this.dialogGroup.addGroup(dialogGroup);\r
+                               return new Group(this, dialogGroup).add(widgets);\r
+                       }\r
+\r
+                       public Group add (Object... widgets) {\r
+                               for (int i = 0, n = widgets.length; i < n; i++) {\r
+                                       Object object = widgets[i];\r
+                                       if (object instanceof Integer) {\r
+                                               int size = (Integer)object;\r
+                                               if (size == 0)\r
+                                                       dialogGroup.addGap();\r
+                                               else\r
+                                                       dialogGroup.addGap(size);\r
+                                       } else\r
+                                               dialogGroup.addWidget((Widget)object);\r
+                               }\r
+                               return this;\r
+                       }\r
+\r
+                       public Group add (String gapName, Widget... widgets) {\r
+                               dialogGroup.addWidgetsWithGap(gapName, widgets);\r
+                               return this;\r
+                       }\r
+\r
+                       public Group gap () {\r
+                               dialogGroup.addGap();\r
+                               return this;\r
+                       }\r
+\r
+                       public Group gap (int size) {\r
+                               dialogGroup.addGap(size);\r
+                               return this;\r
+                       }\r
+\r
+                       public Group gap (int min, int pref, int max) {\r
+                               dialogGroup.addGap(min, pref, max);\r
+                               return this;\r
+                       }\r
+\r
+                       public Group gap (String name) {\r
+                               dialogGroup.addGap(name);\r
+                               return this;\r
+                       }\r
+\r
+                       public Group defaulGap () {\r
+                               dialogGroup.addDefaultGap();\r
+                               return this;\r
+                       }\r
+\r
+                       public Group minGap (int size) {\r
+                               dialogGroup.addMinGap(size);\r
+                               return this;\r
+                       }\r
+\r
+                       public Group end () {\r
+                               return parent;\r
+                       }\r
+               }\r
+       }\r
+}\r
@@ -1,20 +1,85 @@
 \r
-package com.badlogic.gdx.twl.renderer;\r
+package com.badlogic.gdx.twl;\r
 \r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.net.MalformedURLException;\r
+import java.net.URL;\r
+import java.net.URLConnection;\r
+import java.net.URLStreamHandler;\r
+\r
+import com.badlogic.gdx.Files.FileType;\r
+import com.badlogic.gdx.Gdx;\r
 import com.badlogic.gdx.Input;\r
 import com.badlogic.gdx.InputProcessor;\r
+import com.badlogic.gdx.files.FileHandle;\r
+import com.badlogic.gdx.twl.renderer.GdxRenderer;\r
+import com.badlogic.gdx.utils.GdxRuntimeException;\r
 \r
 import de.matthiasmann.twl.Event;\r
 import de.matthiasmann.twl.GUI;\r
+import de.matthiasmann.twl.Widget;\r
+import de.matthiasmann.twl.theme.ThemeManager;\r
 \r
-/**\r
- * @author Nathan Sweet <misc@n4te.com>\r
- */\r
-public class TwlInputProcessor implements InputProcessor {\r
+public class TWL implements InputProcessor {\r
+       private final GdxRenderer renderer = new GdxRenderer();\r
        private final GUI gui;\r
 \r
-       public TwlInputProcessor (GUI gui) {\r
-               this.gui = gui;\r
+       public TWL (String themeFile, FileType fileType, Widget widget) {\r
+               this(themeFile, fileType);\r
+               setWidget(widget);\r
+       }\r
+\r
+       public TWL (String themeFile, FileType fileType) {\r
+               Widget root = new Widget() {\r
+                       protected void layout () {\r
+                               layoutChildrenFullInnerArea();\r
+                       }\r
+               };\r
+               root.setTheme("");\r
+\r
+               gui = new GUI(root, renderer, null);\r
+               try {\r
+                       gui.applyTheme(ThemeManager.createThemeManager(getThemeURL(themeFile, fileType), renderer));\r
+               } catch (IOException ex) {\r
+                       throw new GdxRuntimeException("Error loading theme: " + themeFile + " (" + fileType + ")", ex);\r
+               }\r
+       }\r
+\r
+       public GdxRenderer getRenderer () {\r
+               return renderer;\r
+       }\r
+\r
+       public GUI getGUI () {\r
+               return gui;\r
+       }\r
+\r
+       public void setWidget (Widget widget) {\r
+               Widget root = gui.getRootPane();\r
+               root.removeAllChildren();\r
+               root.add(widget);\r
+       }\r
+\r
+       public void clear () {\r
+               gui.getRootPane().removeAllChildren();\r
+       }\r
+\r
+       public void render () {\r
+               GUI gui = this.gui;\r
+               int viewWidth = Gdx.graphics.getWidth();\r
+               int viewHeight = Gdx.graphics.getHeight();\r
+               if (renderer.getWidth() != viewWidth || renderer.getHeight() != viewHeight) {\r
+                       renderer.setSize(viewWidth, viewHeight);\r
+                       gui.setSize(viewWidth, viewHeight);\r
+               }\r
+               gui.updateTime();\r
+               gui.handleKeyRepeat();\r
+               gui.handleTooltips();\r
+               gui.updateTimers();\r
+               gui.invokeRunables();\r
+               gui.validateLayout();\r
+               gui.draw();\r
        }\r
 \r
        public boolean keyDown (int keycode) {\r
@@ -44,6 +109,11 @@ public class TwlInputProcessor implements InputProcessor {
                return gui.handleMouse(x, y, -1, true);\r
        }\r
 \r
+       public void dispose () {\r
+               gui.destroy();\r
+               renderer.dispose();\r
+       }\r
+\r
        static public int getTwlKeyCode (int gdxKeyCode) {\r
                if (gdxKeyCode == Input.Keys.KEYCODE_0) return Event.KEY_0;\r
                if (gdxKeyCode == Input.Keys.KEYCODE_1) return Event.KEY_1;\r
@@ -103,4 +173,28 @@ public class TwlInputProcessor implements InputProcessor {
                if (gdxKeyCode == Input.Keys.KEYCODE_TAB) return Event.KEY_TAB;\r
                return Event.KEY_NONE;\r
        }\r
+\r
+       static public URL getThemeURL (String themeFile, final FileType fileType) throws MalformedURLException {\r
+               File file = new File(themeFile);\r
+               final File themeRoot = file.getParentFile();\r
+               return new URL("gdx-twl", "local", 80, file.getName(), new URLStreamHandler() {\r
+                       protected URLConnection openConnection (URL url) throws IOException {\r
+                               final String path = new File(themeRoot, url.getPath()).getPath();\r
+                               final FileHandle fileHandle = Gdx.files.getFileHandle(path, fileType);\r
+                               return new URLConnection(url) {\r
+                                       public void connect () {\r
+                                       }\r
+\r
+                                       public Object getContent () {\r
+                                               return fileHandle;\r
+                                       }\r
+\r
+                                       public InputStream getInputStream () {\r
+                                               if (!path.endsWith(".xml")) return null; // Only theme files are loaded through the URL.\r
+                                               return fileHandle.readFile();\r
+                                       }\r
+                               };\r
+                       }\r
+               });\r
+       }\r
 }\r
index 5841f52..25e8a14 100644 (file)
@@ -19,12 +19,12 @@ import de.matthiasmann.twl.renderer.CacheContext;
  * @author Nathan Sweet <misc@n4te.com>
  */
 class GdxCacheContext implements CacheContext {
-       final TwlRenderer renderer;
+       final GdxRenderer renderer;
        private final HashMap<String, GdxTexture> textures = new HashMap();
        private final HashMap<String, BitmapFont> fonts = new HashMap();
        private boolean valid = true;
 
-       GdxCacheContext (TwlRenderer renderer) {
+       GdxCacheContext (GdxRenderer renderer) {
                this.renderer = renderer;
        }
 
index f7ccbdf..d8b3b04 100644 (file)
@@ -46,12 +46,12 @@ import de.matthiasmann.twl.utils.StateExpression;
 class GdxFont implements Font {
        static private final HAlignment[] gdxAlignment = HAlignment.values();
 
-       final TwlRenderer renderer;
+       final GdxRenderer renderer;
        final BitmapFont bitmapFont;
        private final FontState[] fontStates;
        private final int yOffset;
 
-       public GdxFont (TwlRenderer renderer, BitmapFont bitmapFont, Map<String, String> params, Collection<FontParameter> condParams) {
+       public GdxFont (GdxRenderer renderer, BitmapFont bitmapFont, Map<String, String> params, Collection<FontParameter> condParams) {
                this.bitmapFont = bitmapFont;
                this.renderer = renderer;
                yOffset = bitmapFont.getLineHeight() - bitmapFont.getBaseLine();
index fbed7c0..6f28cdc 100644 (file)
@@ -35,14 +35,14 @@ import de.matthiasmann.twl.renderer.SupportsDrawRepeat;
  * @author Matthias Mann\r
  */\r
 class GdxImage implements Image, SupportsDrawRepeat {\r
-       private final TwlRenderer renderer;\r
+       private final GdxRenderer renderer;\r
        private final Sprite sprite;\r
        private final Color tintColor;\r
        private final int width;\r
        private final int height;\r
        private final boolean tile;\r
 \r
-       public GdxImage (TwlRenderer renderer, Texture texture, int srcX, int srcY, int srcWidth, int srcHeight, Color color,\r
+       public GdxImage (GdxRenderer renderer, Texture texture, int srcX, int srcY, int srcWidth, int srcHeight, Color color,\r
                boolean tile) {\r
                this.renderer = renderer;\r
                width = Math.abs(srcWidth);\r
@@ -58,7 +58,7 @@ import de.matthiasmann.twl.theme.ThemeManager;
  * @author Nathan Sweet <misc@n4te.com>\r
  * @author Matthias Mann\r
  */\r
-public class TwlRenderer implements Renderer {\r
+public class GdxRenderer implements Renderer {\r
        private int mouseX, mouseY;\r
        private GdxCacheContext cacheContext;\r
        private boolean hasScissor;\r
@@ -66,10 +66,19 @@ public class TwlRenderer implements Renderer {
        private TintStack tintStack = tintStateRoot;\r
        private final Color tempColor = new Color(1, 1, 1, 1);\r
        private boolean rendering;\r
+       private int width, height;\r
        final SpriteBatch spriteBatch = new SpriteBatch();\r
 \r
-       public TwlRenderer () {\r
+       public GdxRenderer () {\r
                spriteBatch.getProjectionMatrix().setToOrtho(0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), 0, 0, 1);\r
+\r
+               Widget root = new Widget() {\r
+                       protected void layout () {\r
+                               layoutChildrenFullInnerArea();\r
+                       }\r
+               };\r
+               root.setTheme("");\r
+               new GUI(root, this, null);\r
        }\r
 \r
        public GdxCacheContext createNewCacheContext () {\r
@@ -92,7 +101,7 @@ public class TwlRenderer implements Renderer {
        }\r
 \r
        public long getTimeMillis () {\r
-               return System.currentTimeMillis();\r
+               return System.nanoTime() / 1000000;\r
        }\r
 \r
        public void startRenderering () {\r
@@ -139,20 +148,26 @@ public class TwlRenderer implements Renderer {
                return getActiveCacheContext().loadTexture(url);\r
        }\r
 \r
+       public int getWidth () {\r
+               return width;\r
+       }\r
+\r
        public int getHeight () {\r
-               return Gdx.graphics.getHeight();\r
+               return height;\r
        }\r
 \r
-       public int getWidth () {\r
-               return Gdx.graphics.getWidth();\r
+       public void setSize (int width, int height) {\r
+               this.width = width;\r
+               this.height = height;\r
+               spriteBatch.getProjectionMatrix().setToOrtho(0, width, height, 0, 0, 1);\r
        }\r
 \r
        public LineRenderer getLineRenderer () {\r
-               return null;\r
+               return null; // Unsupported.\r
        }\r
 \r
        public DynamicImage createDynamicImage (int width, int height) {\r
-               return null;\r
+               return null; // Unsupported.\r
        }\r
 \r
        public void setCursor (MouseCursor cursor) {\r
@@ -181,6 +196,14 @@ public class TwlRenderer implements Renderer {
                return tempColor;\r
        }\r
 \r
+       public void dispose () {\r
+               if (cacheContext != null) {\r
+                       cacheContext.destroy();\r
+                       cacheContext = null;\r
+               }\r
+               spriteBatch.dispose();\r
+       }\r
+\r
        static private class TintStack extends Color {\r
                final TintStack previous;\r
 \r
@@ -204,10 +227,6 @@ public class TwlRenderer implements Renderer {
                }\r
        }\r
 \r
-       public void setSize () {\r
-               spriteBatch.getProjectionMatrix().setToOrtho(0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), 0, 0, 1);\r
-       }\r
-\r
        public void applyTheme (GUI gui, String themeFile, final FileType fileType) {\r
                File file = new File(themeFile);\r
                final File themeRoot = file.getParentFile();\r
index a2f9f72..9f88d1f 100644 (file)
@@ -38,10 +38,10 @@ import de.matthiasmann.twl.renderer.Texture;
  * @author Nathan Sweet <misc@n4te.com>
  */
 class GdxTexture implements Texture, Resource {
-       private final TwlRenderer renderer;
+       private final GdxRenderer renderer;
        private final com.badlogic.gdx.graphics.Texture texture;
 
-       public GdxTexture (TwlRenderer renderer, FileHandle textureFile) {
+       public GdxTexture (GdxRenderer renderer, FileHandle textureFile) {
                this.renderer = renderer;
                texture = Gdx.graphics.newTexture(textureFile, TextureFilter.Linear, TextureFilter.Linear, TextureWrap.ClampToEdge,
                        TextureWrap.ClampToEdge);
index fb218d4..e96e19a 100644 (file)
@@ -1,49 +1,32 @@
+\r
 package com.badlogic.gdx;\r
 \r
 public abstract class Game implements ApplicationListener {\r
        Screen screen;\r
-       \r
-       /**\r
-        * Starts the game and returns the start {@link Screen}. This\r
-        * will be called in the rendering thread so you can do anything\r
-        * you like.\r
-        * \r
-        * @return the start screen. \r
-        */\r
-       public abstract Screen start();\r
-\r
-       @Override\r
-       public void create() {\r
-               screen = start();\r
-       }\r
 \r
-       @Override\r
-       public void dispose() {         \r
-               screen.dispose();\r
+       @Override public void dispose () {\r
+               if (screen != null) screen.hide();\r
        }\r
 \r
-       @Override\r
-       public void pause() {\r
-               screen.pause();\r
+       @Override public void pause () {\r
+               if (screen != null) screen.pause();\r
        }\r
 \r
-       @Override\r
-       public void render() {\r
-               screen.render(Gdx.graphics.getDeltaTime());\r
+       @Override public void resume () {\r
+               if (screen != null) screen.resume();\r
        }\r
 \r
-       @Override\r
-       public void resize(int width, int height) {\r
-               screen.resize(width,height);\r
+       @Override public void render () {\r
+               if (screen != null) screen.render(Gdx.graphics.getDeltaTime());\r
        }\r
 \r
-       @Override\r
-       public void resume() {\r
-               screen.resume();                \r
+       @Override public void resize (int width, int height) {\r
+               if (screen != null) screen.resize(width, height);\r
        }\r
-       \r
-       public void setScreen(Screen screen) {\r
-               this.screen.dispose();\r
+\r
+       public void setScreen (Screen screen) {\r
+               if (this.screen != null) this.screen.hide();\r
                this.screen = screen;\r
+               screen.show();\r
        }\r
 }\r
diff --git a/gdx/src/com/badlogic/gdx/InputMultiplexer.java b/gdx/src/com/badlogic/gdx/InputMultiplexer.java
new file mode 100644 (file)
index 0000000..2c4c71b
--- /dev/null
@@ -0,0 +1,48 @@
+\r
+package com.badlogic.gdx;\r
+\r
+import java.util.ArrayList;\r
+\r
+public class InputMultiplexer implements InputProcessor {\r
+       private ArrayList<InputProcessor> processors = new ArrayList(4);\r
+\r
+       public void addProcessor (InputProcessor processor) {\r
+               processors.add(processor);\r
+       }\r
+\r
+       public boolean keyDown (int keycode) {\r
+               for (int i = 0, n = processors.size(); i < n; i++)\r
+                       if (processors.get(i).keyDown(keycode)) return true;\r
+               return false;\r
+       }\r
+\r
+       public boolean keyUp (int keycode) {\r
+               for (int i = 0, n = processors.size(); i < n; i++)\r
+                       if (processors.get(i).keyUp(keycode)) return true;\r
+               return false;\r
+       }\r
+\r
+       public boolean keyTyped (char character) {\r
+               for (int i = 0, n = processors.size(); i < n; i++)\r
+                       if (processors.get(i).keyTyped(character)) return true;\r
+               return false;\r
+       }\r
+\r
+       public boolean touchDown (int x, int y, int pointer) {\r
+               for (int i = 0, n = processors.size(); i < n; i++)\r
+                       if (processors.get(i).touchDown(x, y, pointer)) return true;\r
+               return false;\r
+       }\r
+\r
+       public boolean touchUp (int x, int y, int pointer) {\r
+               for (int i = 0, n = processors.size(); i < n; i++)\r
+                       if (processors.get(i).touchUp(x, y, pointer)) return true;\r
+               return false;\r
+       }\r
+\r
+       public boolean touchDragged (int x, int y, int pointer) {\r
+               for (int i = 0, n = processors.size(); i < n; i++)\r
+                       if (processors.get(i).touchDragged(x, y, pointer)) return true;\r
+               return false;\r
+       }\r
+}\r
index 96cd672..01284d2 100644 (file)
@@ -1,18 +1,30 @@
+\r
 package com.badlogic.gdx;\r
 \r
 public abstract class Screen {\r
-       final Game game;\r
-       \r
-       public Screen(Game game) {\r
+       public final Game game;\r
+\r
+       public Screen (Game game) {\r
                this.game = game;\r
        }\r
-       public abstract void resize(int width, int height);\r
-       \r
-       public abstract void render(float delta);\r
-       \r
-       public abstract void pause();\r
-       \r
-       public abstract void resume();\r
-       \r
-       public abstract void dispose();\r
+\r
+       public abstract void render (float delta);\r
+\r
+       public void resize (int width, int height) {\r
+       }\r
+\r
+       public void show () {\r
+       }\r
+\r
+       public void hide () {\r
+       }\r
+\r
+       public void pause () {\r
+       }\r
+\r
+       public void resume () {\r
+       }\r
+\r
+       public void dispose () {\r
+       }\r
 }\r