Files
Leviathan/Client/Game/game/Main/Scene/SGameCreditsScene.cpp
T
2026-06-01 12:46:52 +02:00

266 lines
6.6 KiB
C++

#include "stdafx.h"
#include "SGameCreditsScene.h"
#include "SGameSceneManager.h"
#include <kfile/KFileManager.h>
#include "KDeviceManager.h"
#include "TemplateUtil.h"
#include "KViewport.h"
#include "SGameMilesSoundMgr.h"
#include "KResourceManager.h"
#include "SLog.h"
rp::SGameCreditsScene::SGameCreditsScene(
SGameSceneManager& sceneMgr
, SGameScene* parent
, const char* sceneName
, DWORD screeningTime
, DWORD fadeInTime
, DWORD fadeOutTime
, DWORD beginScrollTime
, DWORD endScrollTime
, float startx
, DWORD width
, DWORD height
, KViewportObject* viewport )
: SGameScene ( sceneMgr, parent, sceneName )
, mScreenWidth ( width )
, mScreenX ( startx )
, mScreenHeight ( height ) //mSceneMgr.graphics().GetRenderDevice()->GetScreenSize().height )
, mScreeningTime ( screeningTime - ( fadeInTime + fadeOutTime ))
, mFadeInTime ( fadeInTime )
, mFadeOutTime ( fadeOutTime )
, mBeginScrollTime ( beginScrollTime )
, mEndScrollTime ( endScrollTime )
, mShowTime ( 0 )
, mProjectPosition ( 0 )
, mFilmLength ( 0 )
, mFilmIndex ( 0 )
, mEscapeTime ( 0 )
, mViewport ( viewport )
{
}
rp::SGameCreditsScene::~SGameCreditsScene()
{
rp::wipe_seq( mFilms );
}
void rp::SGameCreditsScene::onEnter()
{
}
void rp::SGameCreditsScene::onActivate()
{
mShowTime = 0;
mProjectPosition = 0;
mFilmIndex = 0;
mEscapeTime = 0;
setLocalVisibility( 0 );
//mSceneMgr.milesSoundMgr().StopBgm();
mSceneMgr.milesSoundMgr().StopMusic();
mSceneMgr.milesSoundMgr().SwapPlayBGM( "05_Pioneer_of_Distorted_Land.ogg", 100, 1000, 1000, false );
}
void rp::SGameCreditsScene::onDeactivate()
{
}
void rp::SGameCreditsScene::onLeave()
{
}
void rp::SGameCreditsScene::onTick()
{
if( mScreeningTime == 0 )
return;
SGameScene::onTick();
if( mShowTime == 0 )
{
mShowTime = mSceneMgr.timer().getTime();
}
DWORD ScreeningTimeDiff = mSceneMgr.timer().getTime() - mShowTime;
// fade in -> screening -> fade out
if( ScreeningTimeDiff < mFadeInTime )
{
setLocalVisibility( (float)ScreeningTimeDiff / mFadeInTime );
}
else if( ScreeningTimeDiff < ( mFadeInTime + mScreeningTime ) )
{
setLocalVisibility( 1.0f );
}
else if( ScreeningTimeDiff < ( mFadeInTime + mScreeningTime + mFadeOutTime ) )
{
setLocalVisibility( (float)( ( mFadeInTime + mScreeningTime + mFadeOutTime ) - ScreeningTimeDiff ) / mFadeOutTime );
}
else
{
SGameScene::activate( false );
}
// escape process
if( mEscapeTime != 0 )
{
DWORD EscapeTimeDiff = mSceneMgr.timer().getTime() - mEscapeTime;
if( EscapeTimeDiff < mFadeOutTime )
{
setLocalVisibility( ::min( (float)( mFadeOutTime - EscapeTimeDiff ) / mFadeOutTime, getLocalVisibility() ) );
}
else
{
setLocalVisibility( 0.f );
SGameScene::activate( false );
}
}
updateVisibility();
// scrolling projected films
if( ScreeningTimeDiff < mBeginScrollTime )
{
mProjectPosition = 0.f;
}
else if( ScreeningTimeDiff < mEndScrollTime )
{
DWORD ScrollDuration = mEndScrollTime - mBeginScrollTime;
DWORD ScrollTimeDiff = ScreeningTimeDiff - mBeginScrollTime;
mProjectPosition = ( mFilmLength - mScreenHeight ) / (float)ScrollDuration * (float)ScrollTimeDiff;
}
else
{
mProjectPosition = mFilmLength - mScreenHeight;
}
film_vector_t::iterator it = mFilms.begin() + mFilmIndex, end = mFilms.end();
for( int FilmIndex = mFilmIndex; it != end; ++it, ++FilmIndex )
{
CFilm* Film = (*it);
if( Film && Film->isVisible( mProjectPosition, mScreenHeight ) )
{
mFilmIndex = FilmIndex;
break;
}
}
}
void rp::SGameCreditsScene::onRender( KViewportObject* viewport )
{
film_vector_t::iterator it = mFilms.begin() + mFilmIndex, end = mFilms.end();
for( ; it != end; ++it )
{
CFilm* Film = (*it);
if( Film && Film->isVisible( mProjectPosition, mScreenHeight ) )
{
KSpritePrimitive& FilmPrimitive = Film->project( mScreenX, mProjectPosition, mScreenWidth, mScreenHeight );
FilmPrimitive.SetVisibility( getWorldVisibility() );
if( mViewport )
mViewport->Register( &FilmPrimitive );
else
viewport->Register( &FilmPrimitive );
}
else
break;
}
}
void rp::SGameCreditsScene::addFilm( const char* fileName )
{
CFilm* Film = new CFilm();
if( !Film->createFilm( mSceneMgr, fileName, mScreenWidth, mScreenHeight, mFilmLength ) )
{
rp::safe_delete( Film );
return;
}
mFilmLength += Film->getFilmHeight();
mFilms.push_back( Film );
}
void rp::SGameCreditsScene::activate( bool activity )
{
if( activity == true )
{
SGameScene::activate();
}
else
{
//if( mIsActivated != activity )
//{
//if( mEscapeTime == 0 )
//{
mEscapeTime = mSceneMgr.timer().getTime();
mSceneMgr.milesSoundMgr().SwapPlayBGM( "", mFadeOutTime, mFadeOutTime, 100, false );
SGameScene::activate( false );
//}
//}
}
}
rp::SGameCreditsScene::CFilm::CFilm() : mPosition( 0 )
{
}
bool rp::SGameCreditsScene::CFilm::createFilm( SGameSceneManager& sceneMgr, const char* fileName, int screenWidth, int screenHeight, float position )
{
NX3LoadPack loadpack;
loadpack.Init();
mTexture = sceneMgr.textureMgr().GetTexture( fileName, &loadpack, true, 0 );
//assert( mTexture && "credits film texture was not loaded!!" );
if( mTexture == 0 )
{
SDEBUGLOG( "[Function = %s]", __FUNCTION__);
SDEBUGLOG("Credit film texture : %s cannot load!!" , fileName);
return false;
}
mSprite = new KResSprite();
mSprite->SetTexture( mTexture, NULL );
mSprite->SetSize( (float)screenWidth, (float)mTexture->GetHeight() );
mSprite->SetAdditiveRenderMode(false);
mPrimitive.SetRes( mSprite );
mPosition = position;
#if defined( _DEBUG )
mFilmName = fileName;
#endif
return true;
}
float rp::SGameCreditsScene::CFilm::getFilmWidth()
{
return mSprite->GetSizeX();
}
float rp::SGameCreditsScene::CFilm::getFilmHeight()
{
return mSprite->GetSizeY();
}
bool rp::SGameCreditsScene::CFilm::isVisible( float screenPosition, int screenHeight )
{
if( ( screenPosition > ( mPosition + getFilmHeight() ) ) || ( ( screenPosition + screenHeight ) < mPosition ) )
return false;
return true;
}
KSpritePrimitive& rp::SGameCreditsScene::CFilm::project( float screenx, float screenPosition, int screenWidth, int screenHeight )
{
float ProjStartPosition = ::max( mPosition, screenPosition );
float ProjEndPosition = ::min( mPosition + getFilmHeight(), screenPosition + screenHeight );
float UvTop = ( ProjStartPosition - mPosition ) / getFilmHeight();
float UvBottom = ( ProjEndPosition - mPosition ) / getFilmHeight();
mPrimitive.SetPosition( K3DVector( screenx, ProjStartPosition - screenPosition, 0.f ) );
mPrimitive.SetSourceUVRect( 0.f, UvTop, 1.f, UvBottom );
mPrimitive.SetTargetSize( (float)screenWidth, ProjEndPosition - ProjStartPosition );
return mPrimitive;
}