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 
17 package 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  */
24 public 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 
ScrollerComponent(float speedX, float speedY, int width, int height, Texture texture)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 
ScrollerComponent(float speedX, float speedY, int width, int height, TiledVertexGrid grid)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 
ScrollerComponent()51     public ScrollerComponent() {
52         super();
53         reset();
54         setPhase(ComponentPhases.PRE_DRAW.ordinal());
55     }
56 
57     @Override
reset()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 
setScrollSpeed(float speedX, float speedY)70     public void setScrollSpeed(float speedX, float speedY) {
71         mSpeedX = speedX;
72         mSpeedY = speedY;
73     }
74 
setup(float speedX, float speedY, int width, int height)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 
setUseTexture(Texture texture)84     public void setUseTexture(Texture texture) {
85         mTexture = texture;
86     }
87 
88     @Override
update(float timeDelta, BaseObject parent)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 
setRenderComponent(RenderComponent render)118     public void setRenderComponent(RenderComponent render) {
119         mRenderComponent = render;
120     }
121 }
122