/* * 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.Actor; import com.google.android.apps.santatracker.doodles.shared.Vector2D; import com.google.android.apps.santatracker.doodles.shared.WatermelonBaseActor; import com.google.android.apps.santatracker.doodles.shared.physics.Polygon; import com.google.android.apps.santatracker.doodles.shared.physics.Util; import java.util.ArrayList; import java.util.List; /** * An actor for a watermelon which rolls down the screen. */ public class WatermelonActor extends BounceActor { private static final float SCALE = 2.0f; private static final float LEG_WIDTH = 50; public long ageMs; public long delayMs; private WatermelonBaseActor melonActor; private Vector2D spriteOffset = Vector2D.get(-LEG_WIDTH, 0); public WatermelonActor(WatermelonBaseActor actor, Polygon collisionBody) { super(collisionBody); this.melonActor = actor; } public void setVelocity(Vector2D velocity) { this.velocity.set(velocity); melonActor.velocity.set(velocity); } public void setPosition(Vector2D position) { float collisionBodyOffsetX = position.x - this.position.x; float collisionBodyOffsetY = position.y - this.position.y; collisionBody.move(collisionBodyOffsetX, collisionBodyOffsetY); this.position.set(position).add(spriteOffset); melonActor.position.set(position) .add(spriteOffset.scale(0.5f)) .add(melonActor.bodySprite.frameWidth, melonActor.bodySprite.frameHeight); } @Override public void update(float deltaMs) { super.update(deltaMs); melonActor.update(deltaMs); ageMs += deltaMs; } @Override public void draw(Canvas canvas) { melonActor.draw(canvas); super.draw(canvas); } @Override public boolean resolveCollision(Actor other, float deltaMs) { // Just do bounding box checking since the watermelon's hitbox is a rectangle. if (Util.pointIsWithinBounds(collisionBody.min, collisionBody.max, other.position)) { return false; } return false; } public static WatermelonActor create(Vector2D position, Resources resources) { WatermelonBaseActor actor = new WatermelonBaseActor(resources); Polygon collisionBody = getCollisionPolygon(position, actor.bodySprite.frameWidth * SCALE, 3 * actor.bodySprite.frameHeight / 4 * SCALE); actor.scale = SCALE; WatermelonActor watermelon = new WatermelonActor(actor, collisionBody); watermelon.setPosition(position); return watermelon; } private static Polygon getCollisionPolygon(Vector2D spritePosition, float width, float height) { List<Vector2D> vertices = new ArrayList<>(); // top left vertices.add(Vector2D.get(spritePosition.x + LEG_WIDTH, spritePosition.y)); // top right vertices.add(Vector2D.get(spritePosition.x + width, spritePosition.y)); // bottom right vertices.add( Vector2D.get(spritePosition.x + width, spritePosition.y + height)); // bottom left vertices.add( Vector2D.get(spritePosition.x + LEG_WIDTH, spritePosition.y + height)); return new Polygon(vertices); } }