예제 #1
0
파일: object.cpp 프로젝트: Taka03/Nolfeus
void CObject::CheckHitRect(CBullet &bullet, CPlayer &player)
{
	/*敵弾とプレイヤーとの処理*/
	for(int i = 0;i < BULLET_MAX;i++)
	{
		if(bullet.Flag[i])
		{
			if(HitCheck(bullet.HitRect[i], player.HitRect) )
			{
				if(player.IsWolf)
				{
					bullet.Flag[i] = FALSE;
				}
				
				else if(player.IsClear)
				{
				
				}
				
				else
				{
					if(!player.IsInvince)
					{
						player.CalcDamage(bullet.Attack, player.Defence);
						player.KnockBack();
					}
					
					bullet.Flag[i] = FALSE;
				}
			}
			
			if(player.umbrella.IsExist)
			{
				if(HitCheck(bullet.HitRect[i], player.umbrella.HitRect) )
				{
					if(player.umbrella.counter >= 5 && player.umbrella.counter <= 8)
					{
						Se[SE_REFRECT].PlaySoundA();
						bullet.Flag[i] = FALSE;
						player.bullet.CreateRefBullet(player.umbrella.Get_PosX(), player.umbrella.Get_PosY(), i);
						player.bullet.IsRefrect[i] = TRUE;
					}
					
					else
					{
						player.bullet.IsRefrect[i] = FALSE;
					}
						
				}
			}
			
		}
	}
	
}
예제 #2
0
파일: object.cpp 프로젝트: Taka03/Nolfeus
//===============================================
//当たり判定処理
//===============================================
void CObject::CheckHitRect(CPlayer &player, CEnemy &enemy)
{
	if(enemy.IsExist)
	{
		if(HitCheck(player.HitRect, enemy.HitRect) )
		{
			if(player.IsWolf)
			{
				enemy.CalcDamage(30, 0);
			}
			
			else if(player.IsClear)
			{
			
			}
			
			else
			{
				if(!player.IsInvince)
				{
					player.CalcDamage(enemy.Attack, player.Defence);
					player.KnockBack();
				}
			}
			
		}
	}
	
}
예제 #3
0
파일: object.cpp 프로젝트: Taka03/Nolfeus
void CObject::CheckHitRect(CBullet &bullet, CBoss &boss)
{
	for(int i = 0;i < BULLET_MAX;i++)
	{
		if(bullet.Flag[i])
		{	
			if(boss.IsExist && boss.counter > 200)
			{
				if(HitCheck(bullet.HitRect[i], boss.HitRect) )
				{
					bullet.Flag[i] = FALSE;
					
					bullet.IsRefrect[i] = FALSE;
					
					bullet.SetPosition(i);
					
					boss.CalcDamage(bullet.Attack, boss.Defence);
					
					AddScore(boss.Score);
					
				}
			}
		}
		
	}

}
예제 #4
0
파일: object.cpp 프로젝트: Taka03/Nolfeus
void CObject::CheckHitRect(CPlayer &player, CBoss &boss)
{
	if(boss.IsExist && boss.counter > 200)
	{
		if(HitCheck(player.HitRect, boss.HitRect) )
		{
			if(player.IsWolf)
			{
				boss.CalcDamage(30, 0);	
			}
			
			else if(player.IsClear)
			{
			
			}
			
			else
			{
				if(!player.IsInvince)
				{
					player.CalcDamage(boss.Attack, player.Defence);
					player.KnockBack();
				}
			}
		}
	}

}
예제 #5
0
파일: object.cpp 프로젝트: Taka03/Nolfeus
void CObject::CheckHitRect(CBullet &bullet, CEnemy &enemy)
{
	for(int i = 0;i < BULLET_MAX;i++)
	{
		if(bullet.Flag[i])
		{
			if(enemy.IsExist)
			{
				if(HitCheck(bullet.HitRect[i], enemy.HitRect) )	
				{
					bullet.Flag[i] = FALSE;
					
					bullet.IsRefrect[i] = FALSE;
						
					bullet.SetPosition(i);
						
					AddScore(enemy.Score);
						
					enemy.CalcDamage(bullet.Attack, enemy.Defence);
					
					Se[SE_REFRECT].PlaySoundA();
				}
					
			}
		}
				
		enemy.Dead();
					
	}

}
예제 #6
0
void SQRChartLineGraph::OnMouseMove(uint32 hostIndex, uint32 nFlags, int32 x, int32 y)
{
	const int index = HitCheck(x, y);
	if(index >= 0)
	{
		//TRUSERLINE("lk-yangmingzhe", "mouse x,y=%d,%d point x,y=%d,%f", x, y, index, m_data[index]);
		OnHitPoint(hostIndex, x, y, index, m_data[index]);
	}
	else
	{
		m_phost->SetMouseOverDesc("");
	}
}
예제 #7
0
void Pshot::Update()
{
	shiftLevel = Player::GetShiftLevel();						// シフトレベルを手に入れる

	bomb->Update();
	SetFirePosition(Game::GetPlayerPos().x, Game::GetPlayerPos().y);	// 発射位置を設定
	Input();													// 入力管理
	Move();														// 動き計算
	HitCheck();													// 当たり判定
	effect->Update();											// エフェクト更新
	Reset();													// 弾をリセット
	ShotCount();												// 発射準備のカウント管理
	CopyStaticMem();											// staticメンバに値をコピー
}
예제 #8
0
파일: object.cpp 프로젝트: Taka03/Nolfeus
void CObject::CheckHitRect(CChara &chara, CBoss &boss)
{
	if(chara.IsExist)
	{
		if(boss.IsExist)
		{
			if(HitCheck(chara.HitRect, boss.HitRect ) )
			{
				AddScore(boss.Score);
				boss.CalcDamage(chara.Attack, boss.Defence);
			}
		}
	}
}
예제 #9
0
파일: object.cpp 프로젝트: Taka03/Nolfeus
void CObject::CheckHitRect(CChara &chara, CEnemy &enemy)
{
	if(chara.IsExist)
	{
		if(enemy.IsExist)
		{
			if(HitCheck(chara.HitRect, enemy.HitRect ) )
			{
				AddScore(enemy.Score);
				enemy.CalcDamage(chara.Attack, enemy.Defence);
				enemy.Dead();
			}
		}
	}
}
예제 #10
0
//プレイヤーキャラが他のキャラ、壁、お助けブロックと接触したときの処理
void HitChara(void)
{
	//他プレイヤーとの接触判定
		if(HitCheck(PlayP[i],PlayP[1-i],16,16)==TRUE){
			POINT2D Haziki;

			Haziki.x=(PlayP[i].x-PlayP[1-i].x)/4.0f;
			Haziki.y=(PlayP[i].y-PlayP[1-i].y)/4.0f;
			
			PlayP[i].x+=Haziki.x;		//自キャラ吹き飛び量
			PlayP[i].y+=Haziki.y;
			PlayP[1-i].x-=Haziki.x;		//相手キャラ吹き飛び量
			PlayP[1-i].y-=Haziki.y;
		}

		//壁との当たり判定
		if(PlayP[i].x<-274) PlayP[i].x+=2.0;
		if(PlayP[i].x>274)  PlayP[i].x-=2.0;
		if(PlayP[i].y<-170) PlayP[i].y+=2.0;
		if(PlayP[i].y>86)  PlayP[i].y-=2.0;

		

		//お助けブロックとの接触判定
		for(j=0; j<2 ; j++){
            if(HitCheck(PlayP[i],Iti[j],16,16)==TRUE){
				POINT2D Haziki;

				Haziki.x=(PlayP[i].x-Iti[j].x)/4.0f;
				Haziki.y=(PlayP[i].y-Iti[j].y)/4.0f;
			
				PlayP[i].x+=Haziki.x;
				PlayP[i].y+=Haziki.y;
			}
		}
}
예제 #11
0
파일: object.cpp 프로젝트: Taka03/Nolfeus
void CObject::CheckHitRect(CBullet &bullet, CChara &chara, CBoss &boss)
{
	if(chara.IsExist)
	{
		if(boss.IsExist && boss.counter > 200)
		{
			if(HitCheck(chara.HitRect, boss.HitRect) )
			{
				boss.CalcDamage(chara.Attack, boss.Defence);
				
				chara.IsExist = FALSE;
				
				bullet.ChargeFlag = FALSE;
				
				AddScore(boss.Score);
			}	
		}
	}
}
예제 #12
0
//プレーヤー関連に対する敵1体のコリジョンを取る
void Enemy::HitCheck2Player(){
	//敵と自弾が接触しているか?
	int damage = _playerPtr->BltGrp.HitCheckAll(GetX(),GetY(),GetHitW(),GetHitH());
	ReduceHP(damage); //接触している分だけHPを減らす

	//自機と敵が接触しているか?
	if(_playerPtr->GetState() == PlayerShip::Exist &&
		HitCheck(GetX(),GetY(),
		_hitW,_hitH,
		_playerPtr->GetX(), _playerPtr->GetY(),
		PlayerShip::HitRect,PlayerShip::HitRect) == true){
			/*
			_人人 人人_
			> 突然の死 <
			 ̄Y^Y^Y^Y ̄
			*/
			_playerPtr->SetDead();
	}
}
예제 #13
0
파일: object.cpp 프로젝트: Taka03/Nolfeus
void CObject::CheckHitRect(CBullet &bullet, CChara &chara)
{
	for(int i = 0;i < BULLET_MAX;i++)
	{
		if(bullet.Flag[i])
		{
			if(chara.IsExist)
			{
				if(HitCheck(bullet.HitRect[i], chara.HitRect) )
				{
					bullet.Flag[i] = FALSE;
					
					bullet.SetPosition(i);
					
					chara.IsExist = FALSE;
				}
			}
		}
	}
}
예제 #14
0
void SceneGame::update(float dt)
{
	//updateCallByChild(dt);  //调用父类的方法,让背景动起来

	//响应加速计
	//ResponseAcceleration(dt);

	//产生星球
	GenerationAsteroid();

	//产生陨石
	GenerationStone();

	GenerationUFO();

	//碰撞检测
	HitCheck();
	HitCheckWithUfo();

	//_brainControlShow->Brain();  //忘记调用这个,导致脑波相关的两个进度条不显示

	//设置游戏显示生命值和分数。
	//_brainControlShow->SetLabelLives(_brainControlShow->_lives, 100);
}
예제 #15
0
파일: bsp.cpp 프로젝트: nikolobin/sandbox
int BSPFinite(BSPNode *bsp)
{
	return !HitCheck(bsp,1,float3(999999,9999999,999999),float3(999999,9999999,999999),NULL);
}
예제 #16
0
void NNBulletManager::Update( float dTime )
{
	NNObject::Update( dTime ); //자식 업데이트
	RemoveCheck();
	HitCheck();
}
예제 #17
0
//ボールが壁、プレイヤーキャラ、お助けブロックに接触した時の処理
void HitBall(void)
{
	//壁との当たり判定
		if(Ball[i].pos.x<-280) Ball[i].mov.x =  fabs(Ball[i].mov.x);
		if(Ball[i].pos.x>280)  Ball[i].mov.x = -fabs(Ball[i].mov.x);
		if(Ball[i].pos.y>226){
			Ball[i].mov.y = -fabs(Ball[i].mov.y);
			if(cpuflag[i] == 1)	CPUT(i);		//CPUはこの瞬間で目標点の計算を行う
		}
	//キャラとの当たり判定
		if(HitCheck(Ball[i].pos,PlayP[i],10,16)==TRUE){
			POINT2D Haziki;

			Ball[i].mov.x = (Ball[i].pos.x - PlayP[i].x) / (170.0f - (nsel * 50));//難易度により速度が変わる
			Ball[i].mov.y = (Ball[i].pos.y - PlayP[i].y) / (170.0f - (nsel * 50));//nselが大きいほど難易度高

			Haziki.x=(Ball[i].pos.x-PlayP[i].x)/6.0f;
			Haziki.y=(Ball[i].pos.y-PlayP[i].y)/6.0f;

			Ball[i].pos.x += Haziki.x;
			Ball[i].pos.y += Haziki.y;
		}
	//お助けブロックとの接触判定
		for(j=0 ; j < 2 ; j++){
			if(HitCheck(Ball[i].pos,Iti[j],10,16)==TRUE){
				POINT2D Haziki;
				
				Ball[i].mov.x = (Ball[i].pos.x - Iti[j].x ) / (170.0f - (nsel * 50));
				Ball[i].mov.y = (Ball[i].pos.y - Iti[j].y ) / (170.0f - (nsel * 50));

				Haziki.x=(Ball[i].pos.x-Iti[j].x)/6.0f;
				Haziki.y=(Ball[i].pos.y-Iti[j].y)/6.0f;

				Ball[i].pos.x += Haziki.x;
				Ball[i].pos.y += Haziki.y;

				if(cpuflag[i] == 1){		//CPUの場合
					if(Ball[i].mov.y > 0){			//玉のY方向の速度が正なら目標点のX座標はボールのX座標
						comT[i].y = 40 - nsel * 90;//Y座標は難易度にあわせて決める(難易度が高いほど下の方で動き回る)
						comT[i].x = Ball[i].pos.x;
					}
					else CPUT(i);					//玉のY方向の速度が負なら目標点計算
				}

				cflag[j] = 30;				//衝突したらブロックの色が変わる、その為の判定用フラグ
				ocunt[j]++;					//数回衝突すると何かが起こる
				Dotti[j] = i;				//衝突した玉はP1のものかP2のものか判定
		
			}
		}
		
		//破壊ブロックとの接触判定
		for(Bloop2 = 0 ; Bloop2 < 4 ; Bloop2++){
			for(Bloop1 = 0 ; Bloop1 < 17 ; Bloop1++){
				if(Blife[Bloop1][Bloop2]>0){			//ライフ0のブロックは対象外
					if(HitCheck(Ball[i].pos , Bpos[Bloop1][Bloop2] , 10 , 16)==TRUE){

						
						
						//跳ね返り方向計算
						Ball[i].mov.x = (Ball[i].pos.x - Bpos[Bloop1][Bloop2].x ) / (170.0f - (nsel * 50));
						Ball[i].mov.y = (Ball[i].pos.y - Bpos[Bloop1][Bloop2].y ) / (170.0f - (nsel * 50));

						if(cpuflag[i] == 1){
							if(Ball[i].mov.y < 0) CPUT(i);//ボールのY方向の速度が負ならCPUの目標点計算
						}

						Blife[Bloop1][Bloop2] -= 1;		//接触したらブロックのライフ−1
						if (Blife[Bloop1][Bloop2] == 0){
							poi[i]++;					//ブロックを破壊したらポイントプラス
							if(poi[i] == 20) fflag = 1; //ポイントが20溜まったらゲーム終了
							chflag[i] = 1;				//キャラ顔変化判定用フラグ=1(喜び顔)
							chcunt[i] = 200;			//カウントが0になるまで顔は喜び顔のまま
							fin++;						//ブロックの破壊数プラス
							if(fin == 68) fflag = 1;	//全てのブロックが壊れたらゲーム終了
						}
					}
				}
			}
		}
}
예제 #18
0
//お助けキャラが壁、プレイヤーキャラ、破壊ブロックに接触した時の処理
void HitOtasuke(void)
{
	//壁との当たり判定
			if(Ball[i].pos.x<-284) Ball[i].mov.x =  fabs(Ball[i].mov.x);
			if(Ball[i].pos.x>284)  Ball[i].mov.x = -fabs(Ball[i].mov.x);
			if(Ball[i].pos.y>230)  Ball[i].mov.y = -fabs(Ball[i].mov.y);

			//お助けブロックとの当たり判定
			for(j=0 ; j < 2 ; j++){
			if(HitCheck(Ball[i].pos,Iti[j],12,16)==TRUE){
			
				Ball[i].mov.x = (Ball[i].pos.x - Iti[j].x ) / 100.0f;
				Ball[i].mov.y = (Ball[i].pos.y - Iti[j].y ) / 100.0f;
				cflag[j] = 30;				//衝突したらブロックの色が変わる、その為の判定用フラグ
			}
		}
			//キャラとの当たり判定
			//お助けブロック1から出たお助けキャラ
			if(i < 5){
                if(HitCheck(Ball[i].pos,PlayP[Dot[0]],12,16)==TRUE){
				Ball[i].mov.x = (Ball[i].pos.x - PlayP[Dot[0]].x) / 100.0f;//お助けイベントを発生させたキャラなら触れる
				Ball[i].mov.y = (Ball[i].pos.y - PlayP[Dot[0]].y) / 100.0f;//Dot[0]=0ならプレイヤー1、1ならプレイヤー2
				}
			}
			//お助けブロック2から出たお助けキャラ
			else{
				if(HitCheck(Ball[i].pos,PlayP[Dot[1]],12,16)==TRUE){
				Ball[i].mov.x = (Ball[i].pos.x - PlayP[Dot[1]].x) / 100.0f;
				Ball[i].mov.y = (Ball[i].pos.y - PlayP[Dot[1]].y) / 100.0f;
				}
			}


		
		//破壊ブロックとの接触判定
		for(Bloop2 = 0 ; Bloop2 < 4 ; Bloop2++){
			for(Bloop1 = 0 ; Bloop1 < 17 ; Bloop1++){
				if(Blife[Bloop1][Bloop2]>0){			//ライフ0のブロックは対象外
					if(HitCheck(Ball[i].pos , Bpos[Bloop1][Bloop2] , 12 , 16)==TRUE){
						
						//跳ね返り方向計算
						Ball[i].mov.x = (Ball[i].pos.x - Bpos[Bloop1][Bloop2].x ) / 100.0f;
						Ball[i].mov.y = (Ball[i].pos.y - Bpos[Bloop1][Bloop2].y ) / 100.0f;

						Blife[Bloop1][Bloop2] -= 1;		//接触したらブロックのライフ−1
						if (Blife[Bloop1][Bloop2] == 0){
							//お助けブロック1から出たお助けキャラ
							if(i < 5){
								poi[Dot[0]]++; //ブロックを破壊したらポイントプラス
								if(poi[Dot[0]] == 20) fflag = 1;
								chflag[Dot[0]] = 1;
								chcunt[Dot[0]] = 200;
							}
							//お助けブロック2から出たお助けキャラ
							else	{
								poi[Dot[1]]++;
								if(poi[Dot[1]] == 20) fflag = 1;
								chflag[Dot[1]] = 1;
								chcunt[Dot[1]] = 200;
							}
							fin++;
							if(fin == 68) fflag = 1;
						}
					}
				}
			}
		}
}
예제 #19
0
void Cf3MapObjectfunya::OnMove()
{
	if (!IsValid()) return;
	if (!m_pParent->IsPlayable()) return;
	if (m_bFirst) { HitCheck(); m_bFirst = false; }
	float Wind = m_pParent->GetWind(floor(m_X/32),floor(m_Y/32));
	float Friction = m_pParent->GetFriction(floor(m_X/32),floor((m_Y+14)/32));
	float Gravity = GetGravity();
	if (m_pParent->ItemCompleted()) Smile();
	if (theSetting->m_Hyper) m_nPower=4;
	// 動かしま〜す
	if (m_State==STANDING||m_State==SLEEPING||m_State==BLINKING) {
		// 立ってるとき
		m_DX -= WINDFACTOR*(m_DX-Wind)*RUNFRICTION;
		BringClose(m_DX,0.0f,Friction);
		if (m_DX==0) m_Direction = DIR_FRONT;
		if (m_State==STANDING && ++m_Sleepy>=30*40/3) Sleep();
		if (m_State==BLINKING && --m_PoseCounter==0) m_State = STANDING;
		if (m_State==STANDING && CApp::random(120)==0) Blink();
		if (m_PowerY<=0 && m_pInput->GetKeyPressed(F3KEY_JUMP)) StartJump();
		if (m_PowerX<=0 && m_pInput->GetKeyPressed(F3KEY_LEFT)) Run(DIR_LEFT);
		if (m_PowerX>=0 && m_pInput->GetKeyPressed(F3KEY_RIGHT)) Run(DIR_RIGHT);
		if (m_pInput->GetKeyPressed(F3KEY_DOWN)) Sit();
		if (m_pInput->GetKeyPushed(F3KEY_ATTACK)) BreatheIn();
		if (!m_HitBottom) {
			Fall();
		}
	}ef(m_State==RUNNING) {
		// 走ってるとき
		int AXL = 0, AXR = 0;
		if (m_PowerX<=0 && m_pInput->GetKeyPressed(F3KEY_LEFT)) AXL = 1;
		if (m_PowerX>=0 && m_pInput->GetKeyPressed(F3KEY_RIGHT)) AXR = 1;
		m_DX -= Friction*(m_DX-Wind)*RUNFRICTION;
		m_DX += Friction*2.0f*(AXR-AXL);
		if (AXL&&!AXR) m_Direction = DIR_LEFT;
		if (AXR&&!AXL) m_Direction = DIR_RIGHT;
		if (!AXL&&!AXR) Stop();
		if (m_PowerY<=0 && m_pInput->GetKeyPressed(F3KEY_JUMP)) StartJump();
		if (m_pInput->GetKeyPressed(F3KEY_DOWN)) Sit();
		if (m_pInput->GetKeyPushed(F3KEY_ATTACK)) BreatheIn();
		if (!m_HitBottom) {
			Fall();
		}
	}ef(m_State==WALKING) {
		// 歩いてるとき
		int AXL = 0, AXR = 0;
		if (m_PowerX<=0 && m_pInput->GetKeyPressed(F3KEY_LEFT)) AXL = 1;
		if (m_PowerX>=0 && m_pInput->GetKeyPressed(F3KEY_RIGHT)) AXR = 1;
		m_DX += WALKACCEL*(AXR-AXL);
		m_DX -= m_DX*WALKFRICTION;
		if (AXL&!AXR) m_Direction = DIR_LEFT;
		if (AXR&!AXL) m_Direction = DIR_RIGHT;
		if (!AXL&!AXR) m_Direction = DIR_FRONT;
		if (!m_pInput->GetKeyPressed(F3KEY_DOWN)) Stop();
		if (m_PowerY<=0 && m_pInput->GetKeyPushed(F3KEY_JUMP)) StartJump();
		if (m_pInput->GetKeyPushed(F3KEY_ATTACK)) BreatheIn();
		if (!m_HitBottom) Fall();
	}ef(m_State==CHARGING) {
		// パワー充填中
		if (m_ChargePower>0) {
			m_ChargePower -= m_ChargeDec;
			if (m_ChargePower<0) m_ChargePower = 0;
		}
		m_X -= m_DX;
		if (m_pInput->GetKeyPushed(F3KEY_DOWN)) Sit();
		if (m_pInput->GetKeyPushed(F3KEY_ATTACK)) BreatheIn();
		if (!m_pInput->GetKeyPressed(F3KEY_JUMP)) Jump();
		if (!m_HitBottom) Fall();
	}ef(m_State==JUMPING) {
		// 空中
		if (m_DY>=0) {
			int AXL = 0, AXR = 0;
			if (m_PowerX<=0 && m_pInput->GetKeyPressed(F3KEY_LEFT)) AXL = 1;
			if (m_PowerX>=0 && m_pInput->GetKeyPressed(F3KEY_RIGHT)) AXR = 1;
			m_DX -= (m_DX-Wind)*JUMPFRICTIONX;
			m_DX += JUMPACCEL*(AXR-AXL);
			if (AXL&!AXR) m_Direction = DIR_LEFT;
			if (AXR&!AXL) m_Direction = DIR_RIGHT;
		}
		if (m_HitLeft||m_HitRight) m_Direction = DIR_FRONT;
		m_DY += Gravity;
		if (m_DY>=0) {
			if (m_PowerY>=0 && m_pInput->GetKeyPressed(F3KEY_DOWN)) m_DY += Gravity*ADDGRAVITY;
			m_DY -= m_DY*JUMPFRICTIONY;
			if (m_pInput->GetKeyPressed(F3KEY_UP)) {
				m_DY += Gravity;
				m_DY -= m_DY*JUMPFRICTIONY;
			}
		}
		if (m_pInput->GetKeyPushed(F3KEY_ATTACK)) BreatheIn();
		if (m_HitBottom) Land();
	}ef(m_State==BREATHEIN) {
		// 冷気充填中
		m_ChargePower+=1.0f;
		if (m_pInput->GetKeyPushed(F3KEY_LEFT)) m_Direction = DIR_LEFT;
		if (m_pInput->GetKeyPushed(F3KEY_RIGHT)) m_Direction = DIR_RIGHT;
		if (m_pInput->GetKeyPushed(F3KEY_UP)) m_Direction = DIR_FRONT;
		if (m_HitBottom) {
			m_DX -= WINDFACTOR*(m_DX-Wind)*RUNFRICTION;
			BringClose(m_DX,0.0f,Friction);
			if (m_pInput->GetKeyPushed(F3KEY_DOWN)) Sit();
		}else {
			m_ChargePower+=1.0f;
			if (m_DY>=0) {
				m_DX -= (m_DX-Wind)*JUMPFRICTIONX;
			}
			m_DY += Gravity;
			if (m_DY>=0) {
				m_DY -= m_DY*JUMPFRICTIONY;
			}
		}
		if (!m_pInput->GetKeyPressed(F3KEY_ATTACK)) BreatheOut();
	}ef(m_State==BREATHEOUT) {
		// 冷気放出!!
		m_ChargePower-=1.0f;
		if (m_HitBottom) {
			m_DX -= WINDFACTOR*(m_DX-Wind)*RUNFRICTION;
			BringClose(m_DX,0.0f,Friction);
		}else {
			if (m_DY>=0) {
				m_DX -= (m_DX-Wind)*JUMPFRICTIONX;
			}
			m_DY += Gravity;
			if (m_DY>=0) {
				m_DY -= m_DY*JUMPFRICTIONY;
			}
		}
		if (m_ChargePower<=0.0f) {
			if (m_nPower) {
				if (m_HitBottom) Land(); else Fall();
			}else {
				Tire();
			}
		}
	}ef(m_State==TIRED) {
		// ちかれたー!
		m_PoseCounter--;
		if (m_HitBottom) {
			m_DX -= WINDFACTOR*(m_DX-Wind)*RUNFRICTION;
			BringClose(m_DX,0.0f,Friction);
		}else {
			m_DX -= (m_DX-Wind)*JUMPFRICTIONX;
			if (m_HitLeft||m_HitRight) m_Direction = DIR_FRONT;
			m_DY += Gravity;
			m_DY -= m_DY*JUMPFRICTIONY;
		}
		if (m_PoseCounter==0) Land();
	}ef(m_State==FROZEN) {
		// 凍っちゃった…
		m_PoseCounter--;
		if (m_HitBottom) {
			m_DX -= WINDFACTOR*(m_DX-Wind)*RUNFRICTION/5;
			BringClose(m_DX,0.0f,Friction/5);
		}else {
			m_DX -= (m_DX-Wind)*JUMPFRICTIONX/5;
			m_DY += Gravity*(1+ADDGRAVITY);
			m_DY -= m_DY*JUMPFRICTIONY/5;
		}
		if (m_PoseCounter==0) Land();
	}
	// 速度飽和(めり込み防止)
	Saturate(-RUNMAX,m_DX,RUNMAX);
	Saturate(-JUMPMAX,m_DY,FALLMAX);
	// 実際の移動+当たり判定
	// 1回の移動ごとに当たり判定
	// という手順ですり抜けバグは解消されるはず
	m_HitLeft = m_HitRight = m_HitTop = m_HitBottom = false;
	m_X += m_DX;
	HitCheck();
	if (!m_HitTop&&!m_HitBottom) {
		m_Y += m_DY;
		HitCheck();
	}
}