/* * 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.res.Resources; import android.graphics.Canvas; import com.google.android.apps.santatracker.doodles.shared.AnimatedSprite; import com.google.android.apps.santatracker.doodles.shared.AnimatedSprite.AnimatedSpriteListener; import com.google.android.apps.santatracker.doodles.shared.EventBus; import com.google.android.apps.santatracker.doodles.shared.MultiSpriteActor; import com.google.android.apps.santatracker.doodles.shared.Sprites; import com.google.android.apps.santatracker.doodles.shared.Vector2D; import com.google.android.apps.santatracker.doodles.shared.physics.Polygon; import java.util.HashMap; import java.util.Map; /** * The hand grab obstacle in the swimming game. */ public class HandGrabActor extends BoundingBoxSpriteActor { private static final String X_SPRITE = "x"; private static final String LEMON_GRAB_SPRITE = "lemon grab"; private static final String LEMON_GRAB_SPRITE_FLIPPED = "lemon grab flipped"; private static final float COLLISION_DISTANCE_THRESHOLD = 100; private static final Vector2D[] VERTEX_OFFSETS = { Vector2D.get(0, 0), Vector2D.get(110f, 0), Vector2D.get(110f, 146.0f), Vector2D.get(0, 146.0f) }; private static final Map<String, Vector2D> OFFSET_MAP; static { OFFSET_MAP = new HashMap<>(); OFFSET_MAP.put(X_SPRITE, Vector2D.get()); OFFSET_MAP.put(LEMON_GRAB_SPRITE, Vector2D.get(-100, -100)); OFFSET_MAP.put(LEMON_GRAB_SPRITE_FLIPPED, Vector2D.get(100, -100)); } public HandGrabActor(Polygon collisionBody, MultiSpriteActor spriteActor) { super(collisionBody, spriteActor, Vector2D.get(OFFSET_MAP.get(X_SPRITE)).scale(SwimmerActor.SWIMMER_SCALE), HAND_GRAB); zIndex = -1; scale = SwimmerActor.SWIMMER_SCALE; } @Override public void draw(Canvas canvas) { if (hidden) { return; } super.draw(canvas); } public void setSprite(String key) { if (key.equals(X_SPRITE)) { zIndex = -1; } else if (key.equals(LEMON_GRAB_SPRITE)) { zIndex = 3; } ((MultiSpriteActor) spriteActor).setSprite(key); if (isFlippedX() && key.equals(LEMON_GRAB_SPRITE)) { spriteOffset.set(OFFSET_MAP.get(LEMON_GRAB_SPRITE_FLIPPED)).scale(scale); } else { spriteOffset.set(OFFSET_MAP.get(key)).scale(scale); } } public boolean isFlippedX() { return ((MultiSpriteActor) spriteActor).sprites.get(LEMON_GRAB_SPRITE).isFlippedX(); } @Override protected boolean resolveCollisionInternal(final SwimmerActor swimmer) { if (swimmer.isInvincible || swimmer.isUnderwater) { return false; } // Only collide if the two actor's minimum collision coordinates are close together. This is // so that the swimmer will only collide with the hand grab if it is right over the x. if (swimmer.collisionBody.min.distanceTo(collisionBody.min) < COLLISION_DISTANCE_THRESHOLD) { swimmer.collide(type); setSprite(LEMON_GRAB_SPRITE); spriteActor.sprite.addListener(new AnimatedSpriteListener() { @Override public void onFrame(int index) { if (index == 10) { swimmer.hidden = true; swimmer.spriteActor.sprite.setPaused(true); EventBus.getInstance().sendEvent(EventBus.VIBRATE); } } @Override public void onFinished() { hidden = true; swimmer.isDead = true; } }); } return false; } public static HandGrabActor create(Vector2D position, Resources res) { Map<String, AnimatedSprite> spriteMap = new HashMap<>(); boolean shouldFlip = position.x + VERTEX_OFFSETS[1].x / 2 < SwimmingModel.LEVEL_WIDTH / 2; AnimatedSprite lemonGrabSprite = AnimatedSprite.fromFrames(res, Sprites.penguin_swim_canegrab); lemonGrabSprite.setLoop(false); lemonGrabSprite.setFlippedX(shouldFlip); spriteMap.put(LEMON_GRAB_SPRITE, lemonGrabSprite); spriteMap.put(X_SPRITE, AnimatedSprite.fromFrames(res, Sprites.penguin_swim_candy)); MultiSpriteActor spriteActor = new MultiSpriteActor(spriteMap, X_SPRITE, position, Vector2D.get(0, 0)); Polygon boundingBox = getBoundingBox(position, VERTEX_OFFSETS, SwimmerActor.SWIMMER_SCALE); return new HandGrabActor(boundingBox, spriteActor); } }