/*
* Copyright (C) 2016 Google Inc. All Rights Reserved.
*
* 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.google.android.apps.santatracker.doodles.tilt;
import android.content.Context;
import com.google.android.apps.santatracker.doodles.shared.Actor;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* A class for managing obstacles in the swimming game.
*/
public class ObstacleManager extends Actor {
private static final String TAG = ObstacleManager.class.getSimpleName();
private static final int NUM_INITIAL_CHUNKS = 4;
private static final int RETAIN_THRESHOLD = 2000;
private LinkedList<SwimmingLevelChunk> levelChunks;
private SwimmerActor swimmer;
public ObstacleManager(SwimmerActor swimmer, Context context) {
levelChunks = new LinkedList<>();
SwimmingLevelChunk.generateAllLevelChunks(-1000, context);
for (int i = 1; i < NUM_INITIAL_CHUNKS; i++) {
levelChunks.add(SwimmingLevelChunk.getNextChunk());
}
this.swimmer = swimmer;
zIndex = 1;
}
@Override
public void update(float deltaMs) {
for (int i = 0; i < levelChunks.size(); i++) {
levelChunks.get(i).update(deltaMs);
}
if (!levelChunks.isEmpty()) {
SwimmingLevelChunk lastChunk = levelChunks.getLast();
// If the swimmer is within 2000 units of the end of the last chunk, add a new one.
if (swimmer.position.y - lastChunk.endY < RETAIN_THRESHOLD) {
SwimmingLevelChunk nextChunk = SwimmingLevelChunk.getNextChunk();
if (nextChunk != null) {
levelChunks.add(nextChunk);
}
}
if (levelChunks.getFirst().endY - swimmer.position.y > RETAIN_THRESHOLD) {
levelChunks.remove(0);
}
}
}
public void resolveCollisions(SwimmerActor swimmer, float deltaMs) {
for (int i = 0; i < levelChunks.size(); i++) {
levelChunks.get(i).resolveCollisions(swimmer, deltaMs);
}
}
public List<Actor> getActors() {
List<Actor> actors = new ArrayList<>();
for (int i = 0; i < levelChunks.size(); i++) {
actors.addAll(levelChunks.get(i).obstacles);
}
return actors;
}
}