package com.mediamonks.googleflip.pages.game.physics.control; import android.util.Log; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.physics.box2d.Body; import com.badlogic.gdx.physics.box2d.Contact; import com.badlogic.gdx.physics.box2d.Fixture; import com.badlogic.gdx.physics.box2d.WorldManifold; import com.mediamonks.googleflip.R; import com.mediamonks.googleflip.pages.game.physics.constants.ObjectName; import com.mediamonks.googleflip.util.SoundManager; /** * Level controller for game levels */ public class GameLevelController extends BaseLevelController { private static final String TAG = GameLevelController.class.getSimpleName(); private static final float MIN_BALL_SOUND_SPEED = 5; private static final float MIN_IMPACT_SOUND_SPEED = 2; private static final float MAX_IMPACT_SOUND_SPEED = 35; @Override public void onUpdate(float pSecondsElapsed) { } @Override protected void checkCollision(Contact contact) { if (_runChecks) { checkContact(contact); } } private boolean checkContact(Contact contact) { // ignore not touching contacts if (!contact.isTouching()) return false; Fixture fixtureA = contact.getFixtureA(); if (fixtureA == null) return false; Fixture fixtureB = contact.getFixtureB(); if (fixtureB == null) return false; Body bodyA = fixtureA.getBody(); Body bodyB = fixtureB.getBody(); String nameA = (String) bodyA.getUserData(); String nameB = (String) bodyB.getUserData(); if (nameA == null || nameB == null) { // nameless bodies, check if sound needs to be played checkCollisionSound(contact, bodyA, bodyB); return false; } else if (nameA.equals(ObjectName.EDGE_SENSOR_NAME) || nameB.equals(ObjectName.EDGE_SENSOR_NAME)) { // check edges Log.d(TAG, "onUpdate: OFF THE EDGE"); setBallOut(); return true; } else if (nameA.equals(ObjectName.SINKHOLE_NAME) || nameB.equals(ObjectName.SINKHOLE_NAME)) { // check sinkhole Log.d(TAG, "onUpdate: SINKHOLE"); setLevelComplete(); return true; } return false; } private void checkCollisionSound(Contact contact, Body bodyA, Body bodyB) { WorldManifold manifold = contact.getWorldManifold(); Vector2 contactPoint = manifold.getPoints()[0]; Vector2 vel1 = bodyA.getLinearVelocityFromWorldPoint(contactPoint); Vector2 vel2 = bodyB.getLinearVelocityFromWorldPoint(contactPoint); Vector2 impactVelocity = vel1.sub(vel2); float impactLen = impactVelocity.len(); if (impactLen > MIN_BALL_SOUND_SPEED) { float dot = Math.abs(impactVelocity.dot(manifold.getNormal())); if (dot > MIN_IMPACT_SOUND_SPEED) { float volume = (float) Math.min((dot - MIN_IMPACT_SOUND_SPEED) / MAX_IMPACT_SOUND_SPEED, 1.0); SoundManager.getInstance().play(R.raw.bounce_1, volume); } } } }