#include "main.h"

// キー操作で前後左右移動
void GameMain::keyHandle()
{
	spd.x = 0.0;
	spd.z = 0.0;

	/*
	fk_Vector	vec = window.getPadDirection(0, 0);
	spd.z = vec.y;
	spd.x = vec.x;
	cout << vec.x << "," << vec.y << endl;
	*/

	if(window.getSpecialKeyStatus(FK_UP) == FKUT_SW_PRESS) {
		spd.z = -1.0;
	}
	if(window.getSpecialKeyStatus(FK_DOWN) == FKUT_SW_PRESS) {
		spd.z =  1.0;
	}
	if(window.getSpecialKeyStatus(FK_LEFT) == FKUT_SW_PRESS) {
		spd.x = -1.0;
	}
	if(window.getSpecialKeyStatus(FK_RIGHT) == FKUT_SW_PRESS) {
		spd.x =  1.0;
	}
}

// ジャンプ操作
void GameMain::jump()
{
	if(jumpState == 0) {			// 通常モード
		// zキーを押された瞬間、上昇モードへ移行
		if(window.getKeyStatus('z') == FKUT_SW_DOWN) {
		//if(window.getPadButtonStatus(0, 0) == FKUT_SW_DOWN) {
			jumpState = 1;
			spd.y = 8.0;		// ジャンプの初速度を与える
		}
	} else if(jumpState == 1) {	// 上昇モード
		// 速度を変化させる(擬似的な重力加速度を与える)
		if(spd.y > 4.0) {
			// 上向きの速度があるうちはきつめに減らす
			spd.y -= 1.0;
		} else if(spd.y > 0.0) {
			// 速度が少なくなったら減らす量を減らす
			spd.y -= 0.5;
		} else {
			// 速度が下向きに反転したら下降モードへ移行
			jumpState = 2;
		}
	} else if(jumpState == 2) {	// 下降モード
		// 速度を変化させる(擬似的な重力加速度を与える)
		if(spd.y > -4.0) {
			// 下向きの速度が少ないうちはゆるめに加速
			spd.y -= 0.5;
		} else {
			// 速度がきつくなってきたらきつめに加速
			spd.y -= 1.0;
		}
	}
}

// アイテムゲット
void GameMain::itemCheck()
{
	// 球との当たり判定
	for(int i = 0; i < 5; ++i) {
		if(hitSph[i].checkToSphere(body, back) == true) {
			// 押し戻しではなく、アイテムゲット！みたいな処理を想定
			window.remove(hitSph[i]);
		}
	}
}

// 当たり判定処理
void GameMain::contact()
{
	// 床との当たり判定処理
	if(floor.checkToMovingSphere(body, spd, back) == true) {
		spd = spd-back;
		spd.y = 0.0;
		jumpState = 0;
	}
	// ブロックとの当たり判定
	for(int i = 0; i < 5; ++i) {
		// 当たっていたらtrueが返る
		if(hitBlk[i].checkToMovingSphere(body, spd, back) == true) {
			// ブロックから見ためりこみ具合がbackに入るので、
			// プレイヤー側を動かして調整する場合は逆方向になる
			spd = spd-back;
			spd.y = 0.0;
			jumpState = 0;
		}
	}
}

// 重力チェック
void GameMain::gravityCheck()
{
	// 下向きの速度を用意(関数内で使い捨ての変数は関数内で作ってよい)
	fk_Vector grav(0.0, -0.5, 0.0);

	// 床との当たり判定処理
	if(floor.checkToMovingSphere(body, grav, back) == true) {
		// ぶつかってたら落下はしない
		return;
	}
	// ブロックとの当たり判定
	for(int i = 0; i < 5; ++i) {
		if(hitBlk[i].checkToMovingSphere(body, grav, back) == true) {
			// ぶつかってたら落下はしない
			return;
		}
	}
	// ここまで来てしまったらどのブロックにもぶつかっていないので、落下モードへ移行
	jumpState = 2;
}
