1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.replica.replicaisland;
18
19/**
20 * Adjusts the scroll position of a drawable object based on the camera's focus position.
21 * May be used to scroll a ScrollableBitmap or TiledWorld to match the camera.  Uses DrawableFactory
22 * to allocate fire-and-forget drawable objects every frame.
23 */
24public class ScrollerComponent extends GameComponent {
25    private int mWidth;
26    private int mHeight;
27    private float mHalfWidth;
28    private float mHalfHeight;
29    private RenderComponent mRenderComponent;
30    private float mSpeedX;
31    private float mSpeedY;
32    private Texture mTexture;
33    private TiledVertexGrid mVertGrid;
34
35    public ScrollerComponent(float speedX, float speedY, int width, int height, Texture texture) {
36        super();
37        reset();
38        setup(speedX, speedY, width, height);
39        setUseTexture(texture);
40        setPhase(ComponentPhases.PRE_DRAW.ordinal());
41    }
42
43    public ScrollerComponent(float speedX, float speedY, int width, int height, TiledVertexGrid grid) {
44        super();
45        reset();
46        setup(speedX, speedY, width, height);
47        mVertGrid = grid;
48        setPhase(ComponentPhases.PRE_DRAW.ordinal());
49    }
50
51    public ScrollerComponent() {
52        super();
53        reset();
54        setPhase(ComponentPhases.PRE_DRAW.ordinal());
55    }
56
57    @Override
58    public void reset() {
59        mWidth = 0;
60        mHeight = 0;
61        mHalfWidth = 0.0f;
62        mHalfHeight = 0.0f;
63        mRenderComponent = null;
64        mSpeedX = 0.0f;
65        mSpeedY = 0.0f;
66        mTexture = null;
67        mVertGrid = null;
68    }
69
70    public void setScrollSpeed(float speedX, float speedY) {
71        mSpeedX = speedX;
72        mSpeedY = speedY;
73    }
74
75    public void setup(float speedX, float speedY, int width, int height) {
76        mSpeedX = speedX;
77        mSpeedY = speedY;
78        mWidth = width;
79        mHeight = height;
80        mHalfWidth = sSystemRegistry.contextParameters.gameWidth / 2.0f; //width / 2.0f;
81        mHalfHeight = sSystemRegistry.contextParameters.gameHeight / 2.0f; //height / 2.0f;
82    }
83
84    public void setUseTexture(Texture texture) {
85        mTexture = texture;
86    }
87
88    @Override
89    public void update(float timeDelta, BaseObject parent) {
90        final DrawableFactory drawableFactory = sSystemRegistry.drawableFactory;
91        if (mRenderComponent != null && drawableFactory != null) {
92            ScrollableBitmap background;
93            if (mVertGrid != null) {
94                TiledBackgroundVertexGrid bg = drawableFactory.allocateTiledBackgroundVertexGrid();
95                bg.setGrid(mVertGrid);
96                background = bg;
97            } else {
98                background = drawableFactory.allocateScrollableBitmap();
99                background.setTexture(mTexture);
100            }
101
102            background.setWidth(mWidth);
103            background.setHeight(mHeight);
104
105            CameraSystem camera = sSystemRegistry.cameraSystem;
106
107            float originX = camera.getFocusPositionX() - mHalfWidth;
108            float originY = camera.getFocusPositionY() - mHalfHeight;
109
110            originX *= mSpeedX;
111            originY *= mSpeedY;
112
113            background.setScrollOrigin(originX, originY);
114            mRenderComponent.setDrawable(background);
115        }
116    }
117
118    public void setRenderComponent(RenderComponent render) {
119        mRenderComponent = render;
120    }
121}
122