1cfd74d65d832137e20e193c960802afba73b5d38sm/* 23c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Copyright (C) 2010 The Android Open Source Project 3cfd74d65d832137e20e193c960802afba73b5d38sm * 4cfd74d65d832137e20e193c960802afba73b5d38sm * Licensed under the Apache License, Version 2.0 (the "License"); 5cfd74d65d832137e20e193c960802afba73b5d38sm * you may not use this file except in compliance with the License. 6cfd74d65d832137e20e193c960802afba73b5d38sm * You may obtain a copy of the License at 7cfd74d65d832137e20e193c960802afba73b5d38sm * 8cfd74d65d832137e20e193c960802afba73b5d38sm * http://www.apache.org/licenses/LICENSE-2.0 9cfd74d65d832137e20e193c960802afba73b5d38sm * 10cfd74d65d832137e20e193c960802afba73b5d38sm * Unless required by applicable law or agreed to in writing, software 11cfd74d65d832137e20e193c960802afba73b5d38sm * distributed under the License is distributed on an "AS IS" BASIS, 12cfd74d65d832137e20e193c960802afba73b5d38sm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cfd74d65d832137e20e193c960802afba73b5d38sm * See the License for the specific language governing permissions and 14cfd74d65d832137e20e193c960802afba73b5d38sm * limitations under the License. 15cfd74d65d832137e20e193c960802afba73b5d38sm */ 16cfd74d65d832137e20e193c960802afba73b5d38sm 17cfd74d65d832137e20e193c960802afba73b5d38smpackage com.replica.replicaisland; 18cfd74d65d832137e20e193c960802afba73b5d38sm 19cfd74d65d832137e20e193c960802afba73b5d38smimport android.content.Context; 202b1168acefb6a4104bb7f008df6ac51fcd1de7ecsmimport android.os.Build; 219d4cc2572d37983607df38b0f4216ed76ac51814smimport android.view.KeyEvent; 22cfd74d65d832137e20e193c960802afba73b5d38smimport android.view.MotionEvent; 232b1168acefb6a4104bb7f008df6ac51fcd1de7ecsmimport android.view.WindowManager; 24cfd74d65d832137e20e193c960802afba73b5d38smimport android.widget.Toast; 25cfd74d65d832137e20e193c960802afba73b5d38sm 26cfd74d65d832137e20e193c960802afba73b5d38sm/** 27cfd74d65d832137e20e193c960802afba73b5d38sm * High-level setup object for the AndouKun game engine. 28cfd74d65d832137e20e193c960802afba73b5d38sm * This class sets up the core game engine objects and threads. It also passes events to the 29cfd74d65d832137e20e193c960802afba73b5d38sm * game thread from the main UI thread. 30cfd74d65d832137e20e193c960802afba73b5d38sm */ 31cfd74d65d832137e20e193c960802afba73b5d38smpublic class Game extends AllocationGuard { 32cfd74d65d832137e20e193c960802afba73b5d38sm private GameThread mGameThread; 33cfd74d65d832137e20e193c960802afba73b5d38sm private Thread mGame; 34cfd74d65d832137e20e193c960802afba73b5d38sm private ObjectManager mGameRoot; 35cfd74d65d832137e20e193c960802afba73b5d38sm 36cfd74d65d832137e20e193c960802afba73b5d38sm private GameRenderer mRenderer; 37cfd74d65d832137e20e193c960802afba73b5d38sm private GLSurfaceView mSurfaceView; 38cfd74d65d832137e20e193c960802afba73b5d38sm private boolean mRunning; 39cfd74d65d832137e20e193c960802afba73b5d38sm private boolean mBootstrapComplete; 40cfd74d65d832137e20e193c960802afba73b5d38sm private LevelTree.Level mPendingLevel; 41cfd74d65d832137e20e193c960802afba73b5d38sm private LevelTree.Level mCurrentLevel; 42cfd74d65d832137e20e193c960802afba73b5d38sm private LevelTree.Level mLastLevel; 43cfd74d65d832137e20e193c960802afba73b5d38sm private boolean mGLDataLoaded; 44cfd74d65d832137e20e193c960802afba73b5d38sm private ContextParameters mContextParameters; 452b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm private TouchFilter mTouchFilter; 46cfd74d65d832137e20e193c960802afba73b5d38sm 47cfd74d65d832137e20e193c960802afba73b5d38sm public Game() { 48cfd74d65d832137e20e193c960802afba73b5d38sm super(); 49cfd74d65d832137e20e193c960802afba73b5d38sm mRunning = false; 50cfd74d65d832137e20e193c960802afba73b5d38sm mBootstrapComplete = false; 51cfd74d65d832137e20e193c960802afba73b5d38sm mGLDataLoaded = false; 52cfd74d65d832137e20e193c960802afba73b5d38sm mContextParameters = new ContextParameters(); 53cfd74d65d832137e20e193c960802afba73b5d38sm } 54cfd74d65d832137e20e193c960802afba73b5d38sm 55cfd74d65d832137e20e193c960802afba73b5d38sm /** 56cfd74d65d832137e20e193c960802afba73b5d38sm * Creates core game objects and constructs the game engine object graph. Note that the 57cfd74d65d832137e20e193c960802afba73b5d38sm * game does not actually begin running after this function is called (see start() below). 58cfd74d65d832137e20e193c960802afba73b5d38sm * Also note that textures are not loaded from the resource pack by this function, as OpenGl 59cfd74d65d832137e20e193c960802afba73b5d38sm * isn't yet available. 60cfd74d65d832137e20e193c960802afba73b5d38sm * @param context 61cfd74d65d832137e20e193c960802afba73b5d38sm */ 622b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm public void bootstrap(Context context, int viewWidth, int viewHeight, int gameWidth, int gameHeight, int difficulty) { 63cfd74d65d832137e20e193c960802afba73b5d38sm if (!mBootstrapComplete) { 64cfd74d65d832137e20e193c960802afba73b5d38sm mRenderer = new GameRenderer(context, this, gameWidth, gameHeight); 65cfd74d65d832137e20e193c960802afba73b5d38sm 66cfd74d65d832137e20e193c960802afba73b5d38sm // Create core systems 67cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.openGLSystem = new OpenGLSystem(null); 68cfd74d65d832137e20e193c960802afba73b5d38sm 69cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.customToastSystem = new CustomToastSystem(context); 70cfd74d65d832137e20e193c960802afba73b5d38sm 71cfd74d65d832137e20e193c960802afba73b5d38sm ContextParameters params = mContextParameters; 72cfd74d65d832137e20e193c960802afba73b5d38sm params.viewWidth = viewWidth; 73cfd74d65d832137e20e193c960802afba73b5d38sm params.viewHeight = viewHeight; 74cfd74d65d832137e20e193c960802afba73b5d38sm params.gameWidth = gameWidth; 75cfd74d65d832137e20e193c960802afba73b5d38sm params.gameHeight = gameHeight; 76cfd74d65d832137e20e193c960802afba73b5d38sm params.viewScaleX = (float)viewWidth / gameWidth; 77cfd74d65d832137e20e193c960802afba73b5d38sm params.viewScaleY = (float)viewHeight / gameHeight; 78cfd74d65d832137e20e193c960802afba73b5d38sm params.context = context; 792b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm params.difficulty = difficulty; 80cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.contextParameters = params; 812b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 822b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm final int sdkVersion = Integer.parseInt(Build.VERSION.SDK); 832b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm if (sdkVersion < Build.VERSION_CODES.ECLAIR) { 842b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm mTouchFilter = new SingleTouchFilter(); 852b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm } else { 862b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm mTouchFilter = new MultiTouchFilter(); 872b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm } 88cfd74d65d832137e20e193c960802afba73b5d38sm 89cfd74d65d832137e20e193c960802afba73b5d38sm // Short-term textures are cleared between levels. 90cfd74d65d832137e20e193c960802afba73b5d38sm TextureLibrary shortTermTextureLibrary = new TextureLibrary(); 91cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.shortTermTextureLibrary = shortTermTextureLibrary; 92cfd74d65d832137e20e193c960802afba73b5d38sm 93cfd74d65d832137e20e193c960802afba73b5d38sm // Long-term textures persist between levels. 94cfd74d65d832137e20e193c960802afba73b5d38sm TextureLibrary longTermTextureLibrary = new TextureLibrary(); 95cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.longTermTextureLibrary = longTermTextureLibrary; 96cfd74d65d832137e20e193c960802afba73b5d38sm 97cfd74d65d832137e20e193c960802afba73b5d38sm // The buffer library manages hardware VBOs. 98cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.bufferLibrary = new BufferLibrary(); 99cfd74d65d832137e20e193c960802afba73b5d38sm 100cfd74d65d832137e20e193c960802afba73b5d38sm 101cfd74d65d832137e20e193c960802afba73b5d38sm 102cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.soundSystem = new SoundSystem(); 103cfd74d65d832137e20e193c960802afba73b5d38sm 104cfd74d65d832137e20e193c960802afba73b5d38sm // The root of the game graph. 105cfd74d65d832137e20e193c960802afba73b5d38sm MainLoop gameRoot = new MainLoop(); 106cfd74d65d832137e20e193c960802afba73b5d38sm 107cfd74d65d832137e20e193c960802afba73b5d38sm InputSystem input = new InputSystem(); 108cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.inputSystem = input; 1099d4cc2572d37983607df38b0f4216ed76ac51814sm BaseObject.sSystemRegistry.registerForReset(input); 1102b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 1112b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm WindowManager windowMgr = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); 1122b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm int rotationIndex = windowMgr.getDefaultDisplay().getOrientation(); 1132b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm input.setScreenRotation(rotationIndex); 114cfd74d65d832137e20e193c960802afba73b5d38sm 1159d4cc2572d37983607df38b0f4216ed76ac51814sm InputGameInterface inputInterface = new InputGameInterface(); 1169d4cc2572d37983607df38b0f4216ed76ac51814sm gameRoot.add(inputInterface); 1179d4cc2572d37983607df38b0f4216ed76ac51814sm BaseObject.sSystemRegistry.inputGameInterface = inputInterface; 118cfd74d65d832137e20e193c960802afba73b5d38sm 119cfd74d65d832137e20e193c960802afba73b5d38sm LevelSystem level = new LevelSystem(); 120cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.levelSystem = level; 121cfd74d65d832137e20e193c960802afba73b5d38sm 122cfd74d65d832137e20e193c960802afba73b5d38sm CollisionSystem collision = new CollisionSystem(); 123cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.collisionSystem = collision; 124cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.hitPointPool = new HitPointPool(); 125cfd74d65d832137e20e193c960802afba73b5d38sm 126cfd74d65d832137e20e193c960802afba73b5d38sm GameObjectManager gameManager = new GameObjectManager(params.viewWidth * 2); 127cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.gameObjectManager = gameManager; 128cfd74d65d832137e20e193c960802afba73b5d38sm 129cfd74d65d832137e20e193c960802afba73b5d38sm GameObjectFactory objectFactory = new GameObjectFactory(); 130cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.gameObjectFactory = objectFactory; 131cfd74d65d832137e20e193c960802afba73b5d38sm 132cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.hotSpotSystem = new HotSpotSystem(); 133cfd74d65d832137e20e193c960802afba73b5d38sm 134cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.levelBuilder = new LevelBuilder(); 135cfd74d65d832137e20e193c960802afba73b5d38sm 136cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.channelSystem = new ChannelSystem(); 137cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.registerForReset(BaseObject.sSystemRegistry.channelSystem); 138cfd74d65d832137e20e193c960802afba73b5d38sm 139cfd74d65d832137e20e193c960802afba73b5d38sm CameraSystem camera = new CameraSystem(); 140cfd74d65d832137e20e193c960802afba73b5d38sm 141cfd74d65d832137e20e193c960802afba73b5d38sm 142cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.cameraSystem = camera; 143cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.registerForReset(camera); 144cfd74d65d832137e20e193c960802afba73b5d38sm 145cfd74d65d832137e20e193c960802afba73b5d38sm collision.loadCollisionTiles(context.getResources().openRawResource(R.raw.collision)); 146cfd74d65d832137e20e193c960802afba73b5d38sm 147cfd74d65d832137e20e193c960802afba73b5d38sm gameRoot.add(gameManager); 148cfd74d65d832137e20e193c960802afba73b5d38sm 149cfd74d65d832137e20e193c960802afba73b5d38sm // Camera must come after the game manager so that the camera target moves before the camera 150cfd74d65d832137e20e193c960802afba73b5d38sm // centers. 151cfd74d65d832137e20e193c960802afba73b5d38sm 152cfd74d65d832137e20e193c960802afba73b5d38sm gameRoot.add(camera); 153cfd74d65d832137e20e193c960802afba73b5d38sm 154cfd74d65d832137e20e193c960802afba73b5d38sm 155cfd74d65d832137e20e193c960802afba73b5d38sm // More basic systems. 156cfd74d65d832137e20e193c960802afba73b5d38sm 157cfd74d65d832137e20e193c960802afba73b5d38sm GameObjectCollisionSystem dynamicCollision = new GameObjectCollisionSystem(); 158cfd74d65d832137e20e193c960802afba73b5d38sm gameRoot.add(dynamicCollision); 159cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.gameObjectCollisionSystem = dynamicCollision; 160cfd74d65d832137e20e193c960802afba73b5d38sm 161cfd74d65d832137e20e193c960802afba73b5d38sm 162cfd74d65d832137e20e193c960802afba73b5d38sm RenderSystem renderer = new RenderSystem(); 163cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.renderSystem = renderer; 164cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.vectorPool = new VectorPool(); 165cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.drawableFactory = new DrawableFactory(); 166cfd74d65d832137e20e193c960802afba73b5d38sm 167cfd74d65d832137e20e193c960802afba73b5d38sm HudSystem hud = new HudSystem(); 168cfd74d65d832137e20e193c960802afba73b5d38sm hud.setFuelDrawable( 169cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap(longTermTextureLibrary.allocateTexture( 170cfd74d65d832137e20e193c960802afba73b5d38sm R.drawable.ui_bar), 0, 0), 171cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap(longTermTextureLibrary.allocateTexture( 172cfd74d65d832137e20e193c960802afba73b5d38sm R.drawable.ui_bar_bg), 0, 0)); 173cfd74d65d832137e20e193c960802afba73b5d38sm hud.setFadeTexture(longTermTextureLibrary.allocateTexture(R.drawable.black)); 174cfd74d65d832137e20e193c960802afba73b5d38sm hud.setButtonDrawables( 175cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap(longTermTextureLibrary.allocateTexture( 176cfd74d65d832137e20e193c960802afba73b5d38sm R.drawable.ui_button_fly_disabled), 0, 0), 177cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap(longTermTextureLibrary.allocateTexture( 178cfd74d65d832137e20e193c960802afba73b5d38sm R.drawable.ui_button_fly_off), 0, 0), 179cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap(longTermTextureLibrary.allocateTexture( 180cfd74d65d832137e20e193c960802afba73b5d38sm R.drawable.ui_button_fly_on), 0, 0), 181cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap(longTermTextureLibrary.allocateTexture( 182cfd74d65d832137e20e193c960802afba73b5d38sm R.drawable.ui_button_stomp_off), 0, 0), 183cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap(longTermTextureLibrary.allocateTexture( 1842b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm R.drawable.ui_button_stomp_on), 0, 0), 1852b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm new DrawableBitmap(longTermTextureLibrary.allocateTexture( 1862b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm R.drawable.ui_movement_slider_base), 0, 0), 1872b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm new DrawableBitmap(longTermTextureLibrary.allocateTexture( 1882b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm R.drawable.ui_movement_slider_button_off), 0, 0), 1892b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm new DrawableBitmap(longTermTextureLibrary.allocateTexture( 1902b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm R.drawable.ui_movement_slider_button_on), 0, 0)); 191cfd74d65d832137e20e193c960802afba73b5d38sm Texture[] digitTextures = { 192cfd74d65d832137e20e193c960802afba73b5d38sm longTermTextureLibrary.allocateTexture(R.drawable.ui_0), 193cfd74d65d832137e20e193c960802afba73b5d38sm longTermTextureLibrary.allocateTexture(R.drawable.ui_1), 194cfd74d65d832137e20e193c960802afba73b5d38sm longTermTextureLibrary.allocateTexture(R.drawable.ui_2), 195cfd74d65d832137e20e193c960802afba73b5d38sm longTermTextureLibrary.allocateTexture(R.drawable.ui_3), 196cfd74d65d832137e20e193c960802afba73b5d38sm longTermTextureLibrary.allocateTexture(R.drawable.ui_4), 197cfd74d65d832137e20e193c960802afba73b5d38sm longTermTextureLibrary.allocateTexture(R.drawable.ui_5), 198cfd74d65d832137e20e193c960802afba73b5d38sm longTermTextureLibrary.allocateTexture(R.drawable.ui_6), 199cfd74d65d832137e20e193c960802afba73b5d38sm longTermTextureLibrary.allocateTexture(R.drawable.ui_7), 200cfd74d65d832137e20e193c960802afba73b5d38sm longTermTextureLibrary.allocateTexture(R.drawable.ui_8), 201cfd74d65d832137e20e193c960802afba73b5d38sm longTermTextureLibrary.allocateTexture(R.drawable.ui_9) 202cfd74d65d832137e20e193c960802afba73b5d38sm }; 203cfd74d65d832137e20e193c960802afba73b5d38sm DrawableBitmap[] digits = { 204cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap(digitTextures[0], 0, 0), 205cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap(digitTextures[1], 0, 0), 206cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap(digitTextures[2], 0, 0), 207cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap(digitTextures[3], 0, 0), 208cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap(digitTextures[4], 0, 0), 209cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap(digitTextures[5], 0, 0), 210cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap(digitTextures[6], 0, 0), 211cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap(digitTextures[7], 0, 0), 212cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap(digitTextures[8], 0, 0), 213cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap(digitTextures[9], 0, 0) 214cfd74d65d832137e20e193c960802afba73b5d38sm }; 215cfd74d65d832137e20e193c960802afba73b5d38sm DrawableBitmap xDrawable = new DrawableBitmap( 216cfd74d65d832137e20e193c960802afba73b5d38sm longTermTextureLibrary.allocateTexture(R.drawable.ui_x), 0, 0); 217cfd74d65d832137e20e193c960802afba73b5d38sm 218cfd74d65d832137e20e193c960802afba73b5d38sm hud.setDigitDrawables(digits, xDrawable); 219cfd74d65d832137e20e193c960802afba73b5d38sm hud.setCollectableDrawables( 220cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap( 221cfd74d65d832137e20e193c960802afba73b5d38sm longTermTextureLibrary.allocateTexture(R.drawable.ui_pearl), 0, 0), 222cfd74d65d832137e20e193c960802afba73b5d38sm new DrawableBitmap( 223cfd74d65d832137e20e193c960802afba73b5d38sm longTermTextureLibrary.allocateTexture(R.drawable.ui_gem), 0, 0)); 224cfd74d65d832137e20e193c960802afba73b5d38sm 225cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.hudSystem = hud; 2269d4cc2572d37983607df38b0f4216ed76ac51814sm if (AndouKun.VERSION < 0) { 2279d4cc2572d37983607df38b0f4216ed76ac51814sm hud.setShowFPS(true); 2289d4cc2572d37983607df38b0f4216ed76ac51814sm } 229cfd74d65d832137e20e193c960802afba73b5d38sm gameRoot.add(hud); 230cfd74d65d832137e20e193c960802afba73b5d38sm 231cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.vibrationSystem = new VibrationSystem(); 232cfd74d65d832137e20e193c960802afba73b5d38sm 2332b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm EventRecorder eventRecorder = new EventRecorder(); 2342b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm BaseObject.sSystemRegistry.eventRecorder = eventRecorder; 2352b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm BaseObject.sSystemRegistry.registerForReset(eventRecorder); 236cfd74d65d832137e20e193c960802afba73b5d38sm 237cfd74d65d832137e20e193c960802afba73b5d38sm gameRoot.add(collision); 238cfd74d65d832137e20e193c960802afba73b5d38sm 239cfd74d65d832137e20e193c960802afba73b5d38sm // debug systems 240cfd74d65d832137e20e193c960802afba73b5d38sm //BaseObject.sSystemRegistry.debugSystem = new DebugSystem(longTermTextureLibrary); 241cfd74d65d832137e20e193c960802afba73b5d38sm //dynamicCollision.setDebugPrefs(false, true); 242cfd74d65d832137e20e193c960802afba73b5d38sm 243cfd74d65d832137e20e193c960802afba73b5d38sm 244cfd74d65d832137e20e193c960802afba73b5d38sm objectFactory.preloadEffects(); 245cfd74d65d832137e20e193c960802afba73b5d38sm 246cfd74d65d832137e20e193c960802afba73b5d38sm mGameRoot = gameRoot; 247cfd74d65d832137e20e193c960802afba73b5d38sm 248cfd74d65d832137e20e193c960802afba73b5d38sm mGameThread = new GameThread(mRenderer); 249cfd74d65d832137e20e193c960802afba73b5d38sm mGameThread.setGameRoot(mGameRoot); 250cfd74d65d832137e20e193c960802afba73b5d38sm 251cfd74d65d832137e20e193c960802afba73b5d38sm 252cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentLevel = null; 253cfd74d65d832137e20e193c960802afba73b5d38sm 254cfd74d65d832137e20e193c960802afba73b5d38sm mBootstrapComplete = true; 255cfd74d65d832137e20e193c960802afba73b5d38sm } 256cfd74d65d832137e20e193c960802afba73b5d38sm } 257cfd74d65d832137e20e193c960802afba73b5d38sm 258cfd74d65d832137e20e193c960802afba73b5d38sm 259cfd74d65d832137e20e193c960802afba73b5d38sm protected synchronized void stopLevel() { 260cfd74d65d832137e20e193c960802afba73b5d38sm stop(); 261cfd74d65d832137e20e193c960802afba73b5d38sm GameObjectManager manager = BaseObject.sSystemRegistry.gameObjectManager; 262cfd74d65d832137e20e193c960802afba73b5d38sm manager.destroyAll(); 263cfd74d65d832137e20e193c960802afba73b5d38sm manager.commitUpdates(); 264cfd74d65d832137e20e193c960802afba73b5d38sm 265cfd74d65d832137e20e193c960802afba73b5d38sm //TODO: it's not strictly necessary to clear the static data here, but if I don't do it 266cfd74d65d832137e20e193c960802afba73b5d38sm // then two things happen: first, the static data will refer to junk Texture objects, and 267cfd74d65d832137e20e193c960802afba73b5d38sm // second, memory that may not be needed for the next level will hang around. One solution 268cfd74d65d832137e20e193c960802afba73b5d38sm // would be to break up the texture library into static and non-static things, and 269cfd74d65d832137e20e193c960802afba73b5d38sm // then selectively clear static game components based on their usefulness next level, 270cfd74d65d832137e20e193c960802afba73b5d38sm // but this is way simpler. 271cfd74d65d832137e20e193c960802afba73b5d38sm GameObjectFactory factory = BaseObject.sSystemRegistry.gameObjectFactory; 272cfd74d65d832137e20e193c960802afba73b5d38sm factory.clearStaticData(); 273cfd74d65d832137e20e193c960802afba73b5d38sm factory.sanityCheckPools(); 274cfd74d65d832137e20e193c960802afba73b5d38sm 275cfd74d65d832137e20e193c960802afba73b5d38sm // Reset the level 276cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.levelSystem.reset(); 277cfd74d65d832137e20e193c960802afba73b5d38sm 2782b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm // Ensure sounds have stopped. 2792b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm BaseObject.sSystemRegistry.soundSystem.stopAll(); 2802b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 281cfd74d65d832137e20e193c960802afba73b5d38sm // Reset systems that need it. 282cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.reset(); 283cfd74d65d832137e20e193c960802afba73b5d38sm 284cfd74d65d832137e20e193c960802afba73b5d38sm // Dump the short-term texture objects only. 285cfd74d65d832137e20e193c960802afba73b5d38sm mSurfaceView.flushTextures(BaseObject.sSystemRegistry.shortTermTextureLibrary); 286cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.shortTermTextureLibrary.removeAll(); 287cfd74d65d832137e20e193c960802afba73b5d38sm mSurfaceView.flushBuffers(BaseObject.sSystemRegistry.bufferLibrary); 288cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.bufferLibrary.removeAll(); 289cfd74d65d832137e20e193c960802afba73b5d38sm } 290cfd74d65d832137e20e193c960802afba73b5d38sm 291cfd74d65d832137e20e193c960802afba73b5d38sm public synchronized void requestNewLevel() { 292cfd74d65d832137e20e193c960802afba73b5d38sm // tell the Renderer to call us back when the 293cfd74d65d832137e20e193c960802afba73b5d38sm // render thread is ready to manage some texture memory. 294cfd74d65d832137e20e193c960802afba73b5d38sm mRenderer.requestCallback(); 295cfd74d65d832137e20e193c960802afba73b5d38sm } 296cfd74d65d832137e20e193c960802afba73b5d38sm 297cfd74d65d832137e20e193c960802afba73b5d38sm public synchronized void restartLevel() { 298cfd74d65d832137e20e193c960802afba73b5d38sm DebugLog.d("AndouKun", "Restarting..."); 299cfd74d65d832137e20e193c960802afba73b5d38sm final LevelTree.Level level = mCurrentLevel; 300cfd74d65d832137e20e193c960802afba73b5d38sm stop(); 301cfd74d65d832137e20e193c960802afba73b5d38sm 302cfd74d65d832137e20e193c960802afba73b5d38sm // Destroy all game objects and respawn them. No need to destroy other systems. 303cfd74d65d832137e20e193c960802afba73b5d38sm GameObjectManager manager = BaseObject.sSystemRegistry.gameObjectManager; 304cfd74d65d832137e20e193c960802afba73b5d38sm manager.destroyAll(); 305cfd74d65d832137e20e193c960802afba73b5d38sm manager.commitUpdates(); 306cfd74d65d832137e20e193c960802afba73b5d38sm 3072b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm // Ensure sounds have stopped. 3082b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm BaseObject.sSystemRegistry.soundSystem.stopAll(); 3092b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 310cfd74d65d832137e20e193c960802afba73b5d38sm // Reset systems that need it. 311cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.reset(); 312cfd74d65d832137e20e193c960802afba73b5d38sm 313cfd74d65d832137e20e193c960802afba73b5d38sm LevelSystem levelSystem = BaseObject.sSystemRegistry.levelSystem; 314cfd74d65d832137e20e193c960802afba73b5d38sm levelSystem.incrementAttemptsCount(); 315cfd74d65d832137e20e193c960802afba73b5d38sm levelSystem.spawnObjects(); 316cfd74d65d832137e20e193c960802afba73b5d38sm 317cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.hudSystem.startFade(true, 0.2f); 318cfd74d65d832137e20e193c960802afba73b5d38sm 319cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentLevel = level; 320cfd74d65d832137e20e193c960802afba73b5d38sm mPendingLevel = null; 321cfd74d65d832137e20e193c960802afba73b5d38sm start(); 322cfd74d65d832137e20e193c960802afba73b5d38sm } 323cfd74d65d832137e20e193c960802afba73b5d38sm 324cfd74d65d832137e20e193c960802afba73b5d38sm protected synchronized void goToLevel(LevelTree.Level level) { 325cfd74d65d832137e20e193c960802afba73b5d38sm 326cfd74d65d832137e20e193c960802afba73b5d38sm ContextParameters params = BaseObject.sSystemRegistry.contextParameters; 327cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.levelSystem.loadLevel(level, 328cfd74d65d832137e20e193c960802afba73b5d38sm params.context.getResources().openRawResource(level.resource), mGameRoot); 329cfd74d65d832137e20e193c960802afba73b5d38sm 330cfd74d65d832137e20e193c960802afba73b5d38sm Context context = params.context; 331cfd74d65d832137e20e193c960802afba73b5d38sm mRenderer.setContext(context); 332cfd74d65d832137e20e193c960802afba73b5d38sm mSurfaceView.loadTextures(BaseObject.sSystemRegistry.longTermTextureLibrary); 333cfd74d65d832137e20e193c960802afba73b5d38sm mSurfaceView.loadTextures(BaseObject.sSystemRegistry.shortTermTextureLibrary); 334cfd74d65d832137e20e193c960802afba73b5d38sm mSurfaceView.loadBuffers(BaseObject.sSystemRegistry.bufferLibrary); 335cfd74d65d832137e20e193c960802afba73b5d38sm 336cfd74d65d832137e20e193c960802afba73b5d38sm mGLDataLoaded = true; 337cfd74d65d832137e20e193c960802afba73b5d38sm 338cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentLevel = level; 339cfd74d65d832137e20e193c960802afba73b5d38sm mPendingLevel = null; 340cfd74d65d832137e20e193c960802afba73b5d38sm 341cfd74d65d832137e20e193c960802afba73b5d38sm TimeSystem time = BaseObject.sSystemRegistry.timeSystem; 342cfd74d65d832137e20e193c960802afba73b5d38sm time.reset(); 343cfd74d65d832137e20e193c960802afba73b5d38sm 344cfd74d65d832137e20e193c960802afba73b5d38sm HudSystem hud = BaseObject.sSystemRegistry.hudSystem; 345cfd74d65d832137e20e193c960802afba73b5d38sm if (hud != null) { 346cfd74d65d832137e20e193c960802afba73b5d38sm hud.startFade(true, 1.0f); 347cfd74d65d832137e20e193c960802afba73b5d38sm } 348cfd74d65d832137e20e193c960802afba73b5d38sm 3492b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 350cfd74d65d832137e20e193c960802afba73b5d38sm CustomToastSystem toast = BaseObject.sSystemRegistry.customToastSystem; 351cfd74d65d832137e20e193c960802afba73b5d38sm if (toast != null) { 352cfd74d65d832137e20e193c960802afba73b5d38sm if (level.inThePast) { 353cfd74d65d832137e20e193c960802afba73b5d38sm toast.toast(context.getString(R.string.memory_playback_start), Toast.LENGTH_LONG); 354cfd74d65d832137e20e193c960802afba73b5d38sm } else { 355cfd74d65d832137e20e193c960802afba73b5d38sm if (mLastLevel != null && mLastLevel.inThePast) { 356cfd74d65d832137e20e193c960802afba73b5d38sm toast.toast(context.getString(R.string.memory_playback_complete), Toast.LENGTH_LONG); 357cfd74d65d832137e20e193c960802afba73b5d38sm } 358cfd74d65d832137e20e193c960802afba73b5d38sm } 359cfd74d65d832137e20e193c960802afba73b5d38sm } 360cfd74d65d832137e20e193c960802afba73b5d38sm 361cfd74d65d832137e20e193c960802afba73b5d38sm mLastLevel = level; 362cfd74d65d832137e20e193c960802afba73b5d38sm 363cfd74d65d832137e20e193c960802afba73b5d38sm start(); 364cfd74d65d832137e20e193c960802afba73b5d38sm } 365cfd74d65d832137e20e193c960802afba73b5d38sm 366cfd74d65d832137e20e193c960802afba73b5d38sm /** Starts the game running. */ 367cfd74d65d832137e20e193c960802afba73b5d38sm public void start() { 368cfd74d65d832137e20e193c960802afba73b5d38sm if (!mRunning) { 369cfd74d65d832137e20e193c960802afba73b5d38sm assert mGame == null; 370cfd74d65d832137e20e193c960802afba73b5d38sm // Now's a good time to run the GC. 371cfd74d65d832137e20e193c960802afba73b5d38sm Runtime r = Runtime.getRuntime(); 372cfd74d65d832137e20e193c960802afba73b5d38sm r.gc(); 373cfd74d65d832137e20e193c960802afba73b5d38sm DebugLog.d("AndouKun", "Start!"); 374cfd74d65d832137e20e193c960802afba73b5d38sm mGame = new Thread(mGameThread); 375cfd74d65d832137e20e193c960802afba73b5d38sm mGame.setName("Game"); 376cfd74d65d832137e20e193c960802afba73b5d38sm mGame.start(); 377cfd74d65d832137e20e193c960802afba73b5d38sm mRunning = true; 378cfd74d65d832137e20e193c960802afba73b5d38sm AllocationGuard.sGuardActive = false; 379cfd74d65d832137e20e193c960802afba73b5d38sm } else { 380cfd74d65d832137e20e193c960802afba73b5d38sm mGameThread.resumeGame(); 381cfd74d65d832137e20e193c960802afba73b5d38sm } 382cfd74d65d832137e20e193c960802afba73b5d38sm } 383cfd74d65d832137e20e193c960802afba73b5d38sm 384cfd74d65d832137e20e193c960802afba73b5d38sm public void stop() { 385cfd74d65d832137e20e193c960802afba73b5d38sm if (mRunning) { 386cfd74d65d832137e20e193c960802afba73b5d38sm DebugLog.d("AndouKun", "Stop!"); 387cfd74d65d832137e20e193c960802afba73b5d38sm if (mGameThread.getPaused()) { 388cfd74d65d832137e20e193c960802afba73b5d38sm mGameThread.resumeGame(); 389cfd74d65d832137e20e193c960802afba73b5d38sm } 390cfd74d65d832137e20e193c960802afba73b5d38sm mGameThread.stopGame(); 391cfd74d65d832137e20e193c960802afba73b5d38sm try { 392cfd74d65d832137e20e193c960802afba73b5d38sm mGame.join(); 393cfd74d65d832137e20e193c960802afba73b5d38sm } catch (InterruptedException e) { 394cfd74d65d832137e20e193c960802afba73b5d38sm mGame.interrupt(); 395cfd74d65d832137e20e193c960802afba73b5d38sm } 396cfd74d65d832137e20e193c960802afba73b5d38sm mGame = null; 397cfd74d65d832137e20e193c960802afba73b5d38sm mRunning = false; 398cfd74d65d832137e20e193c960802afba73b5d38sm mCurrentLevel = null; 399cfd74d65d832137e20e193c960802afba73b5d38sm AllocationGuard.sGuardActive = false; 400cfd74d65d832137e20e193c960802afba73b5d38sm } 401cfd74d65d832137e20e193c960802afba73b5d38sm } 402cfd74d65d832137e20e193c960802afba73b5d38sm 403cfd74d65d832137e20e193c960802afba73b5d38sm public boolean onTrackballEvent(MotionEvent event) { 404cfd74d65d832137e20e193c960802afba73b5d38sm if (mRunning) { 4059d4cc2572d37983607df38b0f4216ed76ac51814sm if (event.getAction() == MotionEvent.ACTION_MOVE) { 4069d4cc2572d37983607df38b0f4216ed76ac51814sm BaseObject.sSystemRegistry.inputSystem.roll(event.getRawX(), event.getRawY()); 4079d4cc2572d37983607df38b0f4216ed76ac51814sm } else if (event.getAction() == MotionEvent.ACTION_DOWN) { 4089d4cc2572d37983607df38b0f4216ed76ac51814sm onKeyDownEvent(KeyEvent.KEYCODE_DPAD_CENTER); 4099d4cc2572d37983607df38b0f4216ed76ac51814sm } else if (event.getAction() == MotionEvent.ACTION_UP) { 4109d4cc2572d37983607df38b0f4216ed76ac51814sm onKeyUpEvent(KeyEvent.KEYCODE_DPAD_CENTER); 4119d4cc2572d37983607df38b0f4216ed76ac51814sm } 412cfd74d65d832137e20e193c960802afba73b5d38sm } 413cfd74d65d832137e20e193c960802afba73b5d38sm return true; 414cfd74d65d832137e20e193c960802afba73b5d38sm } 415cfd74d65d832137e20e193c960802afba73b5d38sm 416cfd74d65d832137e20e193c960802afba73b5d38sm public boolean onOrientationEvent(float x, float y, float z) { 417cfd74d65d832137e20e193c960802afba73b5d38sm if (mRunning) { 4189d4cc2572d37983607df38b0f4216ed76ac51814sm BaseObject.sSystemRegistry.inputSystem.setOrientation(x, y, z); 419cfd74d65d832137e20e193c960802afba73b5d38sm } 420cfd74d65d832137e20e193c960802afba73b5d38sm return true; 421cfd74d65d832137e20e193c960802afba73b5d38sm } 422cfd74d65d832137e20e193c960802afba73b5d38sm 423cfd74d65d832137e20e193c960802afba73b5d38sm public boolean onTouchEvent(MotionEvent event) { 424cfd74d65d832137e20e193c960802afba73b5d38sm if (mRunning) { 4252b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm mTouchFilter.updateTouch(event); 426cfd74d65d832137e20e193c960802afba73b5d38sm } 427cfd74d65d832137e20e193c960802afba73b5d38sm return true; 428cfd74d65d832137e20e193c960802afba73b5d38sm } 429cfd74d65d832137e20e193c960802afba73b5d38sm 4302b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 4312b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 432cfd74d65d832137e20e193c960802afba73b5d38sm public boolean onKeyDownEvent(int keyCode) { 433cfd74d65d832137e20e193c960802afba73b5d38sm boolean result = false; 434cfd74d65d832137e20e193c960802afba73b5d38sm if (mRunning) { 4359d4cc2572d37983607df38b0f4216ed76ac51814sm BaseObject.sSystemRegistry.inputSystem.keyDown(keyCode); 436cfd74d65d832137e20e193c960802afba73b5d38sm } 437cfd74d65d832137e20e193c960802afba73b5d38sm return result; 438cfd74d65d832137e20e193c960802afba73b5d38sm } 439cfd74d65d832137e20e193c960802afba73b5d38sm 440cfd74d65d832137e20e193c960802afba73b5d38sm public boolean onKeyUpEvent(int keyCode) { 441cfd74d65d832137e20e193c960802afba73b5d38sm boolean result = false; 442cfd74d65d832137e20e193c960802afba73b5d38sm if (mRunning) { 4439d4cc2572d37983607df38b0f4216ed76ac51814sm BaseObject.sSystemRegistry.inputSystem.keyUp(keyCode); 444cfd74d65d832137e20e193c960802afba73b5d38sm } 445cfd74d65d832137e20e193c960802afba73b5d38sm return result; 446cfd74d65d832137e20e193c960802afba73b5d38sm } 447cfd74d65d832137e20e193c960802afba73b5d38sm 448cfd74d65d832137e20e193c960802afba73b5d38sm public GameRenderer getRenderer() { 449cfd74d65d832137e20e193c960802afba73b5d38sm return mRenderer; 450cfd74d65d832137e20e193c960802afba73b5d38sm } 451cfd74d65d832137e20e193c960802afba73b5d38sm 452cfd74d65d832137e20e193c960802afba73b5d38sm public void onPause() { 453cfd74d65d832137e20e193c960802afba73b5d38sm if (mRunning) { 454cfd74d65d832137e20e193c960802afba73b5d38sm mGameThread.pauseGame(); 455cfd74d65d832137e20e193c960802afba73b5d38sm } 456cfd74d65d832137e20e193c960802afba73b5d38sm } 457cfd74d65d832137e20e193c960802afba73b5d38sm 458cfd74d65d832137e20e193c960802afba73b5d38sm public void onResume(Context context, boolean force) { 459cfd74d65d832137e20e193c960802afba73b5d38sm if (force && mRunning) { 460cfd74d65d832137e20e193c960802afba73b5d38sm mGameThread.resumeGame(); 461cfd74d65d832137e20e193c960802afba73b5d38sm } else { 462cfd74d65d832137e20e193c960802afba73b5d38sm mRenderer.setContext(context); 463cfd74d65d832137e20e193c960802afba73b5d38sm // Don't explicitly resume the game here. We'll do that in 464cfd74d65d832137e20e193c960802afba73b5d38sm // the SurfaceReady() callback, which will prevent the game 465cfd74d65d832137e20e193c960802afba73b5d38sm // starting before the render thread is ready to go. 466cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.contextParameters.context = context; 467cfd74d65d832137e20e193c960802afba73b5d38sm } 468cfd74d65d832137e20e193c960802afba73b5d38sm } 469cfd74d65d832137e20e193c960802afba73b5d38sm 470cfd74d65d832137e20e193c960802afba73b5d38sm public void onSurfaceReady() { 471cfd74d65d832137e20e193c960802afba73b5d38sm DebugLog.d("AndouKun", "Surface Ready"); 472cfd74d65d832137e20e193c960802afba73b5d38sm 473cfd74d65d832137e20e193c960802afba73b5d38sm if (mPendingLevel != null && mPendingLevel != mCurrentLevel) { 474cfd74d65d832137e20e193c960802afba73b5d38sm if (mRunning) { 475cfd74d65d832137e20e193c960802afba73b5d38sm stopLevel(); 476cfd74d65d832137e20e193c960802afba73b5d38sm } 477cfd74d65d832137e20e193c960802afba73b5d38sm goToLevel(mPendingLevel); 478cfd74d65d832137e20e193c960802afba73b5d38sm } else if (mGameThread.getPaused() && mRunning) { 479cfd74d65d832137e20e193c960802afba73b5d38sm mGameThread.resumeGame(); 480cfd74d65d832137e20e193c960802afba73b5d38sm } 481cfd74d65d832137e20e193c960802afba73b5d38sm } 482cfd74d65d832137e20e193c960802afba73b5d38sm 483cfd74d65d832137e20e193c960802afba73b5d38sm public void setSurfaceView(GLSurfaceView view) { 484cfd74d65d832137e20e193c960802afba73b5d38sm mSurfaceView = view; 485cfd74d65d832137e20e193c960802afba73b5d38sm } 486cfd74d65d832137e20e193c960802afba73b5d38sm 487cfd74d65d832137e20e193c960802afba73b5d38sm public void onSurfaceLost() { 488cfd74d65d832137e20e193c960802afba73b5d38sm DebugLog.d("AndouKun", "Surface Lost"); 489cfd74d65d832137e20e193c960802afba73b5d38sm 490cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.shortTermTextureLibrary.invalidateAll(); 491cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.longTermTextureLibrary.invalidateAll(); 492cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.bufferLibrary.invalidateHardwareBuffers(); 493cfd74d65d832137e20e193c960802afba73b5d38sm 494cfd74d65d832137e20e193c960802afba73b5d38sm mGLDataLoaded = false; 495cfd74d65d832137e20e193c960802afba73b5d38sm } 496cfd74d65d832137e20e193c960802afba73b5d38sm 497cfd74d65d832137e20e193c960802afba73b5d38sm public void onSurfaceCreated() { 498cfd74d65d832137e20e193c960802afba73b5d38sm DebugLog.d("AndouKun", "Surface Created"); 499cfd74d65d832137e20e193c960802afba73b5d38sm 500cfd74d65d832137e20e193c960802afba73b5d38sm // TODO: this is dumb. SurfaceView doesn't need to control everything here. 501cfd74d65d832137e20e193c960802afba73b5d38sm // GL should just be passed to this function and then set up directly. 502cfd74d65d832137e20e193c960802afba73b5d38sm 503cfd74d65d832137e20e193c960802afba73b5d38sm if (!mGLDataLoaded && mGameThread.getPaused() && mRunning && mPendingLevel == null) { 504cfd74d65d832137e20e193c960802afba73b5d38sm 505cfd74d65d832137e20e193c960802afba73b5d38sm mSurfaceView.loadTextures(BaseObject.sSystemRegistry.longTermTextureLibrary); 506cfd74d65d832137e20e193c960802afba73b5d38sm mSurfaceView.loadTextures(BaseObject.sSystemRegistry.shortTermTextureLibrary); 507cfd74d65d832137e20e193c960802afba73b5d38sm mSurfaceView.loadBuffers(BaseObject.sSystemRegistry.bufferLibrary); 508cfd74d65d832137e20e193c960802afba73b5d38sm mGLDataLoaded = true; 509cfd74d65d832137e20e193c960802afba73b5d38sm } 510cfd74d65d832137e20e193c960802afba73b5d38sm } 511cfd74d65d832137e20e193c960802afba73b5d38sm 512cfd74d65d832137e20e193c960802afba73b5d38sm public void setPendingLevel(LevelTree.Level level) { 513cfd74d65d832137e20e193c960802afba73b5d38sm mPendingLevel = level; 514cfd74d65d832137e20e193c960802afba73b5d38sm } 515cfd74d65d832137e20e193c960802afba73b5d38sm 516cfd74d65d832137e20e193c960802afba73b5d38sm public void setSoundEnabled(boolean soundEnabled) { 517cfd74d65d832137e20e193c960802afba73b5d38sm BaseObject.sSystemRegistry.soundSystem.setSoundEnabled(soundEnabled); 518cfd74d65d832137e20e193c960802afba73b5d38sm } 519cfd74d65d832137e20e193c960802afba73b5d38sm 5202b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm public void setControlOptions(boolean clickAttack, 5212b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm boolean tiltControls, int tiltSensitivity, int movementSensitivity, boolean onScreenControls) { 5229d4cc2572d37983607df38b0f4216ed76ac51814sm BaseObject.sSystemRegistry.inputGameInterface.setUseClickForAttack(clickAttack); 5239d4cc2572d37983607df38b0f4216ed76ac51814sm BaseObject.sSystemRegistry.inputGameInterface.setUseOrientationForMovement(tiltControls); 5249d4cc2572d37983607df38b0f4216ed76ac51814sm BaseObject.sSystemRegistry.inputGameInterface.setOrientationMovementSensitivity((tiltSensitivity / 100.0f)); 5259d4cc2572d37983607df38b0f4216ed76ac51814sm BaseObject.sSystemRegistry.inputGameInterface.setMovementSensitivity((movementSensitivity / 100.0f)); 5262b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm BaseObject.sSystemRegistry.inputGameInterface.setUseOnScreenControls(onScreenControls); 5272b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm BaseObject.sSystemRegistry.hudSystem.setMovementSliderMode(onScreenControls); 5289d4cc2572d37983607df38b0f4216ed76ac51814sm } 5299d4cc2572d37983607df38b0f4216ed76ac51814sm 5309d4cc2572d37983607df38b0f4216ed76ac51814sm public void setSafeMode(boolean safe) { 5319d4cc2572d37983607df38b0f4216ed76ac51814sm mSurfaceView.setSafeMode(safe); 532cfd74d65d832137e20e193c960802afba73b5d38sm } 533cfd74d65d832137e20e193c960802afba73b5d38sm 534cfd74d65d832137e20e193c960802afba73b5d38sm public float getGameTime() { 535cfd74d65d832137e20e193c960802afba73b5d38sm return BaseObject.sSystemRegistry.timeSystem.getGameTime(); 536cfd74d65d832137e20e193c960802afba73b5d38sm } 537cfd74d65d832137e20e193c960802afba73b5d38sm 538cfd74d65d832137e20e193c960802afba73b5d38sm public Vector2 getLastDeathPosition() { 539cfd74d65d832137e20e193c960802afba73b5d38sm return BaseObject.sSystemRegistry.eventRecorder.getLastDeathPosition(); 540cfd74d65d832137e20e193c960802afba73b5d38sm } 5412b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 5422b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm public void setLastEnding(int ending) { 5432b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm BaseObject.sSystemRegistry.eventRecorder.setLastEnding(ending); 5442b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm } 5452b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 5462b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm public int getLastEnding() { 5472b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm return BaseObject.sSystemRegistry.eventRecorder.getLastEnding(); 5482b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm } 549cfd74d65d832137e20e193c960802afba73b5d38sm 550cfd74d65d832137e20e193c960802afba73b5d38sm public boolean isPaused() { 551cfd74d65d832137e20e193c960802afba73b5d38sm return (mRunning && mGameThread != null && mGameThread.getPaused()); 552cfd74d65d832137e20e193c960802afba73b5d38sm } 553cfd74d65d832137e20e193c960802afba73b5d38sm 5543c1e67e433728684b5f228c5d4f3e5b1457bb271sm public void setKeyConfig(int leftKey, int rightKey, int jumpKey, 5553c1e67e433728684b5f228c5d4f3e5b1457bb271sm int attackKey) { 5569d4cc2572d37983607df38b0f4216ed76ac51814sm BaseObject.sSystemRegistry.inputGameInterface.setKeys(leftKey, rightKey, jumpKey, attackKey); 5573c1e67e433728684b5f228c5d4f3e5b1457bb271sm } 5583c1e67e433728684b5f228c5d4f3e5b1457bb271sm 5592b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm public int getRobotsDestroyed() { 5602b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm return BaseObject.sSystemRegistry.eventRecorder.getRobotsDestroyed(); 5612b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm } 5622b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 5632b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm public int getPearlsCollected() { 5642b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm return BaseObject.sSystemRegistry.eventRecorder.getPearlsCollected(); 5652b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm } 5662b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 5672b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm public int getPearlsTotal() { 5682b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm return BaseObject.sSystemRegistry.eventRecorder.getPearlsTotal(); 5692b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm } 570cfd74d65d832137e20e193c960802afba73b5d38sm} 571