Пример #1
0
//----------------------------------
//機能:当たり判定
//引数:pTarget		敵の位置情報
//戻値:TRUEorFALSE
//----------------------------------
BOOL Bread::Hit(UnitBase *pTarget)
{
	if (typeid(*pTarget) == typeid(Enemy))
	{
		Enemy *pEnemy = (Enemy*)pTarget;
		if (isbread == TRUE)
		{
			//敵の位置をGetPosを通して受け取る
			enemyPosition = pEnemy->GetPos();
			//位置の計算を行う
			int distance =
				(int)(position.x - (enemyPosition.x + g_stageScrollPosition.x)) *
				(int)(position.x - (enemyPosition.x + g_stageScrollPosition.x)) +
				(int)(position.y - (enemyPosition.y + g_stageScrollPosition.y)) *
				(int)(position.y - (enemyPosition.y + g_stageScrollPosition.y));			//(0-0)*(0-0)+(0-0)*(0-0) =((0-0)*(0-0)) + ((0-0)*(0-0)) 

			if (distance <= (28 * 48))
			{
				//弾が当たったら弾を消す
				Reset();
				pEnemy->Kill();
				return TRUE;
			}
		}
	}

	return FALSE;
}
Пример #2
0
void MultiplayerMap::UpdateEnemyPathing()
{
	for (int i = 0; i < towers.size(); i++)
	{
		Tower *t = towers.at(i);
		int x = t->GetX() / 32;
		int y = t->GetY() / 32;

		pathingArr[TILES_X * y + x].type = 1;
		pathingArr[TILES_X * (y + 1) + x].type = 1;
		pathingArr[TILES_X * y + (x + 1)].type = 1;
		pathingArr[TILES_X * (y + 1) + (x + 1)].type = 1;
	}

	for (int i = 0; i < enemies.size(); i++)
	{
		Enemy *en = enemies.at(i);
		Vector2f pos = en->GetPos();
		TileNode enemyPos = TileNode(pos.x / 32, pos.y / 32, nullptr);

		TileNode destination;
		if (en->GetOwnerID() == 1)
		{
			destination = endNode;
		}
		else
			destination = startNode;

		vector<TileNode> enemyPath = pathfinder->Search(enemyPos, destination);

		enemyPath.insert(enemyPath.begin(), enemyPos);
		en->UpdatePath(enemyPath);
	}
}
Пример #3
0
//——————————————————————
// 機能:衝突判定処理
// 引数:なし
// 戻値:成功/失敗
//——————————————————————
HRESULT Player::Hit(UnitBase* pTarget)
{
	//ターゲットが敵だったら
	if (typeid(*pTarget) == typeid(Enemy))
	{
		//敵の現在の位置
		Enemy* enemy = (Enemy*)pTarget;
		D3DXVECTOR2 enemyPos = enemy->GetPos();

		//プレイヤーから敵までの距離の2乗を求める
		int distance = (position.x - enemyPos.x) * (position.x - enemyPos.x) +
					   (position.y - enemyPos.y) * (position.y - enemyPos.y);

		//キャラサイズの2乗以内だったら
		if (distance <= (ACTOR_SIZE * ACTOR_SIZE))
		{
			//プレイヤー死ぬ
			status = STATUS_DEAD;
		}
	}

	//ターゲットがブロックだったら
	if (typeid(*pTarget) == typeid(Block))
	{
		//現在の位置
		Block* block = (Block*)pTarget;

		int x = position.x;
		int y = position.y;

		if (block->GetMap(y , x) == 1 )
		{
			
			move.y = 0;
		}
		
	}

	//ターゲットがアイテムだったら
	if (typeid(*pTarget) == typeid(Item))
	{
		//現在の位置
		Item* item = (Item*)pTarget;
		D3DXVECTOR3 itemPos = item->GetPos();

		//プレイヤーからブロックまでの距離の2乗を求める
		int distance = (position.x - itemPos.x)*(position.x - itemPos.x) +
			(position.y - itemPos.y)*(position.y - itemPos.y);

		//2乗以内だったら
		if (distance <= ACTOR_SIZE*ACTOR_SIZE)
		{
			
		}
	}
	return S_OK;
}
Пример #4
0
void MultiplayerMap::update(float elapsed_seconds)
{
	if (updates++ % 30 == 0)
	{
		SendPlayerSync();

		for (int i = 0; i < enemies.size(); i++)
		{
			Enemy *en = enemies[i];

			UpdateEnemyStruct ues;
			ues.health = en->GetHealth();
			ues.UID = en->GetUID();
			ues.x = en->GetPos().x;
			ues.y = en->GetPos().y;
			if (peerConnection)
				peerConnection->Send(ues);
		}
	}

	
	if (localPlayer->GetLives() <= 0)
	{
		on_show_winner(false);
		return;
	}
	else if (remotePlayer->GetLives() <= 0)
	{
		on_show_winner(true);
		return;
	}


	passiveIncomeCD += elapsed_seconds;
	if (passiveIncomeCD > SECONDS_PER_PASSIVE_INCOME)
	{
		localPlayer->AddGold(localPlayer->GetPassiveIncome());
		remotePlayer->AddGold(remotePlayer->GetPassiveIncome());
		//SendPlayerSync();
		passiveIncomeCD = 0;
		on_creep_killed(0);
	}


	DoProjectileCollision();

	if (peerConnection)
		peerConnection->Update(elapsed_seconds);
}
Пример #5
0
//playerのHit関数
//引数:UnitBase型のポインタ
//(UnitBaseクラスを継承した子クラスの情報が扱える)
//戻り値:HRESULT型-成功かどうか
HRESULT Player::Hit(UnitBase* pTarget)
{
	//ステージとの当たり判定
	if (typeid(*pTarget) == typeid(Stage))
	{
		//pTargetをステージと判断し、stage型にキャスト
		Stage* stage = (Stage*)pTarget;

		//RayCastData型の変数を作る
		RayCastData ray;
		//レイが出る位置
		ray.start = position;
		ray.start.y = position.y+10;

		//レイを向ける方向
		ray.dir = D3DXVECTOR3(0, -1, 0);
		
		//レイの情報を格納したアドレスを渡す
		stage->GetModel()->RayCast(&ray);

		//Rayが当たっているかつ
		//ステージの位置Yがプレイヤー位置Y-1より大きかったら
		if (ray.hit && ray.pos.y >= (position.y - 1) && ground_flg == FALSE)
		{
			jump_flg = TRUE;
			jump_Count = 0;
			ground_flg = TRUE;
			position = ray.pos + D3DXVECTOR3(0, 0.5, 0);
		}
		else if (ground_flg == TRUE)
		{
			position = ray.pos + D3DXVECTOR3(0,0.5,0);
		}

		//目の前にステージがあるかの判定
		ray.start = position;
		D3DXMATRIX matR;
		D3DXMatrixRotationY(&matR, D3DXToRadian(dir));
		D3DXVECTOR3 rayVec = D3DXVECTOR3(0, 0, 1);
		D3DXVec3TransformCoord(&rayVec, &rayVec, &matR);
		ray.dir = rayVec;
		stage->GetModel()->RayCast(&ray);
		if (ray.hit && ray.dist < 2)
		{
				isWallHit = TRUE;
				wallNormal = ray.normal;
		}
		else
		{
			isWallHit = FALSE;
		}

		ray.start = position;
		ray.dir = D3DXVECTOR3(0, 0, -1);
		stage->GetModel()->RayCast(&ray);
		D3DXVECTOR3 v = stage->GetPos() - position;
		//プレイヤーとカメラの間にステージがあるか
		D3DXVECTOR3 pToCdist = camVec-position;
		if (D3DXVec3Length(&v) < D3DXVec3Length(&pToCdist))
		{
			camVec = D3DXVECTOR3(position.x, 5, position.z);
		}

	}
	//敵との当たり判定
	if (typeid(*pTarget) == typeid(Enemy))
	{
		static int count = 0;
		count--;
		Enemy* enemy = (Enemy*)pTarget;				//UnitBase型をEnemy型にキャスト
		BOOL flg = item->Hit(enemy->GetPos());		//アイテムが当たったかどうか
		if (flg)
		{
			enemy->KnockBack();
			count = 100;
		}
		D3DXVECTOR3 v = enemy->GetPos() - position; //プレイヤーから敵に向かうベクトルを求める
		if (D3DXVec3Length(&v) < 2)					//ベクトルの長さが2以下だったら
		{
			if (count >= 0)
			{
				enemy->Kill();
				g_gameScene = SC_CLEAR;
			}
			else
			{
				g_gameScene = SC_GAME_OVER;
			}
		}
	}
	if (typeid(*pTarget) == typeid(Invisible))
	{
		Invisible* invisible = (Invisible*)pTarget;
		D3DXVECTOR3 inTopVec = invisible->GetPos() - position;
		if (D3DXVec3Length(&inTopVec) < 1)
		{
			isInvisible = TRUE;
		}
		else
		{
			isInvisible = FALSE;
		}
	}



	return S_OK;
}