//==================================================================================================================================
void PlatformerMap::ClipSprites()
{
	// if(x >= -150 && x < screenWidth)
	
	vector<AISprite*> renderList(MAX_SPRITES);
	
	for (int j = 0; j < m_Sprites.size(); j++)
	{
		if (m_Sprites[j] == NULL) continue;

		AISprite* spr = m_Sprites[j];
		
		if (InScreen(spr->X(), spr->Y()))
		{
			renderList[j] = spr;
		}
	}
	
	//Fix the render list based on the clipping of each sprite
	if (m_Sprites.size() > 0)
	{
		if (m_ClippedSprites.size() > 0) m_ClippedSprites.clear();

		m_numSpritesRendered = 0;

		for (int j = 0; j < renderList.size(); j++)
		{
			if (renderList[j] != NULL)
				m_numSpritesRendered++;

			m_ClippedSprites.push_back( renderList[j] );
		}
	}
}
Exemple #2
0
void Enemy::Move(){
	bool addFrame = false;
	switch(GetState()){
	case Born:
		if(_BornFunc == nullptr){
			SetState(Exist);
			SetDeletable(true);
		}else{
			_BornFunc(*this);
			AddVxVy2XY();
			addFrame = true;
		}
		break;
	case Exist:
		if(_MoveFunc != nullptr){_MoveFunc(*this);}
		AddVxVy2XY();
		if(GetDeletable() == true && InScreen(GetX(),GetY(),-GetHitW(),-GetHitH()) == false){
			SetDead();
			break;
		}
		addFrame = true;
		//ここにショット関係
		while(GetShotWait() ==0){
			EnemyBullet::CreateInfo obj;
			EnemyBullet::ReturnInfo result;

			obj.x=GetX();
			obj.y=GetY();
			obj.MoveFunc=_ShotFunc;
			obj.shotCount=_shotCnt;
			obj.image = _bulletImg;
			obj.angleB4 = _angleShotB4;
			_bulletPtr->Create(obj,result);
			_angleShotB4 = result.angleShot;
			_shotCnt += result.shotCount;
			SetShotWait(result.waitFrame);
		}
		DecreaseShotWait();

		break;
	case Dead:
		if(_DeadFunc == nullptr){
			SetState(NotExist);
		}else{
			_DeadFunc(*this);
			AddVxVy2XY();
			addFrame = true;
		}

		break;
	case NotExist:
		break;
	}
	if(addFrame){AddFrame();}
}
//==================================================================================================================================
bool PlatformerMap::Render(Camera* camera)
{
	// Grab the offset of the player so we can properly setup tile rendering
	//m_Offset = PlayerOffset();
	
	//int firstTileX = PlatformerMap::PixelsToTiles(-m_Offset.x);
	//int lastTileX = firstTileX + PlatformerMap::PixelsToTiles(m_EngineOptions->m_screenWidth) + 1;
	
	//for (int y = 0; y < m_MapHeight; y++)
	//{
	//	for (int x = firstTileX; x <= lastTileX; x++)
	//	{
	//		if (x < 0) continue;
	//		
	//		if (x == m_TileRemovedX && y == m_TileRemovedY) continue;

	//		PlatformerTile* tile = m_Tiles(x, y);
	//		
	//		if (tile == NULL) continue;
	//		
	//		// Update the offsets for the tile
	//		int tileX = PlatformerMap::TilesToPixels(x) + m_Offset.x;
	//		int tileY = PlatformerMap::TilesToPixels(y) + m_Offset.y;
	//		
	//		tile->UpdatePosition(XMFLOAT3(tileX, tileY, 0));
	//		
	//		tile->Render(textureShader, transparentShader, camera);
	//	}
	//}
	
	AISprite* player = GetPlayer();
	
	if (!bEditor)
	{
		if (player != NULL)
		{
			// Keep the player in the center of the screen
			m_Offset.x = m_EngineOptions->m_screenWidth / 2 - player->Width() / 2 - player->TopLeftPosition().x;
			m_Offset.y = m_EngineOptions->m_screenHeight / 2 - player->Height() / 2 - player->TopLeftPosition().y;
			
			float levelExtentX = static_cast<float>(m_EngineOptions->m_screenWidth * m_BackgroundScreenWidth);
			float levelExtentY = static_cast<float>(m_EngineOptions->m_screenHeight) * 2.0f;
			
			// Limit horizontal scrolling
			if (player->TopLeftPosition().x < m_EngineOptions->m_screenWidth / 2 - player->Width() / 2)
				m_Offset.x = 0.0f;
			
			if (player->TopLeftPosition().x > levelExtentX - m_EngineOptions->m_screenWidth / 2 - player->Width() / 2)
				m_Offset.x = -(levelExtentX - m_EngineOptions->m_screenWidth);
			
			// Limit vertical scrolling
			if (player->TopLeftPosition().y >= m_EngineOptions->m_screenHeight / 2 - player->Height() / 2)
				m_Offset.y = 0.0f;
			
			if (player->TopLeftPosition().y < -levelExtentY + m_EngineOptions->m_screenHeight / 2 - player->Height() / 2)
				m_Offset.y = levelExtentY - m_EngineOptions->m_screenHeight;
		}
	}
	
	mMapWorld = XMMatrixTranslation(m_Offset.x, m_Offset.y, 0);
	
	int firstTileX = PlatformerMap::PixelsToTiles(-m_Offset.x);
	int lastTileX = firstTileX + PlatformerMap::PixelsToTiles(m_EngineOptions->m_screenWidth) + 1;

	for (int y = 0; y < m_MapHeight; y++)
	{
		for (int x = firstTileX; x <= lastTileX; x++)
		//for (int x = 0; x < m_MapWidth; x++)
		{
			if (!InBounds(x, y)) continue;
			
			PlatformerTile* tile = m_Tiles(x, y);

			if (tile == NULL) continue;

			tile->BodyBoundsPredict(-m_Offset.x, -m_Offset.y);
			
			int x_pos = PlatformerMap::TilesToPixels(tile->GetPosition().x);
			int y_pos = PlatformerMap::TilesToPixels(tile->GetPosition().y);

			if (!InScreen(x_pos, y_pos)) continue;

			//if (tile->BBodyBox().left < -m_Offset.x + m_EngineOptions->m_screenWidth && tile->BBodyBox().right >= -m_Offset.x &&
			//	tile->BBodyBox().top < -m_Offset.y + m_EngineOptions->m_screenHeight && tile->BBodyBox().bottom >= -m_Offset.y)
			if (tile->Body().x < -m_Offset.x + m_EngineOptions->m_screenWidth && tile->Body().x >= -m_Offset.x &&
				tile->Body().y < -m_Offset.y + m_EngineOptions->m_screenHeight && tile->Body().y >= -m_Offset.y)
			{
				//tile->TileWorld() = mMapWorld;
				
				float oldX = tile->TopLeftPosition().x;
				float oldY = tile->TopLeftPosition().y;
				
				float posx = PlatformerMap::TilesToPixels(tile->TopLeftPosition().x) + -m_Offset.x;
				float posy = PlatformerMap::TilesToPixels(tile->TopLeftPosition().y) + -m_Offset.y;
				
				tile->UpdatePosition(XMFLOAT3(posx, posy, 0));
				
				m_D3DSystem->TurnOnAlphaBlending();
				tile->Render(camera, 0);
				m_D3DSystem->TurnOffAlphaBlending();
				
				tile->UpdatePosition(XMFLOAT3(oldX, oldY, 0));
			}
		}
	}

	int startboundx = startTile->GetPosition().x;
	int startboundy = startTile->GetPosition().y;

	int endboundx = endTile->GetPosition().x;
	int endboundy = endTile->GetPosition().y;

	m_BoundingBox.firstTileX = startboundx;
	m_BoundingBox.firstTileY = startboundy;
	m_BoundingBox.lastTileX = endboundx;
	m_BoundingBox.lastTileY = endboundy;

	if (m_TileRemovedX != -1 && m_TileRemovedY != -1)
	{
		m_TileRemovedX = -1;
		m_TileRemovedY = -1;
	}

	ClipSprites();

	for (int i = 0; i < m_ClippedSprites.size(); i++)
	{
		if (m_ClippedSprites[i] == NULL) continue;

		AISprite* s = m_ClippedSprites[i];

		//Update the sprites behavior if their are any
		s->updateBehavior();

		//Update the animation if it exists
		s->UpdateAnimation();
		
		//s->SpriteWorld() = mMapWorld;
		
		float oldX = s->TopLeftPosition().x;
		float oldY = s->TopLeftPosition().y;
		XMFLOAT3 oldPos = XMFLOAT3(oldX, oldY, 0);
		
		if (!s->IsPlayer())
		{
			float posx = s->TopLeftPosition().x + -m_Offset.x;
			float posy = s->TopLeftPosition().y + -m_Offset.y;
			
			XMFLOAT3 pos = XMFLOAT3(posx, posy, 0);
			
			s->TopLeftPosition() = pos;
		}
		
		//Render the sprite
		m_D3DSystem->TurnOnAlphaBlending();
			//s->RenderTransparent11(transparentShader, camera, 0);
			s->Render(camera, 0);
		m_D3DSystem->TurnOffAlphaBlending();
		
		s->TopLeftPosition() = oldPos;
	}

	if (bEditor)
	{
		//m_D3DSystem->TurnOnAlphaBlending();
		//m_MapSprite->Render11(0, textureShader, camera);
		//m_D3DSystem->TurnOffAlphaBlending();
	}

	return true;
}