| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| |
| package com.replica.replicaisland; |
| |
| public class LevelBuilder extends BaseObject { |
| private final static int THEME_GRASS = 0; |
| private final static int THEME_ISLAND = 1; |
| private final static int THEME_SEWER = 2; |
| private final static int THEME_UNDERGROUND = 3; |
| private final static int THEME_LAB = 4; |
| private final static int THEME_LIGHTING = 5; |
| private final static int THEME_TUTORIAL = 6; |
| |
| |
| private final static int BACKGROUND_SUNSET = 0; |
| private final static int BACKGROUND_ISLAND = 1; |
| private final static int BACKGROUND_SEWER = 2; |
| private final static int BACKGROUND_UNDERGROUND = 3; |
| private final static int BACKGROUND_FOREST = 4; |
| private final static int BACKGROUND_ISLAND2 = 5; |
| private final static int BACKGROUND_LAB = 6; |
| |
| public LevelBuilder() { |
| super(); |
| } |
| |
| @Override |
| public void reset() { |
| } |
| |
| |
| public GameObject buildBackground(int backgroundImage, int levelWidth, int levelHeight) { |
| // Generate the scrolling background. |
| TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; |
| |
| GameObject background = new GameObject(); |
| |
| if (textureLibrary != null) { |
| |
| int backgroundResource = -1; |
| |
| switch (backgroundImage) { |
| case BACKGROUND_SUNSET: |
| backgroundResource = R.drawable.background_sunset; |
| break; |
| case BACKGROUND_ISLAND: |
| backgroundResource = R.drawable.background_island; |
| break; |
| case BACKGROUND_SEWER: |
| backgroundResource = R.drawable.background_sewage; |
| break; |
| case BACKGROUND_UNDERGROUND: |
| backgroundResource = R.drawable.background_underground; |
| break; |
| case BACKGROUND_FOREST: |
| backgroundResource = R.drawable.background_grass2; |
| break; |
| case BACKGROUND_ISLAND2: |
| backgroundResource = R.drawable.background_island2; |
| break; |
| case BACKGROUND_LAB: |
| backgroundResource = R.drawable.background_lab01; |
| break; |
| default: |
| assert false; |
| } |
| |
| if (backgroundResource > -1) { |
| |
| // Background Layer // |
| RenderComponent backgroundRender = new RenderComponent(); |
| backgroundRender.setPriority(SortConstants.BACKGROUND_START); |
| |
| ContextParameters params = sSystemRegistry.contextParameters; |
| // The background image is ideally 1.5 times the size of the largest screen axis |
| // (normally the width, but just in case, let's calculate it). |
| final int idealSize = (int)Math.max(params.gameWidth * 1.5f, params.gameHeight * 1.5f); |
| int width = idealSize; |
| int height = idealSize; |
| |
| ScrollerComponent scroller3 = |
| new ScrollerComponent(0.0f, 0.0f, width, height, |
| textureLibrary.allocateTexture(backgroundResource)); |
| scroller3.setRenderComponent(backgroundRender); |
| |
| // Scroll speeds such that the background will evenly match the beginning |
| // and end of the level. Don't allow speeds > 1.0, though; that would be faster than |
| // the foreground, which is disorienting and looks like rotation. |
| final float scrollSpeedX = Math.min((float)(width - params.gameWidth) / (levelWidth - params.gameWidth), 1.0f); |
| final float scrollSpeedY = Math.min((float)(height - params.gameHeight) / (levelHeight - params.gameHeight), 1.0f); |
| |
| |
| scroller3.setScrollSpeed(scrollSpeedX, scrollSpeedY); |
| |
| backgroundRender.setCameraRelative(false); |
| |
| background.add(scroller3); |
| background.add(backgroundRender); |
| } |
| } |
| return background; |
| } |
| |
| public void addTileMapLayer(GameObject background, int priority, float scrollSpeed, |
| int width, int height, int tileWidth, int tileHeight, TiledWorld world, |
| int theme) { |
| |
| int tileMapIndex = 0; |
| switch(theme) { |
| case THEME_GRASS: |
| tileMapIndex = R.drawable.grass; |
| break; |
| case THEME_ISLAND: |
| tileMapIndex = R.drawable.island; |
| break; |
| case THEME_SEWER: |
| tileMapIndex = R.drawable.sewage; |
| break; |
| case THEME_UNDERGROUND: |
| tileMapIndex = R.drawable.cave; |
| break; |
| case THEME_LAB: |
| tileMapIndex = R.drawable.lab; |
| break; |
| case THEME_LIGHTING: |
| tileMapIndex = R.drawable.titletileset; |
| priority = SortConstants.OVERLAY; //hack! |
| break; |
| case THEME_TUTORIAL: |
| tileMapIndex = R.drawable.tutorial; |
| break; |
| default: |
| assert false; |
| } |
| |
| RenderComponent backgroundRender = new RenderComponent(); |
| backgroundRender.setPriority(priority); |
| |
| //Vertex Buffer Code |
| TextureLibrary textureLibrary = sSystemRegistry.shortTermTextureLibrary; |
| TiledVertexGrid bg = new TiledVertexGrid(textureLibrary.allocateTexture(tileMapIndex), |
| width, height, tileWidth, tileHeight); |
| bg.setWorld(world); |
| |
| //TODO: The map format should really just output independent speeds for x and y, |
| // but as a short term solution we can assume parallax layers lock in the smaller |
| // direction of movement. |
| float xScrollSpeed = 1.0f; |
| float yScrollSpeed = 1.0f; |
| |
| if (world.getWidth() > world.getHeight()) { |
| xScrollSpeed = scrollSpeed; |
| } else { |
| yScrollSpeed = scrollSpeed; |
| } |
| |
| ScrollerComponent scroller = new ScrollerComponent(xScrollSpeed, yScrollSpeed, |
| width, height, bg); |
| scroller.setRenderComponent(backgroundRender); |
| |
| background.add(scroller); |
| background.add(backgroundRender); |
| backgroundRender.setCameraRelative(false); |
| } |
| |
| // This method is a HACK to workaround the stupid map file format. |
| // We want the foreground layer to be render priority FOREGROUND, but |
| // we don't know which is the foreground layer until we've added them all. |
| // So now that we've added them all, find foreground layer and make sure |
| // its render priority is set. |
| public void promoteForegroundLayer(GameObject backgroundObject) { |
| backgroundObject.commitUpdates(); // Make sure layers are sorted. |
| final int componentCount = backgroundObject.getCount(); |
| for (int x = componentCount - 1; x >= 0; x--) { |
| GameComponent component = (GameComponent)backgroundObject.get(x); |
| if (component instanceof RenderComponent) { |
| RenderComponent render = (RenderComponent)component; |
| if (render.getPriority() != SortConstants.OVERLAY) { |
| // found it. |
| render.setPriority(SortConstants.FOREGROUND); |
| break; |
| } |
| } |
| } |
| } |
| |
| } |