package com.alarmclocksnoozers.runnershigh;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.util.Log;
public class Player{
private static float MAX_JUMP_HEIGHT = Util.getPercentOfScreenHeight(15); //50
//private static float MIN_JUMP_HEIGHT = Util.getPercentOfScreenHeight(5); //30
private float lastPosY;
static public float width;
static public float height;
public float x;
public float y;
private boolean jumping = false;
private boolean jumpingsoundplayed = true;
private boolean onGround = false;
private boolean reachedPeak = false;
private boolean slowSoundplayed = false;
private float jumpStartY;
private float velocity = 0;
private float velocityMax = 0;
private float velocityDownfallSpeed = 0;
private Rect playerRect;
private Rect ObstacleRect;
private float speedoffsetX = 0;
private float speedoffsetXStart;
private float speedoffsetXMax;
private float speedoffsetXStep;
private Bitmap playerSpriteImg = null;
public Sprite playerSprite;
private boolean fingerOnScreen = false;
private float bonusVelocity = 0;
private float bonusVelocityDownfallSpeed = 0;
public int bonusItems = 0;
private int bonusScorePerItem = 200;
public Player(Context context, OpenGLRenderer glrenderer, int ScreenHeight) {
x = Util.getPercentOfScreenWidth(9); //70;
y = Settings.FirstBlockHeight+Util.getPercentOfScreenHeight(4);
width = Util.getPercentOfScreenWidth(9); //40; dicker //40; nyan cat //60; nyan cat pre minimalize //62; playersprite settings
height = width*Util.mWidthHeightRatio; //40; dicker //30; nyan cat //42; nyan cat pre minimalize //63; playersprite settings
velocityMax = Util.getPercentOfScreenHeight(3); //9 Util.getPercentOfScreenHeight(1.875f)
velocityDownfallSpeed = velocityMax/30.0f;
bonusVelocityDownfallSpeed = velocityDownfallSpeed / 6.0f;
speedoffsetXStart = x;
speedoffsetXMax = Util.getPercentOfScreenWidth(7);
speedoffsetXStep = Util.getPercentOfScreenWidth(0.002f);
playerSpriteImg = Util.loadBitmapFromAssets("game_character_spritesheet.png");
playerSprite = new Sprite(x, y, 0.5f, width, height, 25, 8);
playerSprite.loadBitmap(playerSpriteImg);
glrenderer.addMesh(playerSprite);
playerRect = new Rect();
playerRect.left =(int)x;
playerRect.top =(int)(y+height);
playerRect.right =(int)(x+width);
playerRect.bottom =(int)y;
ObstacleRect = new Rect();
}
public void cleanup() {
if (playerSpriteImg != null) playerSpriteImg.recycle();
}
public void setJump(boolean jump) {
fingerOnScreen = jump;
if(!jump)
{
reachedPeak = true;
bonusVelocity = 0.0f;
}
if(reachedPeak || !onGround) return;
jumpStartY = y;
jumping = true;
if(jump)
jumpingsoundplayed = false;
}
public boolean update() {
playerSprite.updatePosition(x, y);
playerSprite.tryToSetNextFrame();
if(jumpingsoundplayed==false){
SoundManager.playSound(3, 1);
jumpingsoundplayed = true;
}
if (jumping && !reachedPeak) {
velocity += 1.5f * (MAX_JUMP_HEIGHT - (y - jumpStartY)) / 100.f;
if(Settings.RHDEBUG){
Log.d("debug", "y: " + (y));
Log.d("debug", "y + height: " + (y + height));
//Log.d("debug", "velocity: " + velocity);
//Log.d("debug", "modifier: " + (MAX_JUMP_HEIGHT - (y - jumpStartY)) / 100.0f);
//Log.d("debug", "MAX_JUMP_HEIGHT - (y - jumpStartY): " + (MAX_JUMP_HEIGHT - (y - jumpStartY)));
}
if(y - jumpStartY >= MAX_JUMP_HEIGHT)
{
reachedPeak = true;
}
}
else
{
velocity -= velocityDownfallSpeed;
}
if (velocity < -velocityMax)
velocity = -velocityMax;
else if (velocity > velocityMax)
velocity = velocityMax;
y += velocity + bonusVelocity;
bonusVelocity-= bonusVelocityDownfallSpeed;
if (bonusVelocity < 0)
bonusVelocity = 0;
playerRect.left =(int)x;
playerRect.top =(int)(y+height);
playerRect.right =(int)(x+width);
playerRect.bottom =(int)y;
onGround = false;
for (int i = 0; i < Level.maxBlocks; i++)
{
if( checkIntersect(playerRect, Level.blockData[i].BlockRect) )
{
if(lastPosY >= Level.blockData[i].mHeight && velocity <= 0)
{
y=Level.blockData[i].mHeight;
velocity = 0;
reachedPeak = false;
jumping = false;
onGround = true;
bonusVelocity = 0.0f;
}
else{
// false -> player stops at left -> block mode
// true -> player goes through left side -> platform mode
return false;
}
}
}
lastPosY = y;
if(speedoffsetX<speedoffsetXMax ) //50
speedoffsetX += speedoffsetXStep; //0.01
x=speedoffsetXStart+speedoffsetX;
if(y + height < 0){
y = -height;
return false;
}
return true;
}
public boolean collidedWithObstacle(float levelPosition) {
for(int i = 0; i < Level.maxObstaclesJumper; i++)
{
ObstacleRect.left = (int)Level.obstacleDataJumper[i].x;
ObstacleRect.top = (int)Level.obstacleDataJumper[i].y+(int)Level.obstacleDataJumper[i].height;
ObstacleRect.right = (int)Level.obstacleDataJumper[i].x+(int)Level.obstacleDataJumper[i].width;
ObstacleRect.bottom = (int)Level.obstacleDataJumper[i].y;
if( checkIntersect(playerRect, ObstacleRect) && !Level.obstacleDataJumper[i].didTrigger)
{
Level.obstacleDataJumper[i].didTrigger=true;
SoundManager.playSound(6, 1);
velocity = Util.getPercentOfScreenHeight(2.6f);//6; //katapultiert den player wie ein trampolin nach oben
if (fingerOnScreen)
bonusVelocity = Util.getPercentOfScreenHeight(1.5f);
}
}
for(int i = 0; i < Level.maxObstaclesSlower; i++)
{
ObstacleRect.left = (int)Level.obstacleDataSlower[i].x;
ObstacleRect.top = (int)Level.obstacleDataSlower[i].y+(int)Level.obstacleDataSlower[i].height;
ObstacleRect.right = (int)Level.obstacleDataSlower[i].x+(int)Level.obstacleDataSlower[i].width;
ObstacleRect.bottom = (int)Level.obstacleDataSlower[i].y;
if( checkIntersect(playerRect, ObstacleRect) && !Level.obstacleDataSlower[i].didTrigger)
{
Level.obstacleDataSlower[i].didTrigger=true;
//TODO: prevent playing sound 2x or more
if(!slowSoundplayed){
SoundManager.playSound(5, 1);
slowSoundplayed=true;
}
return true; //slow down player fast
}
}
for(int i = 0; i < Level.maxObstaclesBonus; i++)
{
ObstacleRect.left = (int)Level.obstacleDataBonus[i].x;
ObstacleRect.top = (int)Level.obstacleDataBonus[i].y+(int)Level.obstacleDataBonus[i].height;
ObstacleRect.right = (int)Level.obstacleDataBonus[i].x+(int)Level.obstacleDataBonus[i].width;
ObstacleRect.bottom = (int)Level.obstacleDataBonus[i].y;
if( checkIntersect(playerRect, ObstacleRect) && !Level.obstacleDataBonus[i].didTrigger)
{
SoundManager.playSound(8, 1);
Level.obstacleDataBonus[i].didTrigger=true;
Level.obstacleDataBonus[i].bonusScoreEffect.effectX = Level.obstacleDataBonus[i].x;
Level.obstacleDataBonus[i].bonusScoreEffect.effectY = Level.obstacleDataBonus[i].y;
Level.obstacleDataBonus[i].bonusScoreEffect.doBonusScoreEffect=true;
bonusItems++;
Level.obstacleDataBonus[i].z= -1;
}
}
slowSoundplayed=false;
return false;
}
public boolean checkIntersect(Rect playerRect, Rect blockRect) {
if(playerRect.bottom >= blockRect.bottom && playerRect.bottom <= blockRect.top)
{
if(playerRect.right >= blockRect.left && playerRect.right <= blockRect.right )
return true;
else if(playerRect.left >= blockRect.left && playerRect.left <= blockRect.right )
return true;
}
else if(playerRect.top >= blockRect.bottom && playerRect.top <= blockRect.top){
if(playerRect.right >= blockRect.left && playerRect.right <= blockRect.right )
return true;
else if(playerRect.left >= blockRect.left && playerRect.left <= blockRect.right )
return true;
}
//blockrect in playerrect
if(blockRect.bottom >= playerRect.bottom && blockRect.bottom <= playerRect.top)
if(blockRect.right >= playerRect.left && blockRect.right <= playerRect.right )
return true;
return false;
}
public void reset() {
velocity = 0;
x = 70; // x/y is bottom left corner of picture
y = Settings.FirstBlockHeight+20;
speedoffsetX = 0;
bonusItems = 0;
}
public int getBonusScore()
{
return bonusItems * bonusScorePerItem;
}
}