/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* AndroidWorld Library, Copyright 2011 Bryan Chadwick *
* *
* FILE: ./android/world/VoidWorld.java *
* *
* This file is part of AndroidWorld. *
* *
* AndroidWorld is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation, either version *
* 3 of the License, or (at your option) any later version. *
* *
* AndroidWorld is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with AndroidWorld. If not, see
* See the individual methods for detailed documentation. *
* **
** */ public abstract class VoidWorld{ /** The BigBang/Handler */ private BigBang bigbang; /** Default Tick rate for the world: ~33 frames per second */ public static double DEFAULT_TICK_RATE = 0.03; /** Mouse down (button-down) event String */ public static String MOUSE_DOWN = BigBang.MOUSE_DOWN; /** Mouse up (button-up) event String */ public static String MOUSE_UP = BigBang.MOUSE_UP; /** Mouse motion (move) event String */ public static String MOUSE_MOVE = BigBang.MOUSE_MOVE; /** Mouse down & move (drag) event String */ public static String MOUSE_DRAG = BigBang.MOUSE_DRAG; /** Key arrow-up event String */ public static String KEY_ARROW_UP = BigBang.KEY_ARROW_UP; /** Key arrow-down event String */ public static String KEY_ARROW_DOWN = BigBang.KEY_ARROW_RIGHT; /** Key arrow-left event String */ public static String KEY_ARROW_LEFT = BigBang.KEY_ARROW_LEFT; /** Key arrow-right event String */ public static String KEY_ARROW_RIGHT = BigBang.KEY_ARROW_RIGHT; /** Menu Key event String. The menu key will usually be intercepted to open a save dialog * to enable the capture of application/game screen-shots. */ public static String KEY_MENU = BigBang.KEY_MENU; /** Search Key event String */ public static String KEY_SEARCH = BigBang.KEY_SEARCH; /** Return a visualization of this World as a {@link android.image.Scene Scene}. * See {@link android.image.EmptyScene}, {@link android.image.Scene#placeImage(android.image.Image, int, int)}, and * {@link android.image.Scene#addLine(int, int, int, int, String)} for documentation on * constructing Scenes */ public abstract Scene onDraw(); /** Return the tick rate for this World in seconds. For example, * 0.5 means two tick. The rate is only accessed when * bigBang() is initially called and the window is created. */ public double tickRate(){ return DEFAULT_TICK_RATE; } /** Change this World based on the Tick of the clock. This * method is called to get the update the World on each clock tick.*/ public void onTick(){ } /** Change this World when a touch event is triggered. * x and y are the location of the event on the device screen, * and event is a String that describes what kind of event * occurred. * ** Developing an Android application is a bit more work, since it requires the * Android development kit for Eclipse. After that, you can create an * Android Project and fill in all the parameters. The World/VoidWorld classes * only require a simple hook to be added to the application's Activity. *
* * Below is a simple example of aWorld
that adds a new point at each mouse click. The world * contains a {@link android.image.Scene Scene} and a new {@link android.image.Circle Circle} is placed for each *"button-down"
event received. The VoidWorld is created in the * class that extends Activity. * ** import android.app.Activity; * import android.os.Bundle; * import android.view.Display; * * import android.image.*; * import android.world.VoidWorld; * * public class VoidMousePoints extends Activity{ * // Called when the activity is first created. * public void onCreate(Bundle savedState) { * super.onCreate(savedState); * * Display dis = getWindowManager().getDefaultDisplay(); * // Create and start the World * new MousePointsVoidWorld(dis.getWidth(), dis.getHeight()-50); * .bigBang(this); * } * } * * public class MousePointsVoidWorld extends VoidWorld{ * int WIDTH; * int HEIGHT * Scene scene; * * MousePointsVoidWorld(int WIDTH, int HEIGHT){ * this.WIDTH = WIDTH; * this.HEIGHT = HEIGHT; * this.scene = new EmptyScene(WIDTH, HEIGHT); * } * * public Scene onDraw(){ return this.scene; } * * public void onMouse(int x, int y, String me){ * if(me.equals("button-down")){ * this.scene = this.scene.placeImage( * new Circle(20, "solid", "red") * .overlay(new Circle(20, "outline", "black")), x, y); * } * } * } ** * After a few finger-taps, the device will look something like this:
* * *
* In addition to the normal World events (button-down/up) Android devices * include a "long-button-down" event, for when the * the user does a long press (touch and hold). *
** Possible Mouse Events *
"button-down" : | *The user presses the touch screen of the device |
"long-button-down" : | *The user presses and holds on the touch screen of the device |
"button-up" : | *The user releases the touch screen of the device |
"move" : | *The user moves the mouse in the World window |
"drag" : | *The user touches and moves on the touch screen of the device |
* Special Key *
"up" : | *The user presses the up-arrow key |
"down" : | *The user presses the down-arrow key |
"left" : | *The user presses the left-arrow key |
"right" : | *The user presses the right-arrow key |
* Special Keys *
"up" : | *The user presses the up-arrow key |
"down" : | *The user presses the down-arrow key |
"left" : | *The user presses the left-arrow key |
"right" : | *The user presses the right-arrow key |
* If you are only concerned with the "down" angle (direction of down * with respect to the screen) you can calculate it with a method as follows: *
* double down(double x, double y, double z){ * double ang = Math.acos(x/Math.sqrt(x*x + y*y))+Math.PI; * if(y < 0)return 2*Math.PI-ang; * return ang; * } ** */ public void onOrientation(double x, double y, double z){ } /** Determine if the World/interaction/animation should be * stopped. Returning a value of true * discontinues all events (mouse, key, ticks) and causes {@link * android.world.VoidWorld#lastScene} to be used to draw the final * Scene. */ public boolean stopWhen(){ return false; } /** Returns the Scene that should be displayed when the * interaction/animation completes ({@link android.world.VoidWorld#stopWhen} * returns true). */ public Scene lastScene(){ return this.onDraw(); } /** Kick off the interaction/animation in PORTRATE mode. This method returns the final * state of the world after the user closes the World window. */ public VoidWorld bigBang(Activity act){ return (VoidWorld)this.makeBigBang().bigBang(act); } /** Kick off the interaction/animation in LANDSCAPE mode. */ public VoidWorld bigBangLandscape(Activity act){ return (VoidWorld)this.makeBigBang().bigBangLandscape(act); } /** Kick off the interaction/animation in FULLSCREEN/PORTRATE mode. This method returns the final * state of the world after the user closes the World window. */ public VoidWorld bigBangFullscreen(Activity act){ return (VoidWorld)this.makeBigBang().bigBangFullscreen(act); } /** Kick off the interaction/animation in FULLSCREEN/LANDSCAPE mode. */ public VoidWorld bigBangLandscapeFullscreen(Activity act){ return (VoidWorld)this.makeBigBang().bigBangLandscapeFullscreen(act); } /** Get a bigbang instance for this VoidWorld */ public BigBang makeBigBang(){ this.bigbang = new BigBang(this) .onDraw(new WorldDraw()) .onTick(new WorldTick(), tickRate()) .onMouse(new WorldMouse()) .onKey(new WorldKey()) .onRelease(new WorldRelease()) .stopWhen(new WorldStop()) .lastScene(new WorldLast()) .orientation(new WorldOrient()); return this.bigbang; } /** Use to Disable Screen Shots */ public static void noScreenShots(){ BigBang.Handler.screenShots = false; } /** Use to temperarily disable onTick/interactions */ public void pause(){ Log.d("BIGBANG","HERE: "+this.bigbang); this.bigbang.pause(); } /** Use to renable onTick/interactions */ public void unpause(){ this.bigbang.unpause(); } /** Wrapper for OnDraw callback */ private static class WorldDraw{ @SuppressWarnings("unused") Scene apply(VoidWorld w){ return w.onDraw(); } } /** Wrapper for OnTick callback */ private static class WorldTick{ @SuppressWarnings("unused") VoidWorld apply(VoidWorld w){ w.onTick(); return w; } } /** Wrapper for OnMouse callback */ private static class WorldMouse{ @SuppressWarnings("unused") VoidWorld apply(VoidWorld w, int x, int y, String me) { w.onMouse(x,y,me); return w; } } /** Wrapper for OnKey callback */ private static class WorldKey{ @SuppressWarnings("unused") VoidWorld apply(VoidWorld w, String ke){ w.onKey(ke); return w; } } /** Wrapper for OnKey callback */ private static class WorldRelease{ @SuppressWarnings("unused") VoidWorld apply(VoidWorld w, String ke){ w.onRelease(ke); return w; } } /** Wrapper for StopWhen callback */ private static class WorldStop{ @SuppressWarnings("unused") boolean apply(VoidWorld w){ return w.stopWhen(); } } /** Wrapper for LastScene callback */ private static class WorldLast{ @SuppressWarnings("unused") Scene apply(VoidWorld w){ return w.lastScene(); } } /** Wrapper for LastScene callback */ private static class WorldOrient{ @SuppressWarnings("unused") VoidWorld apply(VoidWorld w, float x, float y, float z){ w.onOrientation(x,y,z); return w; } } /** Make sure that changes are redrawn every time */ public boolean equals(Object o){ return false; } }