//================================================================================================================================== 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] ); } } }
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; }