Initial checkin
This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
#include "stdafx.h" // testing updates
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Actor.cpp
|
||||
//
|
||||
// Desc: Base class for all objects that appear on the screen.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include "Actor.h"
|
||||
#include <math.h>
|
||||
|
||||
|
||||
Actor::Actor()
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
void Actor::Init()
|
||||
{
|
||||
m_size = D3DXVECTOR2( 0, 0 );
|
||||
m_pos = D3DXVECTOR2( 0, 0 );
|
||||
m_rotation = D3DXVECTOR3( 0, 0, 0 );
|
||||
m_scale = D3DXVECTOR2( 1, 1 );
|
||||
m_color = D3DXCOLOR( 1, 1, 1, 1 );
|
||||
|
||||
m_start_pos = m_end_pos = D3DXVECTOR2( 0.0f, 0.0f );
|
||||
m_start_rotation= m_end_rotation = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
|
||||
m_start_scale = m_end_scale = D3DXVECTOR2( 1.0f, 1.0f );
|
||||
m_start_color = m_end_color = D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f );
|
||||
|
||||
m_TweenType = no_tween;
|
||||
m_fTweenTime = 0.0f;
|
||||
m_fTimeIntoTween = 0.0f;
|
||||
}
|
||||
|
||||
|
||||
void Actor::Update( const FLOAT &fDeltaTime )
|
||||
{
|
||||
// RageLog( "Actor::Update( %f )", fDeltaTime );
|
||||
|
||||
// update tweening
|
||||
if( m_TweenType != no_tween ) // we are performing some type of tweening
|
||||
{
|
||||
m_fTimeIntoTween += fDeltaTime;
|
||||
|
||||
if( m_fTimeIntoTween > m_fTweenTime ) // The tweening is over. Stop the tweening
|
||||
{
|
||||
m_pos = m_end_pos;
|
||||
m_scale = m_end_scale;
|
||||
m_rotation = m_end_rotation;
|
||||
m_color = m_end_color;
|
||||
m_TweenType = no_tween;
|
||||
}
|
||||
else // Tweening. Recalcute the curent position.
|
||||
{
|
||||
FLOAT fPercentThroughTween = m_fTimeIntoTween / m_fTweenTime;
|
||||
|
||||
// distort the percentage if appropriate
|
||||
if( m_TweenType == tween_bias_begin )
|
||||
fPercentThroughTween = (FLOAT) sqrt( fPercentThroughTween );
|
||||
else if( m_TweenType == tweening_bias_end )
|
||||
fPercentThroughTween = fPercentThroughTween * fPercentThroughTween;
|
||||
|
||||
|
||||
m_pos = m_start_pos + (m_end_pos - m_start_pos )*fPercentThroughTween;
|
||||
m_scale = m_start_scale + (m_end_scale - m_start_scale )*fPercentThroughTween;
|
||||
m_rotation = m_start_rotation+ (m_end_rotation - m_start_rotation)*fPercentThroughTween;
|
||||
m_color = m_start_color*(1.0f-fPercentThroughTween) + m_end_color*(fPercentThroughTween);
|
||||
}
|
||||
|
||||
} // end if m_TweenType != no_tween
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void Actor::TweenTo( FLOAT time, FLOAT x, FLOAT y, FLOAT zoom, FLOAT rot, D3DXCOLOR col, TweenType tt )
|
||||
{
|
||||
// set our tweeen starting values to the current position
|
||||
m_start_pos = m_pos;
|
||||
m_start_scale = m_scale;
|
||||
m_start_rotation = m_rotation;
|
||||
m_start_color = m_color;
|
||||
|
||||
// set the ending tweening position to what the user asked for
|
||||
m_end_pos.x = (FLOAT)x;
|
||||
m_end_pos.y = (FLOAT)y;
|
||||
m_end_scale.x = zoom;
|
||||
m_end_scale.y = zoom;
|
||||
m_end_rotation.z = rot;
|
||||
m_end_color = col;
|
||||
m_TweenType = tt;
|
||||
m_fTweenTime = time;
|
||||
m_fTimeIntoTween = 0;
|
||||
|
||||
}
|
||||
|
||||
void Actor::SetTweening( FLOAT time, TweenType tt )
|
||||
{
|
||||
// set our tweeen starting and ending values to the current position
|
||||
m_start_pos = m_end_pos = m_pos;
|
||||
m_start_scale = m_end_scale = m_scale;
|
||||
m_start_rotation = m_end_rotation = m_rotation;
|
||||
m_start_color = m_end_color = m_color;
|
||||
|
||||
m_TweenType = tt;
|
||||
m_fTweenTime = time;
|
||||
m_fTimeIntoTween = 0;
|
||||
}
|
||||
|
||||
void Actor::SetTweenX( FLOAT x ) { m_end_pos.x = x; }
|
||||
void Actor::SetTweenY( FLOAT y ) { m_end_pos.y = y; }
|
||||
void Actor::SetTweenXY( FLOAT x, FLOAT y ) { SetTweenX(x); SetTweenY(y); }
|
||||
void Actor::SetTweenZoom( FLOAT zoom ) { m_end_scale.x = zoom; m_end_scale.y = zoom; }
|
||||
void Actor::SetTweenRotationX( FLOAT r ) { m_end_rotation.x = r; }
|
||||
void Actor::SetTweenRotationY( FLOAT r ) { m_end_rotation.y = r; }
|
||||
void Actor::SetTweenRotationZ( FLOAT r ) { m_end_rotation.z = r; }
|
||||
void Actor::SetTweenColor( D3DXCOLOR c ) { m_end_color = c; }
|
||||
|
||||
|
||||
void Actor::ScaleTo( LPRECT pRect, StretchType st )
|
||||
{
|
||||
// width and height of rectangle
|
||||
int rect_width = RECTWIDTH(*pRect);
|
||||
int rect_height = RECTHEIGHT(*pRect);
|
||||
|
||||
// center of the rectangle
|
||||
int rect_cx = pRect->left + rect_width/2;
|
||||
int rect_cy = pRect->top + rect_height/2;
|
||||
|
||||
// zoom factor needed to scale the Actor to fill the rectangle
|
||||
FLOAT fNewZoomX = (FLOAT)fabs(rect_width / m_size.x);
|
||||
FLOAT fNewZoomY = (FLOAT)fabs(rect_height / m_size.y);
|
||||
|
||||
if( rect_width < 0 ) SetRotationY( D3DX_PI );
|
||||
if( rect_height < 0 ) SetRotationX( D3DX_PI );
|
||||
|
||||
FLOAT fNewZoom;
|
||||
switch( st )
|
||||
{
|
||||
case cover:
|
||||
fNewZoom = fNewZoomX>fNewZoomY ? fNewZoomX : fNewZoomY; // use larger zoom
|
||||
break;
|
||||
case fit_inside:
|
||||
fNewZoom = fNewZoomX>fNewZoomY ? fNewZoomY : fNewZoomX; // use smaller zoom
|
||||
break;
|
||||
}
|
||||
|
||||
SetXY( (FLOAT)rect_cx, (FLOAT)rect_cy );
|
||||
SetZoom( fNewZoom );
|
||||
}
|
||||
|
||||
|
||||
void Actor::StretchTo( LPRECT pRect )
|
||||
{
|
||||
// width and height of rectangle
|
||||
int rect_width = RECTWIDTH(*pRect);
|
||||
int rect_height = RECTHEIGHT(*pRect);
|
||||
|
||||
// center of the rectangle
|
||||
int rect_cx = pRect->left + rect_width/2;
|
||||
int rect_cy = pRect->top + rect_height/2;
|
||||
|
||||
// zoom factor needed to scale the Actor to fill the rectangle
|
||||
FLOAT fNewZoomX = (FLOAT)fabs(rect_width / m_size.x);
|
||||
FLOAT fNewZoomY = (FLOAT)fabs(rect_height / m_size.y);
|
||||
|
||||
SetXY( (FLOAT)rect_cx, (FLOAT)rect_cy );
|
||||
m_scale.x = fNewZoomX;
|
||||
m_scale.y = fNewZoomY;
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Actor.h
|
||||
//
|
||||
// Desc: Base class for all objects that appear on the screen.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#ifndef _ACTOR_H_
|
||||
#define _ACTOR_H_
|
||||
|
||||
#include "RageUtil.h"
|
||||
|
||||
#include <d3dx8math.h>
|
||||
|
||||
|
||||
|
||||
|
||||
class Actor
|
||||
{
|
||||
public:
|
||||
Actor();
|
||||
|
||||
enum TweenType { no_tween, tween_linear, tween_bias_begin, tweening_bias_end };
|
||||
|
||||
virtual void Draw() = 0;
|
||||
virtual void Update( const FLOAT &fDeltaTime );
|
||||
|
||||
virtual FLOAT GetX() { return m_pos.x; };
|
||||
virtual FLOAT GetY() { return m_pos.y; };
|
||||
virtual void SetX( FLOAT x ) { m_pos.x = x; m_TweenType = no_tween; };
|
||||
virtual void SetY( FLOAT y ) { m_pos.y = y; m_TweenType = no_tween; };
|
||||
virtual void SetXY( FLOAT x, FLOAT y ) { m_pos.x = x; m_pos.y = y; m_TweenType = no_tween; };
|
||||
|
||||
// height and width vary depending on zoom
|
||||
virtual FLOAT GetZoomedWidth() { return m_size.x * m_scale.x; }
|
||||
virtual FLOAT GetZoomedHeight() { return m_size.y * m_scale.y; }
|
||||
virtual void SetWidth( FLOAT width ){ m_size.x = width; }
|
||||
virtual void SetHeight( FLOAT height ){ m_size.y = height; }
|
||||
|
||||
virtual FLOAT GetZoom() { return m_scale.x; }
|
||||
virtual void SetZoom( FLOAT zoom ) { m_scale.x = zoom; m_scale.y = zoom; }
|
||||
|
||||
virtual FLOAT GetRotation() { return m_rotation.z; }
|
||||
virtual void SetRotation( FLOAT rot ) { m_rotation.z = rot; }
|
||||
virtual FLOAT GetRotationX() { return m_rotation.x; }
|
||||
virtual void SetRotationX( FLOAT rot ) { m_rotation.x = rot; }
|
||||
virtual FLOAT GetRotationY() { return m_rotation.y; }
|
||||
virtual void SetRotationY( FLOAT rot ) { m_rotation.y = rot; }
|
||||
|
||||
virtual void SetColor( D3DXCOLOR newColor ) { m_color = newColor; };
|
||||
virtual D3DXCOLOR GetColor() { return m_color; };
|
||||
|
||||
virtual void TweenTo( FLOAT time,
|
||||
FLOAT x, FLOAT y,
|
||||
FLOAT zoom = 1.0,
|
||||
FLOAT rot = 0.0,
|
||||
D3DXCOLOR col = D3DXCOLOR( 1.0f, 1.0f, 1.0f, 1.0f ),
|
||||
TweenType tt = tween_linear );
|
||||
|
||||
virtual void SetTweening( FLOAT time, TweenType tt = tween_linear );
|
||||
virtual void SetTweenX( FLOAT x );
|
||||
virtual void SetTweenY( FLOAT y );
|
||||
virtual void SetTweenXY( FLOAT x, FLOAT y );
|
||||
virtual void SetTweenZoom( FLOAT zoom );
|
||||
virtual void SetTweenRotationX( FLOAT r );
|
||||
virtual void SetTweenRotationY( FLOAT r );
|
||||
virtual void SetTweenRotationZ( FLOAT r );
|
||||
virtual void SetTweenColor( D3DXCOLOR c );
|
||||
|
||||
|
||||
// NOTE: GetEdge functions don't consider rotation
|
||||
virtual FLOAT GetLeftEdge() { return m_pos.x - GetZoomedWidth()/2.0f; };
|
||||
virtual FLOAT GetRightEdge() { return m_pos.x + GetZoomedWidth()/2.0f; };
|
||||
virtual FLOAT GetTopEdge() { return m_pos.y - GetZoomedHeight()/2.0f; };
|
||||
virtual FLOAT GetBottomEdge() { return m_pos.y + GetZoomedHeight()/2.0f; };
|
||||
|
||||
enum StretchType { fit_inside, cover };
|
||||
|
||||
void ScaleToCover( LPRECT rect ) { ScaleTo( rect, cover ); };
|
||||
void ScaleToFitInside( LPRECT rect ) { ScaleTo( rect, fit_inside); };
|
||||
void ScaleTo( LPRECT rect, StretchType st );
|
||||
|
||||
void StretchTo( LPRECT rect );
|
||||
|
||||
protected:
|
||||
|
||||
void Init();
|
||||
|
||||
D3DXVECTOR2 m_size; // width, height
|
||||
D3DXVECTOR2 m_pos; // X-Y coordinate of where the center point will appear on screen
|
||||
D3DXVECTOR3 m_rotation; // X, Y, and Z m_rotation
|
||||
D3DXVECTOR2 m_scale; // X and Y zooming
|
||||
D3DXCOLOR m_color;
|
||||
|
||||
// start and end position for tweening
|
||||
D3DXVECTOR2 m_start_pos, m_end_pos;
|
||||
D3DXVECTOR3 m_start_rotation, m_end_rotation;
|
||||
D3DXVECTOR2 m_start_scale, m_end_scale;
|
||||
D3DXCOLOR m_start_color, m_end_color;
|
||||
|
||||
// counters for tweening
|
||||
TweenType m_TweenType;
|
||||
FLOAT m_fTweenTime; // seconds between Start and End positions/zooms
|
||||
FLOAT m_fTimeIntoTween; // how long we have been tweening for
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,47 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Background.cpp
|
||||
//
|
||||
// Desc: Cropped version of the song background displayed in Song Select.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "Background.h"
|
||||
#include "RageUtil.h"
|
||||
|
||||
|
||||
const CString sVisDir = "Visualizations\\";
|
||||
|
||||
|
||||
void Background::LoadFromSong( Song& song )
|
||||
{
|
||||
Sprite::LoadFromTexture( song.GetBackgroundPath() );
|
||||
Sprite::StretchTo( CRect(0,0,640,480) );
|
||||
Sprite::SetColor( D3DXCOLOR(0.7f,0.7f,0.7f,1) );
|
||||
|
||||
CStringArray sVisualizationPaths;
|
||||
GetDirListing( sVisDir + "*.*", sVisualizationPaths );
|
||||
if( sVisualizationPaths.GetSize() > 0 ) // there is at least one visualization
|
||||
{
|
||||
int iIndexRandom = rand() % sVisualizationPaths.GetSize();
|
||||
|
||||
m_sprVis.LoadFromTexture( sVisDir + sVisualizationPaths[iIndexRandom] );
|
||||
m_sprVis.StretchTo( CRect(0,0,640,480) );
|
||||
m_sprVis.SetBlendMode( TRUE );
|
||||
//m_sprVis.SetColor( D3DXCOLOR(1,1,1,0.5f) );
|
||||
}
|
||||
}
|
||||
|
||||
void Background::Update( const FLOAT& fDeltaTime)
|
||||
{
|
||||
Sprite::Update( fDeltaTime );
|
||||
m_sprVis.Update( fDeltaTime );
|
||||
}
|
||||
|
||||
void Background::Draw()
|
||||
{
|
||||
Sprite::Draw();
|
||||
m_sprVis.Draw();
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Background.h
|
||||
//
|
||||
// Desc: Cropped version of the song background displayed in Song Select.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _Background_H_
|
||||
#define _Background_H_
|
||||
|
||||
|
||||
#include "Sprite.h"
|
||||
#include "Song.h"
|
||||
|
||||
|
||||
class Background : public Sprite
|
||||
{
|
||||
public:
|
||||
void LoadFromSong( Song& song );
|
||||
|
||||
void Update( const FLOAT& fDeltaTime);
|
||||
void Draw();
|
||||
|
||||
Sprite m_sprVis;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,61 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Banner.cpp
|
||||
//
|
||||
// Desc: The song's banner displayed in Song Select.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
#include "RageUtil.h"
|
||||
|
||||
#include "Banner.h"
|
||||
|
||||
|
||||
|
||||
BOOL Banner::LoadFromSong( Song &song )
|
||||
{
|
||||
BOOL bResult = Sprite::LoadFromTexture( song.GetBannerPath() );
|
||||
if( bResult )
|
||||
{
|
||||
RECT r;
|
||||
int iImageWidth = this->GetZoomedWidth();
|
||||
int iImageHeight = this->GetZoomedHeight();
|
||||
|
||||
// first find the correct zoom
|
||||
::SetRect( &r, 0, 0, BANNER_WIDTH, BANNER_HEIGHT );
|
||||
Sprite::ScaleToCover( &r );
|
||||
FLOAT fFinalZoom = this->GetZoom();
|
||||
|
||||
// find which dimension is larger
|
||||
BOOL bYDimIsLarger = this->GetZoomedHeight() > BANNER_HEIGHT;
|
||||
|
||||
// now crop it
|
||||
if( !bYDimIsLarger ) // crop X
|
||||
{
|
||||
int iScreenPixelsToCrop = (this->GetZoomedWidth() - BANNER_WIDTH) / 2;
|
||||
int iImagePixelsToCrop = roundf( iScreenPixelsToCrop / fFinalZoom );
|
||||
RECT rectNewSrc;
|
||||
::SetRect( &rectNewSrc, iImagePixelsToCrop,
|
||||
0,
|
||||
iImageWidth - iImagePixelsToCrop,
|
||||
iImageHeight );
|
||||
Sprite::SetCustomSrcRect( rectNewSrc );
|
||||
}
|
||||
else // crop Y
|
||||
{
|
||||
int iScreenPixelsToCrop = (this->GetZoomedHeight() - BANNER_HEIGHT) / 2;
|
||||
int iImagePixelsToCrop = roundf( iScreenPixelsToCrop / fFinalZoom );
|
||||
RECT rectNewSrc;
|
||||
::SetRect( &rectNewSrc, 0,
|
||||
iImagePixelsToCrop,
|
||||
iImageWidth,
|
||||
iImageHeight - iImagePixelsToCrop );
|
||||
Sprite::SetCustomSrcRect( rectNewSrc );
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Banner.h
|
||||
//
|
||||
// Desc: The song's banner displayed in Song Select.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _Banner_H_
|
||||
#define _Banner_H_
|
||||
|
||||
|
||||
#include "Sprite.h"
|
||||
#include "Song.h"
|
||||
|
||||
|
||||
#define COMMON_BANNER_TEXTURE_WIDTH 384
|
||||
#define COMMON_BANNER_TEXTURE_HEIGHT 110
|
||||
|
||||
#define BANNER_WIDTH (COMMON_BANNER_TEXTURE_WIDTH/2)
|
||||
#define BANNER_HEIGHT (COMMON_BANNER_TEXTURE_HEIGHT / 2)
|
||||
|
||||
|
||||
class Banner : public Sprite
|
||||
{
|
||||
public:
|
||||
|
||||
BOOL LoadFromSong( Song &song);
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,112 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: BitmapText.cpp
|
||||
//
|
||||
// Desc: A font class that draws from a bitmap.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "BitmapText.h"
|
||||
#include <assert.h>
|
||||
#include "IniFile.h"
|
||||
|
||||
|
||||
|
||||
BitmapText::BitmapText()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
BOOL BitmapText::LoadFromFontFile( CString sFontFilePath )
|
||||
{
|
||||
RageLog( "BitmapText::LoadFromFontFile(%s)", sFontFilePath );
|
||||
|
||||
m_sFontFilePath = sFontFilePath;
|
||||
|
||||
// read font file
|
||||
IniFile ini;
|
||||
ini.SetPath( m_sFontFilePath );
|
||||
if( !ini.ReadFile() )
|
||||
RageError( ssprintf("Error opening Font file: %s.", m_sFontFilePath) );
|
||||
|
||||
CString sTexturePath = ini.GetValue( "Font", "Texture" );
|
||||
if( sTexturePath == "" )
|
||||
RageError( ssprintf("Error reading value 'Texture' from %s.", m_sFontFilePath) );
|
||||
|
||||
this->LoadFromTexture( sTexturePath );
|
||||
|
||||
// fill in our map from characters to frame no
|
||||
CString sCharacters = ini.GetValue( "Font", "Characters" );
|
||||
if( sCharacters == "" )
|
||||
RageError( ssprintf("Error reading value 'Characters' from %s.", m_sFontFilePath) );
|
||||
|
||||
for( int i=0; i<sCharacters.GetLength(); i++ )
|
||||
{
|
||||
TCHAR c = sCharacters[i];
|
||||
m_mapCharToFrameNo[c] = i;
|
||||
}
|
||||
|
||||
// Validate that the number of characters we read in is the same as
|
||||
// the number of frames in the texture.
|
||||
if( sCharacters.GetLength() != (int)this->GetNumStates() )
|
||||
RageError( ssprintf("The Font %s specifies %d characters, but the Texture has %d frames.",
|
||||
m_sFontFilePath, sCharacters.GetLength(), (int)this->GetNumStates()) );
|
||||
|
||||
ResetWidthAndHeight();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
void BitmapText::SetText( CString sText )
|
||||
{
|
||||
m_sText = sText;
|
||||
|
||||
ResetWidthAndHeight();
|
||||
}
|
||||
|
||||
|
||||
void BitmapText::Draw()
|
||||
{
|
||||
//RageLog( "BitmapText::Draw()" );
|
||||
// UGLY!!!!
|
||||
|
||||
TCHAR c;
|
||||
UINT uFrameNo;
|
||||
int iNumChars = m_sText.GetLength();
|
||||
int iLeftEdge = this->GetLeftEdge();
|
||||
int iOriginalCenterX = (int)this->GetX();
|
||||
FLOAT fOriginalWidth = m_size.x;
|
||||
|
||||
int iFrameWidth = (int)( m_pTexture->GetFrameWidth() * this->GetZoom() );
|
||||
m_size.x = (FLOAT)iFrameWidth;
|
||||
|
||||
// draw each character in the string
|
||||
for( int i=0; i<iNumChars; i++ )
|
||||
{
|
||||
c = m_sText[i];
|
||||
|
||||
// Get what frame in the animation this character is.
|
||||
if( !m_mapCharToFrameNo.Lookup(c, uFrameNo) )
|
||||
uFrameNo = 0;
|
||||
|
||||
this->SetState( uFrameNo );
|
||||
this->SetX( (int)(iLeftEdge + iFrameWidth*(i+0.5f)) );
|
||||
|
||||
Sprite::Draw();
|
||||
}
|
||||
|
||||
this->SetX( iOriginalCenterX );
|
||||
m_size.x = fOriginalWidth;
|
||||
}
|
||||
|
||||
|
||||
void BitmapText::ResetWidthAndHeight()
|
||||
{
|
||||
m_size.x = (FLOAT)m_pTexture->GetFrameWidth() * m_sText.GetLength();
|
||||
m_size.y = (FLOAT)m_pTexture->GetFrameHeight();
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: BitmapText.h
|
||||
//
|
||||
// Desc: A font class that draws from a bitmap.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _BITMAPTEXT_H_
|
||||
#define _BITMAPTEXT_H_
|
||||
|
||||
|
||||
//#include "Actor.h"
|
||||
#include "Sprite.h"
|
||||
#include "BitmapText.h"
|
||||
|
||||
|
||||
|
||||
|
||||
class BitmapText : public Sprite
|
||||
{
|
||||
public:
|
||||
BitmapText();
|
||||
// virtual ~BitmapText();
|
||||
|
||||
BOOL LoadFromFontFile( CString sFontFilePath );
|
||||
void SetText( CString sText );
|
||||
CString GetText() { return m_sText; };
|
||||
|
||||
virtual void Draw();
|
||||
|
||||
protected:
|
||||
void ResetWidthAndHeight();
|
||||
|
||||
CString m_sFontFilePath;
|
||||
CString m_sText; // the string that the font is displaying
|
||||
//Sprite m_Sprite; // holder for the graphic
|
||||
CMap<TCHAR, TCHAR&, UINT, UINT&> m_mapCharToFrameNo;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,83 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Combo.cpp
|
||||
//
|
||||
// Desc: Combo counter that displays while dancing.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
#include "RageUtil.h"
|
||||
|
||||
#include "Combo.h"
|
||||
|
||||
|
||||
#define CENTER_X 320
|
||||
#define CENTER_Y 240
|
||||
|
||||
|
||||
#define FONT "Fonts\\Font - Arial Bold numbers 30px.font"
|
||||
|
||||
#define COMBO_TWEEN_TIME 0.5f
|
||||
#define COMBO_SPRITE "Sprites\\Combo.sprite"
|
||||
#define COMBO_Y (CENTER_Y+60)
|
||||
|
||||
|
||||
Combo::Combo()
|
||||
{
|
||||
m_bVisible = FALSE;
|
||||
|
||||
m_sprCombo.LoadFromSpriteFile( COMBO_SPRITE );
|
||||
m_textNum.LoadFromFontFile( FONT );
|
||||
m_textNum.SetText( "" );
|
||||
|
||||
SetX( CENTER_X );
|
||||
}
|
||||
|
||||
Combo::~Combo()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
void Combo::SetX( int iNewX )
|
||||
{
|
||||
m_sprCombo.SetXY( iNewX+40, COMBO_Y );
|
||||
m_textNum.SetXY( iNewX-50, COMBO_Y );
|
||||
}
|
||||
|
||||
void Combo::Update( const FLOAT &fDeltaTime )
|
||||
{
|
||||
m_sprCombo.Update( fDeltaTime );
|
||||
m_textNum.Update( fDeltaTime );
|
||||
}
|
||||
|
||||
void Combo::Draw()
|
||||
{
|
||||
if( m_bVisible )
|
||||
{
|
||||
m_textNum.Draw();
|
||||
m_sprCombo.Draw();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Combo::SetCombo( int iNum )
|
||||
{
|
||||
if( iNum <= 4 )
|
||||
{
|
||||
m_bVisible = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_bVisible = TRUE;
|
||||
|
||||
m_textNum.SetText( ssprintf("%d", iNum) );
|
||||
m_textNum.SetZoom( 1.0f + iNum/200.0f );
|
||||
m_textNum.TweenTo( COMBO_TWEEN_TIME, m_textNum.GetX(), m_textNum.GetY() );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Combo.h
|
||||
//
|
||||
// Desc: Combo counter that displays while dancing.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _COMBO_H_
|
||||
#define _COMBO_H_
|
||||
|
||||
|
||||
#include "Sprite.h"
|
||||
#include "BitmapText.h"
|
||||
|
||||
class Combo
|
||||
{
|
||||
public:
|
||||
Combo();
|
||||
~Combo();
|
||||
|
||||
void SetX( int iNewX );
|
||||
|
||||
void Update( const FLOAT &fDeltaTime );
|
||||
void Draw();
|
||||
|
||||
void SetCombo( int iNum );
|
||||
|
||||
private:
|
||||
|
||||
BOOL m_bVisible;
|
||||
|
||||
Sprite m_sprCombo;
|
||||
BitmapText m_textNum;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,277 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: IniFile.cpp
|
||||
//
|
||||
// Desc: wrapper for reading and writing an .ini file.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "IniFile.h"
|
||||
#include "fstream.h"
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// Construction/Destruction
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
//default constructor
|
||||
IniFile::IniFile()
|
||||
{
|
||||
}
|
||||
|
||||
//constructor, can specify pathname here instead of using SetPath later
|
||||
IniFile::IniFile(CString inipath)
|
||||
{
|
||||
path = inipath;
|
||||
}
|
||||
|
||||
//default destructor
|
||||
IniFile::~IniFile()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// Public Functions
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
//sets path of ini file to read and write from
|
||||
void IniFile::SetPath(CString newpath)
|
||||
{
|
||||
path = newpath;
|
||||
}
|
||||
|
||||
//reads ini file specified using IniFile::SetPath()
|
||||
//returns true if successful, false otherwise
|
||||
BOOL IniFile::ReadFile()
|
||||
{
|
||||
CFile file;
|
||||
CFileStatus status;
|
||||
if( !file.GetStatus(path,status) )
|
||||
return FALSE;
|
||||
ifstream inifile;
|
||||
CString readinfo;
|
||||
inifile.open(path);
|
||||
int curkey = -1, curval = -1;
|
||||
if( inifile.fail() )
|
||||
{
|
||||
error = "Unable to open ini file.";
|
||||
return FALSE;
|
||||
}
|
||||
CString keyname, valuename, value;
|
||||
CString temp;
|
||||
while( getline(inifile,readinfo) )
|
||||
{
|
||||
if( readinfo != "" )
|
||||
{
|
||||
if( readinfo[0] == '[' && readinfo[readinfo.GetLength()-1] == ']' ) //if a section heading
|
||||
{
|
||||
keyname = readinfo;
|
||||
keyname.TrimLeft('[');
|
||||
keyname.TrimRight(']');
|
||||
}
|
||||
else //if a value
|
||||
{
|
||||
valuename = readinfo.Left(readinfo.Find("="));
|
||||
value = readinfo.Right(readinfo.GetLength()-valuename.GetLength()-1);
|
||||
SetValue(keyname,valuename,value);
|
||||
}
|
||||
}
|
||||
}
|
||||
inifile.close();
|
||||
return 1;
|
||||
}
|
||||
|
||||
//writes data stored in class to ini file
|
||||
void IniFile::WriteFile()
|
||||
{
|
||||
ofstream inifile;
|
||||
inifile.open(path);
|
||||
|
||||
// foreach key
|
||||
for( int keynum = 0; keynum <= names.GetUpperBound(); keynum++ )
|
||||
{
|
||||
inifile << '[' << names[keynum] << ']' << endl;
|
||||
|
||||
CMapStringToString &map = keys[keynum];
|
||||
|
||||
// for each value_name/value pair
|
||||
for( POSITION pos = map.GetStartPosition(); pos != NULL; )
|
||||
{
|
||||
CString value_name;
|
||||
CString value;
|
||||
map.GetNextAssoc( pos, value_name, value );
|
||||
|
||||
inifile << value_name << "=" << value << endl;
|
||||
}
|
||||
inifile << endl;
|
||||
}
|
||||
|
||||
inifile.close();
|
||||
}
|
||||
|
||||
//deletes all stored ini data
|
||||
void IniFile::Reset()
|
||||
{
|
||||
keys.SetSize(0);
|
||||
names.SetSize(0);
|
||||
}
|
||||
|
||||
//returns number of keys currently in the ini
|
||||
int IniFile::GetNumKeys()
|
||||
{
|
||||
return keys.GetSize();
|
||||
}
|
||||
|
||||
//returns a refernce to the key for direct modification
|
||||
CMapStringToString& IniFile::GetKeyRef( CString keyname )
|
||||
{
|
||||
int keynum = FindKey(keyname);
|
||||
if (keynum == -1)
|
||||
return keys[0];
|
||||
else
|
||||
return keys[keynum];
|
||||
}
|
||||
|
||||
//returns number of values stored for specified key, or -1 if key found
|
||||
int IniFile::GetNumValues(CString keyname)
|
||||
{
|
||||
int keynum = FindKey(keyname);
|
||||
if (keynum == -1)
|
||||
return -1;
|
||||
else
|
||||
return keys[keynum].GetCount();
|
||||
}
|
||||
|
||||
//gets value of [keyname] valuename =
|
||||
//overloaded to return CString, int, and double
|
||||
CString IniFile::GetValue(CString keyname, CString valuename)
|
||||
{
|
||||
int keynum = FindKey(keyname);//, valuenum = FindValue(keynum,valuename);
|
||||
if( keynum == -1 )
|
||||
{
|
||||
error = "Unable to locate specified key.";
|
||||
return "";
|
||||
}
|
||||
|
||||
CMapStringToString &map = keys[keynum];
|
||||
CString value;
|
||||
if( !map.Lookup(valuename, value) )
|
||||
{
|
||||
error = "Unable to locate specified value.";
|
||||
return "";
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
//gets value of [keyname] valuename =
|
||||
//overloaded to return CString, int, and double
|
||||
int IniFile::GetValueI(CString keyname, CString valuename)
|
||||
{
|
||||
return atoi( GetValue(keyname,valuename) );
|
||||
}
|
||||
|
||||
//gets value of [keyname] valuename =
|
||||
//overloaded to return CString, int, and double
|
||||
double IniFile::GetValueF(CString keyname, CString valuename)
|
||||
{
|
||||
return atof( GetValue(keyname, valuename) );
|
||||
}
|
||||
|
||||
//sets value of [keyname] valuename =.
|
||||
//specify the optional paramter as false (0) if you do not want it to create
|
||||
//the key if it doesn't exist. Returns true if data entered, false otherwise
|
||||
//overloaded to accept CString, int, and double
|
||||
BOOL IniFile::SetValue(CString keyname, CString valuename, CString value, BOOL create)
|
||||
{
|
||||
int keynum = FindKey(keyname);
|
||||
|
||||
if( keynum == -1 ) //if key doesn't exist
|
||||
{
|
||||
if( !create ) //and user does not want to create it,
|
||||
return FALSE; //stop entering this key
|
||||
names.SetSize(names.GetSize()+1);
|
||||
keys.SetSize(keys.GetSize()+1);
|
||||
keynum = names.GetSize()-1;
|
||||
names[keynum] = keyname;
|
||||
}
|
||||
|
||||
// insert value
|
||||
CMapStringToString &map = keys[keynum];
|
||||
CString oldvalue;
|
||||
if( !map.Lookup(valuename, oldvalue) && !create )
|
||||
return FALSE;
|
||||
map[valuename] = value;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//sets value of [keyname] valuename =.
|
||||
//specify the optional paramter as false (0) if you do not want it to create
|
||||
//the key if it doesn't exist. Returns true if data entered, false otherwise
|
||||
//overloaded to accept CString, int, and double
|
||||
BOOL IniFile::SetValueI(CString keyname, CString valuename, int value, BOOL create)
|
||||
{
|
||||
CString temp;
|
||||
temp.Format("%d",value);
|
||||
return SetValue(keyname, valuename, temp, create);
|
||||
}
|
||||
|
||||
//sets value of [keyname] valuename =.
|
||||
//specify the optional paramter as false (0) if you do not want it to create
|
||||
//the key if it doesn't exist. Returns true if data entered, false otherwise
|
||||
//overloaded to accept CString, int, and double
|
||||
BOOL IniFile::SetValueF(CString keyname, CString valuename, double value, BOOL create)
|
||||
{
|
||||
CString temp;
|
||||
temp.Format("%e",value);
|
||||
return SetValue(keyname, valuename, temp, create);
|
||||
}
|
||||
|
||||
//deletes specified value
|
||||
//returns true if value existed and deleted, false otherwise
|
||||
BOOL IniFile::DeleteValue(CString keyname, CString valuename)
|
||||
{
|
||||
int keynum = FindKey(keyname);
|
||||
if( keynum == -1 )
|
||||
return FALSE;
|
||||
|
||||
CMapStringToString &map = keys[keynum];
|
||||
return map.RemoveKey( valuename );
|
||||
}
|
||||
|
||||
//deletes specified key and all values contained within
|
||||
//returns true if key existed and deleted, false otherwise
|
||||
BOOL IniFile::DeleteKey(CString keyname)
|
||||
{
|
||||
int keynum = FindKey(keyname);
|
||||
if (keynum == -1)
|
||||
return 0;
|
||||
keys.RemoveAt(keynum);
|
||||
names.RemoveAt(keynum);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
// Private Functions
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
//returns index of specified key, or -1 if not found
|
||||
int IniFile::FindKey(CString keyname)
|
||||
{
|
||||
int keynum = 0;
|
||||
while ( keynum < keys.GetSize() && names[keynum] != keyname)
|
||||
keynum++;
|
||||
if (keynum == keys.GetSize())
|
||||
return -1;
|
||||
return keynum;
|
||||
}
|
||||
|
||||
//overloaded from original getline to take CString
|
||||
istream & IniFile:: getline(istream & is, CString & str)
|
||||
{
|
||||
char buf[2048];
|
||||
is.getline(buf,2048);
|
||||
str = buf;
|
||||
return is;
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: IniFile.h
|
||||
//
|
||||
// Desc: wrapper for reading and writing an .ini file.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _INIFILE_H_
|
||||
#define _INIFILE_H_
|
||||
|
||||
#include <afxtempl.h>
|
||||
#include <iostream.h>
|
||||
|
||||
|
||||
class IniFile
|
||||
{
|
||||
//all private variables
|
||||
private:
|
||||
|
||||
//stores pathname of ini file to read/write
|
||||
CString path;
|
||||
|
||||
//all keys are of this time
|
||||
typedef CMapStringToString key;
|
||||
|
||||
//list of keys in ini
|
||||
CArray<key, key> keys;
|
||||
|
||||
//corresponding list of keynames
|
||||
CArray<CString, CString> names;
|
||||
|
||||
|
||||
|
||||
//all private functions
|
||||
private:
|
||||
//overloaded to take CString
|
||||
istream & getline( istream & is, CString & str );
|
||||
|
||||
//returns index of specified key, or -1 if not found
|
||||
int FindKey(CString keyname);
|
||||
|
||||
|
||||
//public variables
|
||||
public:
|
||||
|
||||
//will contain error info if one occurs
|
||||
//ended up not using much, just in ReadFile and GetValue
|
||||
CString error;
|
||||
|
||||
|
||||
//public functions
|
||||
public:
|
||||
//default constructor
|
||||
IniFile();
|
||||
|
||||
//constructor, can specify pathname here instead of using SetPath later
|
||||
IniFile(CString inipath);
|
||||
|
||||
//default destructor
|
||||
virtual ~IniFile();
|
||||
|
||||
//sets path of ini file to read and write from
|
||||
void SetPath(CString newpath);
|
||||
|
||||
//reads ini file specified using IniFile::SetPath()
|
||||
//returns true if successful, false otherwise
|
||||
BOOL ReadFile();
|
||||
|
||||
//writes data stored in class to ini file
|
||||
void WriteFile();
|
||||
|
||||
//deletes all stored ini data
|
||||
void Reset();
|
||||
|
||||
//returns number of keys currently in the ini
|
||||
int GetNumKeys();
|
||||
|
||||
//returns a refernce to the key for direct modification
|
||||
CMapStringToString& GetKeyRef( CString keyname );
|
||||
|
||||
//returns number of values stored for specified key
|
||||
int GetNumValues( CString keyname );
|
||||
|
||||
//gets value of [keyname] valuename =
|
||||
//overloaded to return CString, int, and double,
|
||||
//returns "", or 0 if key/value not found. Sets error member to show problem
|
||||
CString GetValue(CString keyname, CString valuename);
|
||||
int GetValueI(CString keyname, CString valuename);
|
||||
double GetValueF(CString keyname, CString valuename);
|
||||
|
||||
//sets value of [keyname] valuename =.
|
||||
//specify the optional paramter as false (0) if you do not want it to create
|
||||
//the key if it doesn't exist. Returns true if data entered, false otherwise
|
||||
//overloaded to accept CString, int, and double
|
||||
BOOL SetValue(CString key, CString valuename, CString value, BOOL create = 1);
|
||||
BOOL SetValueI(CString key, CString valuename, int value, BOOL create = 1);
|
||||
BOOL SetValueF(CString key, CString valuename, double value, BOOL create = 1);
|
||||
|
||||
//deletes specified value
|
||||
//returns true if value existed and deleted, false otherwise
|
||||
BOOL DeleteValue(CString keyname, CString valuename);
|
||||
|
||||
//deletes specified key and all values contained within
|
||||
//returns true if key existed and deleted, false otherwise
|
||||
BOOL DeleteKey(CString keyname);
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,104 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Judgement.h
|
||||
//
|
||||
// Desc: Feedback about the last step that appears in the middle of a player's stream of arrows.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include "RageUtil.h"
|
||||
|
||||
#include "Judgement.h"
|
||||
|
||||
|
||||
#define CENTER_X 320
|
||||
#define CENTER_Y 240
|
||||
|
||||
#define JUDGEMENT_DISPLAY_TIME 1.0f
|
||||
#define JUDGEMENT_SPRITE "Sprites\\Judgement.sprite"
|
||||
#define JUDGEMENT_Y CENTER_Y
|
||||
|
||||
|
||||
|
||||
Judgement::Judgement() :
|
||||
m_fDisplayTimeLeft( 0.0 )
|
||||
{
|
||||
m_sprJudgement.LoadFromSpriteFile( JUDGEMENT_SPRITE );
|
||||
|
||||
SetX( CENTER_X );
|
||||
}
|
||||
|
||||
Judgement::~Judgement()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void Judgement::SetX( int iNewX )
|
||||
{
|
||||
m_sprJudgement.SetXY( iNewX, CENTER_Y );
|
||||
}
|
||||
|
||||
void Judgement::Update( const FLOAT &fDeltaTime )
|
||||
{
|
||||
if( m_fDisplayTimeLeft > 0.0 )
|
||||
m_fDisplayTimeLeft -= fDeltaTime;
|
||||
m_sprJudgement.Update( fDeltaTime );
|
||||
}
|
||||
|
||||
void Judgement::Draw()
|
||||
{
|
||||
// RageLog( "Judgement::Draw()" );
|
||||
|
||||
if( m_fDisplayTimeLeft > 0.0 )
|
||||
m_sprJudgement.Draw();
|
||||
}
|
||||
|
||||
|
||||
void Judgement::Perfect()
|
||||
{
|
||||
RageLog( "Judgement::Perfect()" );
|
||||
|
||||
m_sprJudgement.SetState( 0 );
|
||||
|
||||
TweenFromBigToSmall();
|
||||
}
|
||||
|
||||
void Judgement::Great()
|
||||
{
|
||||
m_sprJudgement.SetState( 1 );
|
||||
|
||||
TweenFromBigToSmall();
|
||||
}
|
||||
|
||||
void Judgement::Good()
|
||||
{
|
||||
m_sprJudgement.SetState( 2 );
|
||||
|
||||
TweenFromBigToSmall();
|
||||
}
|
||||
|
||||
void Judgement::Boo()
|
||||
{
|
||||
m_sprJudgement.SetState( 3 );
|
||||
|
||||
TweenFromBigToSmall();
|
||||
}
|
||||
|
||||
void Judgement::Miss()
|
||||
{
|
||||
m_sprJudgement.SetState( 4 );
|
||||
|
||||
TweenFromBigToSmall();
|
||||
}
|
||||
|
||||
|
||||
void Judgement::TweenFromBigToSmall()
|
||||
{
|
||||
m_fDisplayTimeLeft = JUDGEMENT_DISPLAY_TIME;
|
||||
|
||||
m_sprJudgement.SetZoom( 1.5f );
|
||||
m_sprJudgement.TweenTo( JUDGEMENT_DISPLAY_TIME/2.0,
|
||||
m_sprJudgement.GetX(),
|
||||
m_sprJudgement.GetY() );
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Judgement.h
|
||||
//
|
||||
// Desc: Feedback about the last step that appears in the middle of a player's stream of arrows.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _JUDGEMENT_H_
|
||||
#define _JUDGEMENT_H_
|
||||
|
||||
|
||||
#include "Sprite.h"
|
||||
|
||||
|
||||
class Judgement
|
||||
{
|
||||
public:
|
||||
Judgement();
|
||||
~Judgement();
|
||||
|
||||
void SetX( int iNewX );
|
||||
|
||||
void Update( const FLOAT &fDeltaTime );
|
||||
void Draw();
|
||||
|
||||
void Perfect();
|
||||
void Great();
|
||||
void Good();
|
||||
void Boo();
|
||||
void Miss();
|
||||
|
||||
private:
|
||||
void TweenFromBigToSmall();
|
||||
|
||||
|
||||
FLOAT m_fDisplayTimeLeft;
|
||||
|
||||
Sprite m_sprJudgement;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,102 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: LifeMeter.cpp
|
||||
//
|
||||
// Desc: LifeMeter counter that displays while dancing.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "RageUtil.h"
|
||||
|
||||
#include "LifeMeter.h"
|
||||
|
||||
|
||||
#define SCREEN_WIDTH 640
|
||||
#define SCREEN_HEIGHT 480
|
||||
#define CENTER_X 320
|
||||
#define CENTER_Y 240
|
||||
|
||||
|
||||
#define FONT "Fonts\\Font - Arial Bold numbers 30px.font"
|
||||
|
||||
#define NUM_PILLS 17
|
||||
|
||||
//#define LIFEMETER_TWEEN_TIME 0.5f
|
||||
#define LIFEMETER_FRAME_SPRITE "Sprites\\Life Meter Frame.sprite"
|
||||
#define LIFEMETER_PILLS_SPRITE "Sprites\\Life Meter Pills.sprite"
|
||||
#define LIFEMETER_Y 30
|
||||
#define LIFEMETER_PILLS_Y (LIFEMETER_Y+2)
|
||||
|
||||
const FLOAT PILL_OFFSET[NUM_PILLS] = {
|
||||
0.3f, 0.7f, 1.0f, 0.7f, 0.3f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f
|
||||
};
|
||||
|
||||
|
||||
LifeMeter::LifeMeter() :
|
||||
m_fLifePercentage( 0.5f )
|
||||
{
|
||||
m_sprLifeMeterFrame.LoadFromSpriteFile( LIFEMETER_FRAME_SPRITE );
|
||||
m_sprLifeMeterPills.LoadFromSpriteFile( LIFEMETER_PILLS_SPRITE );
|
||||
|
||||
SetX( CENTER_X );
|
||||
}
|
||||
|
||||
LifeMeter::~LifeMeter()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
void LifeMeter::SetX( FLOAT iNewX )
|
||||
{
|
||||
m_sprLifeMeterFrame.SetXY( iNewX, LIFEMETER_Y );
|
||||
m_sprLifeMeterPills.SetXY( iNewX, LIFEMETER_PILLS_Y );
|
||||
}
|
||||
|
||||
void LifeMeter::Update( const FLOAT &fDeltaTime )
|
||||
{
|
||||
m_sprLifeMeterFrame.Update( fDeltaTime );
|
||||
m_sprLifeMeterPills.Update( fDeltaTime );
|
||||
}
|
||||
|
||||
void LifeMeter::Draw( FLOAT fSongBeat )
|
||||
{
|
||||
FLOAT fBeatPercentage = fSongBeat - (int)fSongBeat;
|
||||
int iOffsetStart = roundf( NUM_PILLS*fBeatPercentage );
|
||||
|
||||
m_sprLifeMeterFrame.Draw();
|
||||
|
||||
FLOAT iX = m_sprLifeMeterFrame.GetLeftEdge() + 27;
|
||||
int iNumPills = (int)(m_sprLifeMeterPills.GetNumStates() * m_fLifePercentage);
|
||||
int iPillWidth = m_sprLifeMeterPills.GetZoomedWidth();
|
||||
|
||||
for( int i=0; i<iNumPills; i++ )
|
||||
{
|
||||
m_sprLifeMeterPills.SetState( i );
|
||||
m_sprLifeMeterPills.SetX( iX );
|
||||
|
||||
int iOffsetNum = (iOffsetStart - i + NUM_PILLS) % NUM_PILLS;
|
||||
int iOffset = roundf( PILL_OFFSET[iOffsetNum] * m_fLifePercentage * 8.0f );
|
||||
m_sprLifeMeterPills.SetY( LIFEMETER_PILLS_Y - iOffset );
|
||||
|
||||
m_sprLifeMeterPills.Draw();
|
||||
|
||||
iX += iPillWidth;
|
||||
}
|
||||
}
|
||||
|
||||
void LifeMeter::SetLife( FLOAT fNewLife )
|
||||
{
|
||||
assert( fNewLife >= 0.0f && fNewLife <= 1.0f );
|
||||
m_fLifePercentage = fNewLife;
|
||||
|
||||
if( fNewLife >= 0.9f )
|
||||
m_sprLifeMeterFrame.SetEffectCamelion( 5, D3DXCOLOR(0.2f,0.2f,0.2f,1), D3DXCOLOR(1,1,1,1) );
|
||||
else if( fNewLife < 0.25f )
|
||||
m_sprLifeMeterFrame.SetEffectCamelion( 5, D3DXCOLOR(1,0.8f,0.8f,1), D3DXCOLOR(1,0.2f,0.2f,1) );
|
||||
else
|
||||
m_sprLifeMeterFrame.SetEffectNone();
|
||||
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: LifeMeter.h
|
||||
//
|
||||
// Desc: LifeMeter display at the bottom of the screen while dancing.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _LIFEMETER_H_
|
||||
#define _LIFEMETER_H_
|
||||
|
||||
|
||||
#include "Sprite.h"
|
||||
|
||||
class LifeMeter
|
||||
{
|
||||
public:
|
||||
LifeMeter();
|
||||
~LifeMeter();
|
||||
|
||||
void SetX( FLOAT iNewX );
|
||||
|
||||
void Update( const FLOAT &fDeltaTime );
|
||||
void Draw( FLOAT fSongBeat );
|
||||
|
||||
void SetLife( FLOAT fNewLife );
|
||||
|
||||
private:
|
||||
|
||||
Sprite m_sprLifeMeterFrame;
|
||||
Sprite m_sprLifeMeterPills;
|
||||
|
||||
FLOAT m_fLifePercentage;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,270 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Player.cpp
|
||||
//
|
||||
// Desc: Object that accepts pad input, knocks down ColorArrows that were stepped on,
|
||||
// and keeps score for the player.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "Util.h"
|
||||
#include "Math.h" // for fabs()
|
||||
|
||||
#include "Player.h"
|
||||
|
||||
|
||||
|
||||
#define STEP_DOWN_TIME 0.05f
|
||||
|
||||
#define SCORE_ADD_PERFECT 700
|
||||
#define SCORE_ADD_GREAT 400
|
||||
#define SCORE_ADD_GOOD 200
|
||||
#define SCORE_ADD_BOO 100
|
||||
|
||||
#define SCORE_MULT_PERFECT 1.007f
|
||||
#define SCORE_MULT_GREAT 1.004f
|
||||
#define SCORE_MULT_GOOD 1.002f
|
||||
#define SCORE_MULT_BOO 1.001f
|
||||
|
||||
#define LIFE_PERFECT 0.015f
|
||||
#define LIFE_GREAT 0.008f
|
||||
#define LIFE_GOOD 0.000f
|
||||
#define LIFE_BOO -0.015f
|
||||
#define LIFE_MISS -0.060f
|
||||
|
||||
|
||||
void Player::Set( GrayArrows *pGA, ColorArrows *pCA,
|
||||
Judgement *pJ, Combo *pC,
|
||||
Score *pS, LifeMeter *pL,
|
||||
Steps steps, FLOAT fMaxBeatDifference )
|
||||
{
|
||||
RageLog( "Player::Set()" );
|
||||
|
||||
m_pGA = pGA;
|
||||
m_pCA = pCA;
|
||||
m_pJudgement = pJ;
|
||||
m_pCombo = pC;
|
||||
m_pScore = pS;
|
||||
m_pLifeMeter = pL;
|
||||
if( m_pLifeMeter ) m_pLifeMeter->SetLife( m_fLife );
|
||||
|
||||
m_Steps = steps;
|
||||
|
||||
m_StepScore.SetSize( MAX_STEP_ELEMENTS );
|
||||
for( int i=0; i<m_StepScore.GetSize(); i++ )
|
||||
m_StepScore[i] = no_score;
|
||||
|
||||
m_fMaxBeatDifference = fMaxBeatDifference;
|
||||
}
|
||||
|
||||
|
||||
void Player::Update( const FLOAT &fDeltaTime )
|
||||
{
|
||||
//RageLog( "Player::Update(%f)", fDeltaTime );
|
||||
|
||||
for( int i=0; i<2; i++ ) {
|
||||
for( int j=0; j<4; j++ ) {
|
||||
if( m_fStepCountDown[i][j] > 0.0 )
|
||||
m_fStepCountDown[i][j] -= fDeltaTime;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int iNumMisses = UpdateMissedStepsOlderThan( m_fSongBeat-m_fMaxBeatDifference );
|
||||
if( iNumMisses > 0 )
|
||||
{
|
||||
m_pJudgement->Miss();
|
||||
m_iCurCombo = 0;
|
||||
m_pCombo->SetCombo( 0 );
|
||||
m_fLife += LIFE_MISS * iNumMisses;
|
||||
if( m_fLife < 0.0f )
|
||||
m_fLife = 0.0f;
|
||||
m_pLifeMeter->SetLife( m_fLife );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Player::StepOn( Step player_step )
|
||||
{
|
||||
// DebugLog( CString("Player::Step() ") + padStepL.ToString() + CString(" ") + padStepR.ToString() );
|
||||
|
||||
// Fill the "step buffer" so that the player doesn't have to hit 2 buttons
|
||||
// at the exact same time in order to hit a two direction step
|
||||
if( player_step & STEP_P1_LEFT ) m_fStepCountDown[0][0] = STEP_DOWN_TIME;
|
||||
if( player_step & STEP_P1_DOWN ) m_fStepCountDown[0][1] = STEP_DOWN_TIME;
|
||||
if( player_step & STEP_P1_UP ) m_fStepCountDown[0][2] = STEP_DOWN_TIME;
|
||||
if( player_step & STEP_P1_RIGHT ) m_fStepCountDown[0][3] = STEP_DOWN_TIME;
|
||||
|
||||
// make the gray foot steps on the screen follow the input
|
||||
m_pGA->StepOn( player_step );
|
||||
|
||||
HandleStep();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void Player::HandleStep()
|
||||
{
|
||||
//RageLog( "Player::HandleStep()" );
|
||||
|
||||
// This is being called just after a step, so we know at
|
||||
// least one direction is being depressed.
|
||||
|
||||
// Build pad steps to check against
|
||||
Step player_step = 0x0000;
|
||||
if( m_fStepCountDown[0][0] > 0.0f ) player_step |= STEP_P1_LEFT;
|
||||
if( m_fStepCountDown[0][1] > 0.0f ) player_step |= STEP_P1_DOWN;
|
||||
if( m_fStepCountDown[0][2] > 0.0f ) player_step |= STEP_P1_UP;
|
||||
if( m_fStepCountDown[0][3] > 0.0f ) player_step |= STEP_P1_RIGHT;
|
||||
|
||||
// find the closest step that our PadSteps cover
|
||||
//RageLog( "I ask: What step %s, %s, is near %f (within %f )",
|
||||
// padStepL.ToString(),
|
||||
// padStepR.ToString(),
|
||||
// m_fSongBeat,
|
||||
// MAX_BEAT_DIFFERENCE );
|
||||
|
||||
int iIndexOfClosest =
|
||||
m_Steps.GetIndexOfClosestStep( m_fSongBeat,
|
||||
m_fMaxBeatDifference,
|
||||
player_step );
|
||||
|
||||
if( iIndexOfClosest == -1 ) // if no steps in our specified range are covered
|
||||
return;
|
||||
|
||||
|
||||
|
||||
FLOAT fStepBeat = StepIndexToBeat( iIndexOfClosest ); // this is the beat of the note we stepped on
|
||||
|
||||
//RageLog( "GetClosestMatch returned: iIndexOfClosest = %d (%s, %s, fStepBeat: %f)",
|
||||
// iIndexOfClosest,
|
||||
// m_Steps.StepsLeft [iIndexOfClosest].ToString(),
|
||||
// m_Steps.StepsRight[iIndexOfClosest].ToString(),
|
||||
// fStepBeat );
|
||||
|
||||
|
||||
FLOAT fBeatsUntilStep = fStepBeat - m_fSongBeat;
|
||||
FLOAT fPercentFromPerfect = (FLOAT)fabs( fBeatsUntilStep / m_fMaxBeatDifference );
|
||||
|
||||
RageLog( "fBeatsUntilStep: %f, fPercentFromPerfect: %f",
|
||||
fBeatsUntilStep, fPercentFromPerfect );
|
||||
|
||||
// step on the note so that it can't be stepped on any more
|
||||
m_Steps.StatusArray[iIndexOfClosest] = stepped_on;
|
||||
|
||||
// compute what the score should be for the note we stepped on
|
||||
StepScore &score = m_StepScore[iIndexOfClosest];
|
||||
|
||||
if( fPercentFromPerfect < 0.20f )
|
||||
score = perfect;
|
||||
else if( fPercentFromPerfect < 0.45f )
|
||||
score = great;
|
||||
else if( fPercentFromPerfect < 0.75f )
|
||||
score = good;
|
||||
else
|
||||
score = boo;
|
||||
|
||||
// update the judgement display
|
||||
switch( score )
|
||||
{
|
||||
case perfect: m_pJudgement->Perfect(); break;
|
||||
case great: m_pJudgement->Great(); break;
|
||||
case good: m_pJudgement->Good(); break;
|
||||
case boo: m_pJudgement->Boo(); break;
|
||||
}
|
||||
|
||||
// update the combo display
|
||||
switch( score )
|
||||
{
|
||||
case perfect:
|
||||
case great:
|
||||
m_iCurCombo++;
|
||||
m_pCombo->SetCombo( m_iCurCombo );
|
||||
break;
|
||||
case good:
|
||||
case boo:
|
||||
// combo stopped
|
||||
if( m_iCurCombo > m_iMaxCombo )
|
||||
m_iMaxCombo = m_iCurCombo;
|
||||
m_iCurCombo = 0;
|
||||
m_pCombo->SetCombo( m_iCurCombo );
|
||||
break;
|
||||
}
|
||||
|
||||
// remove the arrows from the ColorArrow columns if the score is high enough
|
||||
if( score == perfect || score == great )
|
||||
{
|
||||
m_pCA->StepOn( BeatToStepIndex(fStepBeat) );
|
||||
}
|
||||
|
||||
// update running score
|
||||
switch( score )
|
||||
{
|
||||
case perfect: m_fScore += SCORE_ADD_PERFECT; m_fScore *= SCORE_MULT_PERFECT; break;
|
||||
case great: m_fScore += SCORE_ADD_GREAT; m_fScore *= SCORE_MULT_GREAT; break;
|
||||
case good: m_fScore += SCORE_ADD_GOOD; m_fScore *= SCORE_MULT_GOOD; break;
|
||||
case boo: m_fScore += SCORE_ADD_BOO; m_fScore *= SCORE_MULT_BOO; break;
|
||||
case miss: break;
|
||||
}
|
||||
|
||||
// update life meter
|
||||
switch( score )
|
||||
{
|
||||
case perfect: m_fLife += LIFE_PERFECT; break;
|
||||
case great: m_fLife += LIFE_GREAT; break;
|
||||
case good: m_fLife += LIFE_GOOD; break;
|
||||
case boo: m_fLife += LIFE_BOO; break;
|
||||
}
|
||||
if( m_fLife < 0.0f ) m_fLife = 0.0f;
|
||||
else if( m_fLife > 1.0f ) m_fLife = 1.0f;
|
||||
|
||||
|
||||
m_pScore->SetScore( m_fScore );
|
||||
m_pLifeMeter->SetLife( m_fLife );
|
||||
}
|
||||
|
||||
int Player::UpdateMissedStepsOlderThan( FLOAT iMissIfOlderThanThisBeat )
|
||||
{
|
||||
//RageLog( "Steps::UpdateMissedStepsOlderThan(%f)", iMissIfOlderThanThisBeat );
|
||||
|
||||
int iMissIfOlderThanThisIndex = BeatToStepIndex( iMissIfOlderThanThisBeat );
|
||||
|
||||
int iNumMissesFound = 0;
|
||||
|
||||
for( int i=0; i<iMissIfOlderThanThisIndex; i++ )
|
||||
{
|
||||
// RageLog( "Step %d: status == %d, score == %d", i, StatusArray[i], Score[i] );
|
||||
if( m_Steps.StatusArray[i] == not_stepped_on && m_StepScore[i] == no_score )
|
||||
{
|
||||
m_StepScore[i] = miss;
|
||||
iNumMissesFound++;
|
||||
}
|
||||
}
|
||||
|
||||
return iNumMissesFound;
|
||||
}
|
||||
|
||||
|
||||
ScoreSummary Player::GetScoreSummary()
|
||||
{
|
||||
ScoreSummary scoreSummary;
|
||||
|
||||
for( int i=0; i<m_StepScore.GetSize(); i++ )
|
||||
{
|
||||
switch( m_StepScore[i] )
|
||||
{
|
||||
case perfect: scoreSummary.perfect++; break;
|
||||
case great: scoreSummary.great++; break;
|
||||
case good: scoreSummary.good++; break;
|
||||
case boo: scoreSummary.boo++; break;
|
||||
case miss: scoreSummary.miss++; break;
|
||||
case no_score: break;
|
||||
}
|
||||
}
|
||||
scoreSummary.max_combo = m_iMaxCombo;
|
||||
scoreSummary.score = m_fScore;
|
||||
|
||||
return scoreSummary;
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Player.h
|
||||
//
|
||||
// Desc: Object that accepts pad input, knocks down ColorArrows that were stepped on,
|
||||
// and keeps score for the player.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _PLAYER_H_
|
||||
#define _PLAYER_H_
|
||||
|
||||
|
||||
#include "GameOptions.h"
|
||||
#include "GrayArrows.h"
|
||||
#include "Steps.h"
|
||||
#include "ColorArrows.h"
|
||||
#include "Judgement.h"
|
||||
#include "Combo.h"
|
||||
#include "Score.h"
|
||||
#include "LifeMeter.h"
|
||||
|
||||
|
||||
enum StepScore { no_score, perfect, great, good, boo, miss };
|
||||
|
||||
|
||||
class Player
|
||||
{
|
||||
public:
|
||||
Player()
|
||||
{
|
||||
m_fSongBeat = 0.0;
|
||||
|
||||
for( int i=0; i<2; i++ ) {
|
||||
for( int j=0; j<4; j++ ) {
|
||||
m_fStepCountDown[i][j] = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
m_pGA = NULL;
|
||||
m_pCA = NULL;
|
||||
m_pJudgement = NULL;
|
||||
m_pCombo = NULL;
|
||||
m_pScore = NULL;
|
||||
m_pLifeMeter = NULL;
|
||||
|
||||
m_iCurCombo = 0;
|
||||
m_iMaxCombo = 0;
|
||||
m_fScore = 0.0f;
|
||||
m_fLife = 0.50f;
|
||||
};
|
||||
~Player() {};
|
||||
|
||||
void Set( GrayArrows *pGA, ColorArrows *pCA,
|
||||
Judgement *pJ, Combo *pC,
|
||||
Score *pS, LifeMeter *pL,
|
||||
Steps steps, FLOAT fMaxBeatDifference );
|
||||
|
||||
void SetSongBeat( const FLOAT &fSongBeat ) { m_fSongBeat = fSongBeat; };
|
||||
void Update( const FLOAT &fDeltaTime );
|
||||
|
||||
void StepOn( Step player_step );
|
||||
void HandleStep();
|
||||
int UpdateMissedStepsOlderThan( FLOAT iMissIfOlderThanThisBeat );
|
||||
|
||||
FLOAT GetLife() { return m_fLife; };
|
||||
ScoreSummary GetScoreSummary();
|
||||
private:
|
||||
|
||||
FLOAT m_fSongBeat;
|
||||
FLOAT m_fMaxBeatDifference;
|
||||
|
||||
// step cache (so player doesn't have to hit buttons
|
||||
// on exact same update in order to hit two arrow notes)
|
||||
FLOAT m_fStepCountDown[2][4];
|
||||
|
||||
GrayArrows *m_pGA;
|
||||
ColorArrows *m_pCA;
|
||||
|
||||
Judgement *m_pJudgement;
|
||||
Combo *m_pCombo;
|
||||
Score *m_pScore;
|
||||
LifeMeter *m_pLifeMeter;
|
||||
|
||||
Steps m_Steps;
|
||||
CArray<StepScore, StepScore&> m_StepScore;
|
||||
|
||||
int m_iCurCombo;
|
||||
int m_iMaxCombo;
|
||||
|
||||
FLOAT m_fLife;
|
||||
FLOAT m_fScore;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,99 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: RageBitmapTexture.cpp
|
||||
//
|
||||
// Desc:
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// In-line Links
|
||||
//-----------------------------------------------------------------------------
|
||||
//#pragma comment(lib, "winmm.lib")
|
||||
#pragma comment(lib, "dxerr8.lib")
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Includes
|
||||
//-----------------------------------------------------------------------------
|
||||
#include "RageBitmapTexture.h"
|
||||
#include "dxerr8.h"
|
||||
#include "DXUtil.h"
|
||||
#include "RageUtil.h"
|
||||
|
||||
//#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// RageBitmapTexture constructor
|
||||
//-----------------------------------------------------------------------------
|
||||
RageBitmapTexture::RageBitmapTexture( LPRageScreen pScreen, CString sFilePath ) :
|
||||
RageTexture( pScreen, sFilePath )
|
||||
{
|
||||
// RageLog( "RageBitmapTexture::RageBitmapTexture()" );
|
||||
|
||||
Create();
|
||||
|
||||
CreateFrameRects();
|
||||
}
|
||||
|
||||
RageBitmapTexture::~RageBitmapTexture()
|
||||
{
|
||||
SAFE_RELEASE(m_pd3dTexture);
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// GetTexture
|
||||
//-----------------------------------------------------------------------------
|
||||
LPDIRECT3DTEXTURE8 RageBitmapTexture::GetD3DTexture()
|
||||
{
|
||||
return m_pd3dTexture;
|
||||
}
|
||||
|
||||
|
||||
VOID RageBitmapTexture::Create()
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
D3DXIMAGE_INFO ddii;
|
||||
|
||||
// load texture
|
||||
if (FAILED (hr = D3DXCreateTextureFromFileEx(
|
||||
m_pd3dDevice,
|
||||
m_sFilePath,
|
||||
D3DX_DEFAULT, D3DX_DEFAULT,
|
||||
D3DX_DEFAULT,
|
||||
0,
|
||||
D3DFMT_A4R4G4B4, //D3DFMT_UNKNOWN, // get format from source
|
||||
D3DPOOL_MANAGED,
|
||||
D3DX_FILTER_NONE, // don't blow up the image to the texure size
|
||||
D3DX_FILTER_NONE,
|
||||
0, // no color key
|
||||
&ddii,
|
||||
NULL, // no palette
|
||||
&m_pd3dTexture ) ) )
|
||||
RageErrorHr( ssprintf("D3DXCreateTextureFromFileEx() failed for file '%s'.", m_sFilePath), hr );
|
||||
|
||||
|
||||
m_uImageWidth = ddii.Width;
|
||||
m_uImageHeight= ddii.Height;
|
||||
|
||||
|
||||
// D3DXCreateTexture can silently change the parameters on us
|
||||
D3DSURFACE_DESC ddsd;
|
||||
if ( FAILED( hr = m_pd3dTexture->GetLevelDesc( 0, &ddsd ) ) )
|
||||
RageErrorHr( "Could not get level Description of D3DX texture!", hr );
|
||||
|
||||
m_uTextureWidth = ddsd.Width;
|
||||
m_uTextureHeight = ddsd.Height;
|
||||
m_TextureFormat = ddsd.Format;
|
||||
// if (m_TextureFormat != D3DFMT_A8R8G8B8 &&
|
||||
// m_TextureFormat != D3DFMT_A1R5G5B5) {
|
||||
// DXTRACE_ERR(TEXT("Texture is format we can't handle! Format = 0x%x"), m_TextureFormat);
|
||||
// return E_FAIL;
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: RageBitmapTexture.h
|
||||
//
|
||||
// Desc:
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
class RageBitmapTexture;
|
||||
typedef RageBitmapTexture* LPRageBitmapTexture;
|
||||
|
||||
|
||||
|
||||
|
||||
#ifndef _RageBitmapTexture_H_
|
||||
#define _RageBitmapTexture_H_
|
||||
|
||||
|
||||
#include "RageScreen.h"
|
||||
#include <d3dx8.h>
|
||||
#include <assert.h>
|
||||
//#include <d3d8types.h>
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// RageBitmapTexture Class Declarations
|
||||
//-----------------------------------------------------------------------------
|
||||
class RageBitmapTexture : public RageTexture
|
||||
{
|
||||
public:
|
||||
RageBitmapTexture( LPRageScreen pScreen, CString sFilePath );
|
||||
~RageBitmapTexture();
|
||||
|
||||
virtual LPDIRECT3DTEXTURE8 GetD3DTexture();
|
||||
|
||||
protected:
|
||||
virtual VOID Create();
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,647 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: RageInput.cpp
|
||||
//
|
||||
// Desc: DirectInput wrapper class
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// In-line Links
|
||||
//-----------------------------------------------------------------------------
|
||||
#pragma comment(lib, "dinput8.lib")
|
||||
#pragma comment(lib, "dxguid.lib")
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Includes
|
||||
//-----------------------------------------------------------------------------
|
||||
#include <windows.h>
|
||||
#include <dinput.h>
|
||||
#include "RageInput.h"
|
||||
#include "RageUtil.h"
|
||||
|
||||
|
||||
LPRageInput INPUT = NULL;
|
||||
|
||||
|
||||
BOOL RageRawInput::LookupChar( TCHAR &char_out ) const
|
||||
{
|
||||
switch( button )
|
||||
{
|
||||
case DIK_1: char_out = '1'; break;
|
||||
case DIK_2: char_out = '2'; break;
|
||||
case DIK_3: char_out = '3'; break;
|
||||
case DIK_4: char_out = '4'; break;
|
||||
case DIK_5: char_out = '5'; break;
|
||||
case DIK_6: char_out = '6'; break;
|
||||
case DIK_7: char_out = '7'; break;
|
||||
case DIK_8: char_out = '8'; break;
|
||||
case DIK_9: char_out = '9'; break;
|
||||
case DIK_0: char_out = '0'; break;
|
||||
case DIK_MINUS: char_out = '-'; break;
|
||||
case DIK_EQUALS: char_out = '='; break;
|
||||
case DIK_Q: char_out = 'Q'; break;
|
||||
case DIK_W: char_out = 'W'; break;
|
||||
case DIK_E: char_out = 'E'; break;
|
||||
case DIK_R: char_out = 'R'; break;
|
||||
case DIK_T: char_out = 'T'; break;
|
||||
case DIK_Y: char_out = 'Y'; break;
|
||||
case DIK_U: char_out = 'U'; break;
|
||||
case DIK_I: char_out = 'I'; break;
|
||||
case DIK_O: char_out = 'O'; break;
|
||||
case DIK_P: char_out = 'P'; break;
|
||||
case DIK_LBRACKET: char_out = '['; break;
|
||||
case DIK_RBRACKET: char_out = ']'; break;
|
||||
case DIK_A: char_out = 'A'; break;
|
||||
case DIK_S: char_out = 'S'; break;
|
||||
case DIK_D: char_out = 'D'; break;
|
||||
case DIK_F: char_out = 'F'; break;
|
||||
case DIK_G: char_out = 'G'; break;
|
||||
case DIK_H: char_out = 'H'; break;
|
||||
case DIK_J: char_out = 'J'; break;
|
||||
case DIK_K: char_out = 'K'; break;
|
||||
case DIK_L: char_out = 'L'; break;
|
||||
case DIK_SEMICOLON: char_out = ';'; break;
|
||||
case DIK_APOSTROPHE:char_out = '\'';break;
|
||||
case DIK_GRAVE: char_out = '`'; break;
|
||||
case DIK_BACKSLASH: char_out = '\\';break;
|
||||
case DIK_Z: char_out = 'Z'; break;
|
||||
case DIK_X: char_out = 'X'; break;
|
||||
case DIK_C: char_out = 'C'; break;
|
||||
case DIK_V: char_out = 'V'; break;
|
||||
case DIK_B: char_out = 'B'; break;
|
||||
case DIK_N: char_out = 'N'; break;
|
||||
case DIK_M: char_out = 'M'; break;
|
||||
case DIK_COMMA: char_out = ','; break;
|
||||
case DIK_PERIOD: char_out = '.'; break;
|
||||
case DIK_SLASH: char_out = '/'; break;
|
||||
case DIK_MULTIPLY: char_out = '*'; break;
|
||||
case DIK_SPACE: char_out = ' '; break;
|
||||
case DIK_NUMPAD7: char_out = '7'; break;
|
||||
case DIK_NUMPAD8: char_out = '8'; break;
|
||||
case DIK_NUMPAD9: char_out = '9'; break;
|
||||
case DIK_SUBTRACT: char_out = '-'; break;
|
||||
case DIK_NUMPAD4: char_out = '4'; break;
|
||||
case DIK_NUMPAD5: char_out = '5'; break;
|
||||
case DIK_NUMPAD6: char_out = '6'; break;
|
||||
case DIK_ADD: char_out = '+'; break;
|
||||
case DIK_NUMPAD1: char_out = '1'; break;
|
||||
case DIK_NUMPAD2: char_out = '2'; break;
|
||||
case DIK_NUMPAD3: char_out = '3'; break;
|
||||
case DIK_NUMPAD0: char_out = '0'; break;
|
||||
case DIK_DECIMAL: char_out = '.'; break;
|
||||
|
||||
default: return FALSE; // This key doesn't correspond to a character.
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
CString RageRawInput::GetDescription() const
|
||||
{
|
||||
CString sReturn;
|
||||
|
||||
switch( device )
|
||||
{
|
||||
case DEVICE_NONE:
|
||||
sReturn = "None";
|
||||
break;
|
||||
case DEVICE_JOYSTICK: // joystick
|
||||
sReturn.Format( "Joystick%d ", device_no );
|
||||
switch( button )
|
||||
{
|
||||
case JOY_LEFT: sReturn += "Left"; break;
|
||||
case JOY_RIGHT: sReturn += "Right"; break;
|
||||
case JOY_UP: sReturn += "Up"; break;
|
||||
case JOY_DOWN: sReturn += "Down"; break;
|
||||
default:
|
||||
{
|
||||
CString sButtonString;
|
||||
sButtonString.Format( "Button %d", button );
|
||||
sReturn += sButtonString;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case DEVICE_KEYBOARD:
|
||||
sReturn = "Keyboard ";
|
||||
|
||||
switch( button )
|
||||
{
|
||||
case DIK_ESCAPE: sReturn += "Escape"; break;
|
||||
case DIK_1: sReturn += "1"; break;
|
||||
case DIK_2: sReturn += "2"; break;
|
||||
case DIK_3: sReturn += "3"; break;
|
||||
case DIK_4: sReturn += "4"; break;
|
||||
case DIK_5: sReturn += "5"; break;
|
||||
case DIK_6: sReturn += "6"; break;
|
||||
case DIK_7: sReturn += "7"; break;
|
||||
case DIK_8: sReturn += "8"; break;
|
||||
case DIK_9: sReturn += "9"; break;
|
||||
case DIK_0: sReturn += "0"; break;
|
||||
case DIK_MINUS: sReturn += "Minus"; break;
|
||||
case DIK_EQUALS: sReturn += "Equals"; break;
|
||||
case DIK_BACK: sReturn += "Backspace"; break;
|
||||
case DIK_TAB: sReturn += "Tab"; break;
|
||||
// why? case DIK_BACK: sReturn += "Backspace"; break;
|
||||
case DIK_Q: sReturn += "Q"; break;
|
||||
case DIK_W: sReturn += "W"; break;
|
||||
case DIK_E: sReturn += "E"; break;
|
||||
case DIK_R: sReturn += "R"; break;
|
||||
case DIK_T: sReturn += "T"; break;
|
||||
case DIK_Y: sReturn += "Y"; break;
|
||||
case DIK_U: sReturn += "U"; break;
|
||||
case DIK_I: sReturn += "I"; break;
|
||||
case DIK_O: sReturn += "O"; break;
|
||||
case DIK_P: sReturn += "P"; break;
|
||||
case DIK_LBRACKET: sReturn += "LBracket"; break;
|
||||
case DIK_RBRACKET: sReturn += "RBracket"; break;
|
||||
case DIK_RETURN: sReturn += "Return"; break;
|
||||
case DIK_LCONTROL: sReturn += "LControl"; break;
|
||||
case DIK_A: sReturn += "A"; break;
|
||||
case DIK_S: sReturn += "S"; break;
|
||||
case DIK_D: sReturn += "D"; break;
|
||||
case DIK_F: sReturn += "F"; break;
|
||||
case DIK_G: sReturn += "G"; break;
|
||||
case DIK_H: sReturn += "H"; break;
|
||||
case DIK_J: sReturn += "J"; break;
|
||||
case DIK_K: sReturn += "K"; break;
|
||||
case DIK_L: sReturn += "L"; break;
|
||||
case DIK_SEMICOLON: sReturn += "Semicolon"; break;
|
||||
case DIK_APOSTROPHE:sReturn += "Apostroph"; break;
|
||||
case DIK_GRAVE: sReturn += "Grave"; break;
|
||||
case DIK_LSHIFT: sReturn += "LShift"; break;
|
||||
case DIK_BACKSLASH: sReturn += "Backslash"; break;
|
||||
case DIK_Z: sReturn += "Z"; break;
|
||||
case DIK_X: sReturn += "X"; break;
|
||||
case DIK_C: sReturn += "C"; break;
|
||||
case DIK_V: sReturn += "V"; break;
|
||||
case DIK_B: sReturn += "B"; break;
|
||||
case DIK_N: sReturn += "N"; break;
|
||||
case DIK_M: sReturn += "M"; break;
|
||||
case DIK_COMMA: sReturn += "Comma"; break;
|
||||
case DIK_PERIOD: sReturn += "Period"; break;
|
||||
case DIK_SLASH: sReturn += "Slash"; break;
|
||||
case DIK_RSHIFT: sReturn += "R Shift"; break;
|
||||
case DIK_MULTIPLY: sReturn += "Multiply"; break;
|
||||
case DIK_LMENU: sReturn += "Left Menu"; break;
|
||||
case DIK_SPACE: sReturn += "Space"; break;
|
||||
case DIK_CAPITAL: sReturn += "Caps Lock"; break;
|
||||
case DIK_F1: sReturn += "F1"; break;
|
||||
case DIK_F2: sReturn += "F2"; break;
|
||||
case DIK_F3: sReturn += "F3"; break;
|
||||
case DIK_F4: sReturn += "F4"; break;
|
||||
case DIK_F5: sReturn += "F5"; break;
|
||||
case DIK_F6: sReturn += "F6"; break;
|
||||
case DIK_F7: sReturn += "F7"; break;
|
||||
case DIK_F8: sReturn += "F8"; break;
|
||||
case DIK_F9: sReturn += "F9"; break;
|
||||
case DIK_F10: sReturn += "F10"; break;
|
||||
case DIK_NUMLOCK: sReturn += "Numlock"; break;
|
||||
case DIK_SCROLL: sReturn += "Scroll"; break;
|
||||
case DIK_NUMPAD7: sReturn += "NumPad7"; break;
|
||||
case DIK_NUMPAD8: sReturn += "NumPad8"; break;
|
||||
case DIK_NUMPAD9: sReturn += "NumPad9"; break;
|
||||
case DIK_SUBTRACT: sReturn += "Subtract"; break;
|
||||
case DIK_NUMPAD4: sReturn += "NumPad4"; break;
|
||||
case DIK_NUMPAD5: sReturn += "NumPad5"; break;
|
||||
case DIK_NUMPAD6: sReturn += "NumPad6"; break;
|
||||
case DIK_ADD: sReturn += "Add"; break;
|
||||
case DIK_NUMPAD1: sReturn += "NumPad1"; break;
|
||||
case DIK_NUMPAD2: sReturn += "NumPad2"; break;
|
||||
case DIK_NUMPAD3: sReturn += "NumPad3"; break;
|
||||
case DIK_NUMPAD0: sReturn += "NumPad0"; break;
|
||||
case DIK_DECIMAL: sReturn += "Decimal"; break;
|
||||
case DIK_RMENU: sReturn += "Right Alt"; break;
|
||||
case DIK_PAUSE: sReturn += "Pause"; break;
|
||||
case DIK_HOME: sReturn += "Home"; break;
|
||||
case DIK_UP: sReturn += "Up"; break;
|
||||
case DIK_PRIOR: sReturn += "Page Up"; break;
|
||||
case DIK_LEFT: sReturn += "Left"; break;
|
||||
case DIK_RIGHT: sReturn += "Right"; break;
|
||||
case DIK_END: sReturn += "End"; break;
|
||||
case DIK_DOWN: sReturn += "Down"; break;
|
||||
case DIK_NEXT: sReturn += "Page Down"; break;
|
||||
case DIK_INSERT: sReturn += "Insert"; break;
|
||||
case DIK_DELETE: sReturn += "Delete"; break;
|
||||
case DIK_LWIN: sReturn += "Left Win"; break;
|
||||
case DIK_RWIN: sReturn += "Right Win"; break;
|
||||
case DIK_APPS: sReturn += "App Menu"; break;
|
||||
|
||||
default: sReturn += "Unknown Key"; break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
sReturn = "Invalid Device";
|
||||
break;
|
||||
}
|
||||
|
||||
return sReturn;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: EnumJoysticksCallback()
|
||||
// Desc: Called once for each enumerated joystick. If we find one, create a
|
||||
// device interface on it so we can play with it.
|
||||
//-----------------------------------------------------------------------------
|
||||
BOOL CALLBACK EnumJoysticksCallback( const DIDEVICEINSTANCE* pdidInstance,
|
||||
VOID* pContext )
|
||||
{
|
||||
LPRageInput pInput = (LPRageInput)pContext;
|
||||
LPDIRECTINPUT8 pDI = pInput->GetDirectInput();
|
||||
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
// Obtain an interface to the enumerated joystick.
|
||||
for( int i=0; i<NUM_JOYSTICKS; i++ )
|
||||
{
|
||||
hr = pDI->CreateDevice( pdidInstance->guidInstance,
|
||||
&pInput->m_pJoystick[i],
|
||||
NULL );
|
||||
// This will only fail if the user unplugs while we were in the middle of enumerating.
|
||||
|
||||
return DIENUM_CONTINUE;
|
||||
}
|
||||
|
||||
return DIENUM_STOP; // already enumerated NUm_pJoystick times
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: EnumAxesCallback()
|
||||
// Desc: Callback function for enumerating the axes on a joystick
|
||||
//-----------------------------------------------------------------------------
|
||||
BOOL CALLBACK EnumAxesCallback( const DIDEVICEOBJECTINSTANCE* pdidoi,
|
||||
VOID* pContext )
|
||||
{
|
||||
LPDIRECTINPUTDEVICE8 pJoystick = (LPDIRECTINPUTDEVICE8)pContext;
|
||||
|
||||
DIPROPRANGE diprg;
|
||||
diprg.diph.dwSize = sizeof(DIPROPRANGE);
|
||||
diprg.diph.dwHeaderSize = sizeof(DIPROPHEADER);
|
||||
diprg.diph.dwHow = DIPH_BYID;
|
||||
diprg.diph.dwObj = pdidoi->dwType; // Specify the enumerated axis
|
||||
diprg.lMin = -1000;
|
||||
diprg.lMax = +1000;
|
||||
|
||||
// Set the range for the axis
|
||||
if( FAILED( pJoystick->SetProperty( DIPROP_RANGE, &diprg.diph ) ) )
|
||||
return DIENUM_STOP;
|
||||
|
||||
|
||||
return DIENUM_CONTINUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
RageInput::RageInput( HWND hWnd )
|
||||
{
|
||||
m_hWnd = hWnd;
|
||||
|
||||
|
||||
m_pDI = NULL;
|
||||
m_pKeyboard = NULL;
|
||||
m_pMouse = NULL;
|
||||
for( int i=0; i<NUM_JOYSTICKS; i++ )
|
||||
m_pJoystick[i]=NULL;
|
||||
|
||||
|
||||
ZeroMemory( &m_keys, sizeof(m_keys) );
|
||||
ZeroMemory( &m_oldKeys, sizeof(m_oldKeys) );
|
||||
for( int j=0; j<NUM_JOYSTICKS; j++ )
|
||||
{
|
||||
ZeroMemory( &m_joyState[j], sizeof(m_joyState[j]) );
|
||||
ZeroMemory( &m_oldKeys[j], sizeof(m_joyState[j]) );
|
||||
}
|
||||
|
||||
|
||||
Initialize();
|
||||
}
|
||||
|
||||
RageInput::~RageInput()
|
||||
{
|
||||
Release();
|
||||
}
|
||||
|
||||
HRESULT RageInput::Initialize()
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
////////////////////////////////
|
||||
// Create the DirectInput object
|
||||
////////////////////////////////
|
||||
if( FAILED(hr = DirectInput8Create( GetModuleHandle(NULL), DIRECTINPUT_VERSION,
|
||||
IID_IDirectInput8, (VOID**)&m_pDI, NULL ) ) )
|
||||
RageErrorHr( "DirectInput8Create failed.", hr );
|
||||
|
||||
/////////////////////////////
|
||||
// Create the keyboard device
|
||||
/////////////////////////////
|
||||
|
||||
// Create our DirectInput Object for the Keyboard
|
||||
if( FAILED( hr = m_pDI->CreateDevice( GUID_SysKeyboard, &m_pKeyboard, NULL ) ) )
|
||||
RageErrorHr( "CreateDevice keyboard failed.", hr );
|
||||
|
||||
// Set our Cooperation Level with each Device
|
||||
if( FAILED( hr = m_pKeyboard->SetCooperativeLevel(m_hWnd, DISCL_FOREGROUND |
|
||||
DISCL_NOWINKEY |
|
||||
DISCL_NONEXCLUSIVE) ) )
|
||||
RageErrorHr( "m_pKeyboard->SetCooperativeLevel failed.", hr );
|
||||
|
||||
// Set the Data Format of each device
|
||||
if( FAILED( hr = m_pKeyboard->SetDataFormat(&c_dfDIKeyboard) ) )
|
||||
RageErrorHr( "m_pKeyboard->SetDataFormat failed.", hr );
|
||||
|
||||
// Acquire the Keyboard Device
|
||||
//if( FAILED( hr = m_pKeyboard->Acquire() ) )
|
||||
// RageErrorHr( "m_pKeyboard->Acquire failed.", hr );
|
||||
|
||||
|
||||
|
||||
//////////////////////////
|
||||
// Create the mouse device
|
||||
//////////////////////////
|
||||
|
||||
// Obtain an interface to the system mouse device.
|
||||
if( FAILED( hr = m_pDI->CreateDevice( GUID_SysMouse, &m_pMouse, NULL ) ) )
|
||||
RageErrorHr( "CreateDevice mouse failed.", hr );
|
||||
|
||||
if( FAILED( hr = m_pMouse->SetCooperativeLevel( m_hWnd, DISCL_NONEXCLUSIVE|DISCL_FOREGROUND ) ) )
|
||||
RageErrorHr( "m_pMouse->SetCooperativeLevel failed.", hr );
|
||||
|
||||
if( FAILED( hr = m_pMouse->SetDataFormat( &c_dfDIMouse2 ) ) )
|
||||
RageErrorHr( "m_pMouse->SetDataFormat failed.", hr );
|
||||
|
||||
/*
|
||||
DIPROPDWORD dipdw;
|
||||
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
|
||||
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
|
||||
dipdw.diph.dwObj = 0;
|
||||
dipdw.diph.dwHow = DIPH_DEVICE;
|
||||
dipdw.dwData = DIPROPAXISMODE_ABS;
|
||||
|
||||
if( FAILED( m_pMouse->SetProperty( DIPROP_AXISMODE, &dipdw.diph ) ) )
|
||||
return E_FAIL;*/
|
||||
//if( FAILED( hr = m_pMouse->Acquire()))
|
||||
// RageErrorHr( "m_pMouse->Acquire failed.", hr );
|
||||
|
||||
m_RelPosition_x = 0;
|
||||
m_RelPosition_y = 0;
|
||||
|
||||
m_AbsPosition_x = 640/2;
|
||||
m_AbsPosition_y = 480/2;
|
||||
|
||||
//////////////////////////////
|
||||
// Create the joystick devices
|
||||
//////////////////////////////
|
||||
// Look for joysticks
|
||||
// TODO: Why is this function so slow to return? Is it just my machine?
|
||||
if( FAILED( hr = m_pDI->EnumDevices( DI8DEVCLASS_GAMECTRL,
|
||||
EnumJoysticksCallback,
|
||||
(VOID*)this,
|
||||
DIEDFL_ATTACHEDONLY ) ) )
|
||||
RageErrorHr( "m_pDI->EnumDevices failed.", hr );
|
||||
|
||||
for( int i=0; i<NUM_JOYSTICKS; i++ )
|
||||
{
|
||||
// Set the data format to "simple joystick" - a predefined data format
|
||||
//
|
||||
// A data format specifies which controls on a device we are interested in,
|
||||
// and how they should be reported. This tells DInput that we will be
|
||||
// passing a DIJOYSTATE2 structure to IDirectInputDevice::GetDeviceState().
|
||||
if( m_pJoystick[i] )
|
||||
if( FAILED( hr = m_pJoystick[i]->SetDataFormat( &c_dfDIJoystick2 ) ) )
|
||||
RageErrorHr( "m_pJoystick[i]->SetDataFormat failed.", hr );
|
||||
|
||||
|
||||
// Set the cooperative level to let DInput know how this device should
|
||||
// interact with the system and with other DInput applications.
|
||||
if( m_pJoystick[i] )
|
||||
if( FAILED( hr = m_pJoystick[i]->SetCooperativeLevel( m_hWnd, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND ) ) )
|
||||
RageErrorHr( "m_pJoystick[i]->SetCooperativeLevel failed.", hr );
|
||||
|
||||
|
||||
/*
|
||||
// Determine how many axis the joystick has (so we don't error out setting
|
||||
// properties for unavailable axis)
|
||||
if ( m_pJoystick[i] ) {
|
||||
g_diDevCaps.dwSize = sizeof(DIDEVCAPS);
|
||||
if ( FAILED( hr = m_pJoystick[i]->GetCapabilities(&g_diDevCaps) ) )
|
||||
return hr;
|
||||
}
|
||||
*/
|
||||
|
||||
// Enumerate the axes of the joyctick and set the range of each axis. Note:
|
||||
// we could just use the defaults, but we're just trying to show an example
|
||||
// of enumerating device objects (axes, buttons, etc.).
|
||||
if( m_pJoystick[i] )
|
||||
if ( FAILED( hr = m_pJoystick[i]->EnumObjects( EnumAxesCallback, (VOID*)m_pJoystick[i], DIDFT_AXIS ) ) )
|
||||
RageErrorHr( "m_pJoystick[i]->EnumObjects failed.", hr );
|
||||
|
||||
// Acquire the newly created devices
|
||||
if( m_pJoystick[i] )
|
||||
if( FAILED( hr = m_pJoystick[i]->Acquire() ) )
|
||||
RageErrorHr( "m_pJoystick[i]->Acquire failed.", hr );
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
VOID RageInput::Release()
|
||||
{
|
||||
// Unacquire the keyboard device
|
||||
if (m_pKeyboard)
|
||||
m_pKeyboard->Unacquire();
|
||||
// Release the keyboard device
|
||||
SAFE_RELEASE(m_pKeyboard);
|
||||
// Unacquire the Mouse device
|
||||
if (m_pMouse)
|
||||
m_pMouse->Unacquire();
|
||||
// Release the Mouse device
|
||||
SAFE_RELEASE(m_pMouse);
|
||||
|
||||
for( int i=0; i<NUM_JOYSTICKS; i++ )
|
||||
{
|
||||
if (m_pJoystick[i])
|
||||
m_pJoystick[i]->Unacquire();
|
||||
// Release the Mouse device
|
||||
SAFE_RELEASE(m_pJoystick[i]);
|
||||
}
|
||||
|
||||
// Release the DirectInput object
|
||||
SAFE_RELEASE(m_pDI);
|
||||
}
|
||||
|
||||
|
||||
HRESULT RageInput::GetRawInput( RageRawInputList &listRawInput )
|
||||
{
|
||||
// macros for reading DI state structures
|
||||
#define IS_PRESSED(b) (b & 0x80)
|
||||
#define AXIS_THRESHOLD 50 // joystick axis threshold
|
||||
#define IS_LEFT(a) (a <= -AXIS_THRESHOLD)
|
||||
#define IS_RIGHT(a) (a >= AXIS_THRESHOLD)
|
||||
#define IS_UP(a) IS_LEFT(a)
|
||||
#define IS_DOWN(a) IS_RIGHT(a)
|
||||
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// the current state last update becomes the old state this update
|
||||
//////////////////////////////////////////////////////////////////
|
||||
|
||||
CopyMemory( &m_oldKeys, &m_keys, sizeof(m_keys) );
|
||||
CopyMemory( &m_oldJoyState, &m_joyState, sizeof(m_joyState) );
|
||||
|
||||
ZeroMemory( &m_keys, sizeof(m_keys) );
|
||||
ZeroMemory( &m_joyState, sizeof(m_joyState) );
|
||||
|
||||
|
||||
////////////////////
|
||||
// Read the keyboard
|
||||
////////////////////
|
||||
if( NULL == m_pKeyboard )
|
||||
return E_FAIL;
|
||||
|
||||
if FAILED(m_pKeyboard->GetDeviceState( sizeof(m_keys),(LPVOID)&m_keys ))
|
||||
{
|
||||
// DirectInput may be telling us that the input stream has been
|
||||
// interrupted. We aren't tracking any state between polls, so
|
||||
// we don't have any special reset that needs to be done.
|
||||
// We just re-acquire and try again.
|
||||
|
||||
// If input is lost then acquire and keep trying
|
||||
hr = m_pKeyboard->Acquire();
|
||||
while( hr == DIERR_INPUTLOST )
|
||||
hr = m_pKeyboard->Acquire();
|
||||
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
// get keyboard state was successful. Compare this state to the last state
|
||||
for( int k = 0; k < 256; k++ ) // foreach key
|
||||
{
|
||||
// check if key is depressed this update and was not depressed last update
|
||||
if( IS_PRESSED( m_keys[k] ) && !IS_PRESSED( m_oldKeys[k] ) )
|
||||
listRawInput.AddTail( RageRawInput( DEVICE_KEYBOARD, 1, k, FALSE ) );
|
||||
}
|
||||
|
||||
|
||||
////////////////////
|
||||
// Read the mouse
|
||||
////////////////////
|
||||
if( NULL == m_pMouse )
|
||||
return E_FAIL;
|
||||
|
||||
ZeroMemory( &m_mouseState, sizeof(m_mouseState) );
|
||||
|
||||
// Get the input's device state, and put the state in DIMOUSESTATE2
|
||||
if (FAILED(m_pMouse->GetDeviceState( sizeof(DIMOUSESTATE2), &m_mouseState )))
|
||||
{
|
||||
// If input is lost then acquire and keep trying
|
||||
hr = m_pMouse->Acquire();
|
||||
while( hr == DIERR_INPUTLOST )
|
||||
hr = m_pMouse->Acquire();
|
||||
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
|
||||
m_RelPosition_x = m_mouseState.lX;
|
||||
m_RelPosition_y = m_mouseState.lY;
|
||||
|
||||
|
||||
m_AbsPosition_x += m_mouseState.lX;
|
||||
m_AbsPosition_y += m_mouseState.lY;
|
||||
|
||||
if (m_AbsPosition_x >= 640)
|
||||
m_AbsPosition_x = 640-1;
|
||||
else
|
||||
if (m_AbsPosition_x < 0)
|
||||
m_AbsPosition_x = 0;
|
||||
|
||||
// now the y boundaries
|
||||
if (m_AbsPosition_y >= 480)
|
||||
m_AbsPosition_y= 480-1;
|
||||
else
|
||||
if (m_AbsPosition_y < 0)
|
||||
m_AbsPosition_y = 0;
|
||||
|
||||
|
||||
/////////////////////
|
||||
// Read the joysticks
|
||||
/////////////////////
|
||||
|
||||
// read joystick state
|
||||
for( BYTE i=0; i<4; i++ ) // foreach joystick
|
||||
{
|
||||
// read joystick states
|
||||
if ( m_pJoystick[i] )
|
||||
{
|
||||
// Poll the device to read the current state
|
||||
hr = m_pJoystick[i]->Poll();
|
||||
if( FAILED(hr) )
|
||||
{
|
||||
// DInput is telling us that the input stream has been
|
||||
// interrupted. We aren't tracking any state between polls, so
|
||||
// we don't have any special reset that needs to be done. We
|
||||
// just re-acquire and try again.
|
||||
hr = m_pJoystick[i]->Acquire();
|
||||
while( hr == DIERR_INPUTLOST )
|
||||
hr = m_pJoystick[i]->Acquire();
|
||||
|
||||
// hr may be DIERR_OTHERAPPHASPRIO or other errors. This
|
||||
// may occur when the app is minimized or in the process of
|
||||
// switching, so just try again later
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
// Get the input's device state
|
||||
if( FAILED( hr = m_pJoystick[i]->GetDeviceState( sizeof(DIJOYSTATE2), &m_joyState[i] ) ) )
|
||||
return hr; // The device should have been acquired during the Poll()
|
||||
else
|
||||
{
|
||||
|
||||
// check if key is depressed this update and was not depressed last update
|
||||
if( IS_LEFT( m_joyState[i].lX ) &&
|
||||
!IS_LEFT( m_oldJoyState[i].lX ) )
|
||||
listRawInput.AddTail( RageRawInput( DEVICE_JOYSTICK, i+1, JOY_LEFT, FALSE ) );
|
||||
|
||||
if( IS_RIGHT( m_joyState[i].lX ) &&
|
||||
!IS_RIGHT( m_oldJoyState[i].lX ) )
|
||||
listRawInput.AddTail( RageRawInput( DEVICE_JOYSTICK, i+1, JOY_RIGHT, FALSE ) );
|
||||
|
||||
if( IS_UP( m_joyState[i].lY ) &&
|
||||
!IS_UP( m_oldJoyState[i].lY ) )
|
||||
listRawInput.AddTail( RageRawInput( DEVICE_JOYSTICK, i+1, JOY_UP, FALSE ) );
|
||||
|
||||
if( IS_DOWN( m_joyState[i].lY ) &&
|
||||
!IS_DOWN( m_oldJoyState[i].lY ) )
|
||||
listRawInput.AddTail( RageRawInput( DEVICE_JOYSTICK, i+1, JOY_DOWN, FALSE ) );
|
||||
|
||||
|
||||
for( BYTE b=0; b<10; b++ )
|
||||
{
|
||||
if( IS_PRESSED(m_joyState[i].rgbButtons[b]) && !IS_PRESSED(m_oldJoyState[i].rgbButtons[b]) )
|
||||
listRawInput.AddTail( RageRawInput( DEVICE_JOYSTICK, i+1, b+1, FALSE ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,133 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: RageInput.h
|
||||
//
|
||||
// Desc: DirectInput wrapper class
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _RAGEINPUT_H_
|
||||
#define _RAGEINPUT_H_
|
||||
|
||||
|
||||
#include <dinput.h>
|
||||
#include "RageUtil.h"
|
||||
|
||||
|
||||
#define NUM_JOYSTICKS 4
|
||||
|
||||
// button byte codes for directional pad
|
||||
#define JOY_LEFT 101
|
||||
#define JOY_RIGHT 102
|
||||
#define JOY_UP 103
|
||||
#define JOY_DOWN 104
|
||||
|
||||
|
||||
|
||||
#define DEVICE_NONE 0
|
||||
#define DEVICE_KEYBOARD 1
|
||||
#define DEVICE_JOYSTICK 2
|
||||
|
||||
|
||||
class RageRawInput
|
||||
{
|
||||
public:
|
||||
RageRawInput() { device = device_no = button = just_pressed = 0; };
|
||||
RageRawInput( BYTE device,
|
||||
BYTE device_no,
|
||||
BYTE button,
|
||||
BYTE just_pressed )
|
||||
{
|
||||
this->device = device;
|
||||
this->device_no = device_no;
|
||||
this->button = button;
|
||||
this->just_pressed = just_pressed;
|
||||
};
|
||||
RageRawInput( CString sEncoding )
|
||||
{
|
||||
CStringArray a;
|
||||
split( sEncoding, "-", a);
|
||||
this->device = atoi( a[0] );
|
||||
this->device_no = atoi( a[1] );
|
||||
this->button = atoi( a[2] );
|
||||
};
|
||||
CString Encode() { return ssprintf("%u-%u-%u", device, device_no, button); };
|
||||
|
||||
BOOL LookupChar( TCHAR &char_out ) const;
|
||||
CString GetDescription() const;
|
||||
|
||||
BOOL IsBlank() { return device == DEVICE_NONE; };
|
||||
|
||||
BYTE device;
|
||||
BYTE device_no;
|
||||
BYTE button;
|
||||
BYTE just_pressed;
|
||||
};
|
||||
|
||||
|
||||
|
||||
typedef CList<RageRawInput, RageRawInput&> RageRawInputList;
|
||||
|
||||
|
||||
class RageInput
|
||||
{
|
||||
// Our Windows Handle
|
||||
HWND m_hWnd;
|
||||
|
||||
// Main DirectInput Object
|
||||
LPDIRECTINPUT8 m_pDI;
|
||||
// Keyboard Device
|
||||
LPDIRECTINPUTDEVICE8 m_pKeyboard;
|
||||
// Mouse Device
|
||||
LPDIRECTINPUTDEVICE8 m_pMouse;
|
||||
public:
|
||||
// hack: make them public to allow the callbacks access to the pointers
|
||||
// Joystick Devices
|
||||
LPDIRECTINPUTDEVICE8 m_pJoystick[NUM_JOYSTICKS];
|
||||
|
||||
private:
|
||||
// Arrays for Keyboard Data
|
||||
byte m_keys[256];
|
||||
byte m_oldKeys[256];
|
||||
|
||||
// DirectInput mouse state structure
|
||||
DIMOUSESTATE2 m_mouseState;
|
||||
|
||||
// Joystick data for 4 controllers
|
||||
DIJOYSTATE2 m_joyState[4];
|
||||
DIJOYSTATE2 m_oldJoyState[4];
|
||||
|
||||
INT m_AbsPosition_x;
|
||||
INT m_AbsPosition_y;
|
||||
|
||||
INT m_RelPosition_x;
|
||||
INT m_RelPosition_y;
|
||||
|
||||
public:
|
||||
RageInput(HWND hWnd);
|
||||
~RageInput();
|
||||
|
||||
// Initialize DirectInput Resources
|
||||
HRESULT Initialize();
|
||||
// Release all DirectInput Resources
|
||||
VOID Release();
|
||||
// Get our Devices State
|
||||
HRESULT GetRawInput( RageRawInputList &listRawInput );
|
||||
|
||||
LPDIRECTINPUT8 GetDirectInput() { return m_pDI; }
|
||||
LPDIRECTINPUTDEVICE8 GetMouseDevice() { return m_pMouse; }
|
||||
LPDIRECTINPUTDEVICE8 GetKeyboardDevice() { return m_pKeyboard; }
|
||||
LPDIRECTINPUTDEVICE8 GetJoystickDevice( int i ) { return m_pJoystick[i]; }
|
||||
|
||||
// DIMOUSESTATE2 GetMouseState() { return dimMouseState; }
|
||||
VOID GetAbsPosition( DWORD &x, DWORD &y ) { x = m_AbsPosition_x; y = m_AbsPosition_y; }
|
||||
|
||||
};
|
||||
|
||||
|
||||
typedef RageInput* LPRageInput;
|
||||
|
||||
extern LPRageInput INPUT; // global and accessable from anywhere in our program
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,417 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: RageMovieTexture.cpp
|
||||
//
|
||||
// Desc: Based on the DShowTextures example in the DX8 SDK.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// In-line Links
|
||||
//-----------------------------------------------------------------------------
|
||||
#pragma comment(lib, "winmm.lib")
|
||||
#pragma comment(lib, "dxerr8.lib")
|
||||
|
||||
// Link with the DirectShow base class libraries
|
||||
#if defined(DEBUG) | defined(_DEBUG)
|
||||
#pragma comment(lib, "C:\\Program Files\\DX8aSDK\\samples\\Multimedia\\DirectShow\\BaseClasses\\Debug\\strmbasd.lib")
|
||||
#else
|
||||
#pragma comment(lib, "C:\\Program Files\\DX8aSDK\\samples\\Multimedia\\DirectShow\\BaseClasses\\Release\\strmbase.lib")
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Includes
|
||||
//-----------------------------------------------------------------------------
|
||||
#include "RageMovieTexture.h"
|
||||
#include "dxerr8.h"
|
||||
#include "DXUtil.h"
|
||||
#include "RageUtil.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Global Constants
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// CTextureRenderer constructor
|
||||
//-----------------------------------------------------------------------------
|
||||
CTextureRenderer::CTextureRenderer( LPUNKNOWN pUnk, HRESULT *phr )
|
||||
: CBaseVideoRenderer(__uuidof(CLSID_TextureRenderer),
|
||||
NAME("Texture Renderer"), pUnk, phr)
|
||||
{
|
||||
// Store and ARageef the texture for our use.
|
||||
m_pTexture = NULL;
|
||||
m_bLocked = FALSE;
|
||||
*phr = S_OK;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// CTextureRenderer destructor
|
||||
//-----------------------------------------------------------------------------
|
||||
CTextureRenderer::~CTextureRenderer()
|
||||
{
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// CheckMediaType: This method forces the graph to give us an R8G8B8 video
|
||||
// type, making our copy to texture memory trivial.
|
||||
//-----------------------------------------------------------------------------
|
||||
HRESULT CTextureRenderer::CheckMediaType(const CMediaType *pmt)
|
||||
{
|
||||
HRESULT hr = E_FAIL;
|
||||
VIDEOINFO *pvi;
|
||||
|
||||
// Reject the connection if this is not a video type
|
||||
if( *pmt->FormatType() != FORMAT_VideoInfo ) {
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
// Only accept RGB24
|
||||
pvi = (VIDEOINFO *)pmt->Format();
|
||||
if(IsEqualGUID( *pmt->Type(), MEDIATYPE_Video) &&
|
||||
IsEqualGUID( *pmt->Subtype(), MEDIASUBTYPE_RGB24))
|
||||
// IsEqualGUID( *pmt->Subtype(), MEDIASUBTYPE_RGB565))
|
||||
{
|
||||
hr = S_OK;
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SetMediaType: Graph connection has been made.
|
||||
//-----------------------------------------------------------------------------
|
||||
HRESULT CTextureRenderer::SetMediaType(const CMediaType *pmt)
|
||||
{
|
||||
// HRESULT hr;
|
||||
|
||||
// Retrive the size of this media type
|
||||
VIDEOINFO *pviBmp; // Bitmap info header
|
||||
pviBmp = (VIDEOINFO *)pmt->Format();
|
||||
m_lVidWidth = pviBmp->bmiHeader.biWidth;
|
||||
m_lVidHeight = abs(pviBmp->bmiHeader.biHeight);
|
||||
m_lVidPitch = (m_lVidWidth * 3 + 3) & ~(3); // We are forcing RGB24
|
||||
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SetRenderTarget: Save all the information we'll need to render to a D3D texture.
|
||||
//-----------------------------------------------------------------------------
|
||||
HRESULT CTextureRenderer::SetRenderTarget(LPDIRECT3DTEXTURE8 pTexture)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
if (pTexture == NULL) {
|
||||
DXTRACE_ERR(TEXT("SetRenderTarget called with a NULL texture!"), 0);
|
||||
return E_FAIL;
|
||||
}
|
||||
m_pTexture = pTexture;
|
||||
|
||||
|
||||
// get the format of the texture
|
||||
D3DSURFACE_DESC ddsd;
|
||||
if ( FAILED( hr = m_pTexture->GetLevelDesc( 0, &ddsd ) ) ) {
|
||||
DXTRACE_ERR(TEXT("Could not get level Description of D3DX texture! hr = 0x%x"), hr);
|
||||
return hr;
|
||||
}
|
||||
|
||||
m_TextureFormat = ddsd.Format;
|
||||
if (m_TextureFormat != D3DFMT_A8R8G8B8 &&
|
||||
m_TextureFormat != D3DFMT_A1R5G5B5) {
|
||||
DXTRACE_ERR(TEXT("Texture is format we can't handle! Format = 0x%x"), m_TextureFormat);
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// DoRenderSample: A sample has been delivered. Copy it to the texture.
|
||||
//-----------------------------------------------------------------------------
|
||||
HRESULT CTextureRenderer::DoRenderSample( IMediaSample * pSample )
|
||||
{
|
||||
BYTE *pBmpBuffer, *pTxtBuffer; // Bitmap buffer, texture buffer
|
||||
LONG lTxtPitch; // Pitch of bitmap, texture
|
||||
|
||||
// Get the video bitmap buffer
|
||||
pSample->GetPointer( &pBmpBuffer );
|
||||
|
||||
// Lock the Texture
|
||||
D3DLOCKED_RECT d3dlr;
|
||||
if (FAILED(m_pTexture->LockRect(0, &d3dlr, 0, 0))) {
|
||||
DXTRACE_ERR_NOMSGBOX(TEXT("Failed to lock the texture!"), E_FAIL);
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
m_bLocked = TRUE;
|
||||
|
||||
// Get the texture buffer & pitch
|
||||
pTxtBuffer = static_cast<byte *>(d3dlr.pBits);
|
||||
lTxtPitch = d3dlr.Pitch;
|
||||
|
||||
|
||||
// Copy the bits
|
||||
// OPTIMIZATION OPPORTUNITY: Use a video and texture
|
||||
// format that allows a simpler copy than this one.
|
||||
if (m_TextureFormat == D3DFMT_A8R8G8B8) {
|
||||
for(int y = 0; y < m_lVidHeight; y++ ) {
|
||||
BYTE *pBmpBufferOld = pBmpBuffer;
|
||||
BYTE *pTxtBufferOld = pTxtBuffer;
|
||||
for (int x = 0; x < m_lVidWidth; x++) {
|
||||
pTxtBuffer[0] = pBmpBuffer[0];
|
||||
pTxtBuffer[1] = pBmpBuffer[1];
|
||||
pTxtBuffer[2] = pBmpBuffer[2];
|
||||
pTxtBuffer[3] = 0xff;
|
||||
pTxtBuffer += 4;
|
||||
pBmpBuffer += 3;
|
||||
}
|
||||
pBmpBuffer = pBmpBufferOld + m_lVidPitch;
|
||||
pTxtBuffer = pTxtBufferOld + lTxtPitch;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_TextureFormat == D3DFMT_A1R5G5B5) {
|
||||
for(int y = 0; y < m_lVidHeight; y++ ) {
|
||||
BYTE *pBmpBufferOld = pBmpBuffer;
|
||||
BYTE *pTxtBufferOld = pTxtBuffer;
|
||||
for (int x = 0; x < m_lVidWidth; x++) {
|
||||
*(WORD *)pTxtBuffer =
|
||||
0x8000 +
|
||||
((pBmpBuffer[2] & 0xF8) << 7) +
|
||||
((pBmpBuffer[1] & 0xF8) << 2) +
|
||||
(pBmpBuffer[0] >> 3);
|
||||
pTxtBuffer += 2;
|
||||
pBmpBuffer += 3;
|
||||
}
|
||||
pBmpBuffer = pBmpBufferOld + m_lVidPitch;
|
||||
pTxtBuffer = pTxtBufferOld + lTxtPitch;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Unlock the Texture
|
||||
if (FAILED(m_pTexture->UnlockRect(0))) {
|
||||
DXTRACE_ERR_NOMSGBOX(TEXT("Failed to unlock the texture!"), E_FAIL);
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
m_bLocked = FALSE;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// RageMovieTexture constructor
|
||||
//-----------------------------------------------------------------------------
|
||||
RageMovieTexture::RageMovieTexture( LPRageScreen pScreen, CString sFilePath ) :
|
||||
RageTexture( pScreen, sFilePath )
|
||||
{
|
||||
RageLog( "RageBitmapTexture::RageBitmapTexture()" );
|
||||
|
||||
Create();
|
||||
|
||||
CreateFrameRects();
|
||||
}
|
||||
|
||||
RageMovieTexture::~RageMovieTexture()
|
||||
{
|
||||
CleanupDShow();
|
||||
|
||||
SAFE_RELEASE(m_pd3dTexture);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// GetTexture
|
||||
//-----------------------------------------------------------------------------
|
||||
LPDIRECT3DTEXTURE8 RageMovieTexture::GetD3DTexture()
|
||||
{
|
||||
// Wait until the TextureRenderer is not copying to our texture.
|
||||
// If we try to draw using the texture while it is locked, the primitive
|
||||
// will appear without a texture.
|
||||
// Most of the time, the TextureRenderer is not busy copying (copying
|
||||
// a frame of video is very quick). If it is busy, it's usually becase
|
||||
// the video fell behind and is trying to copy several frames in a row
|
||||
// to catch up. So, if the TextureRenderer is busy, give it a 1ms slice of
|
||||
// time for it to catch up and copy all the frames it fell behind on.
|
||||
while( m_pCTR->IsLocked() )
|
||||
::Sleep(1);
|
||||
|
||||
// restart the movie if we reach the end
|
||||
CheckMovieStatus();
|
||||
|
||||
return m_pd3dTexture;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// RageMovieTexture::Create()
|
||||
//-----------------------------------------------------------------------------
|
||||
VOID RageMovieTexture::Create()
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
// Initialize the filter graph find and get information about the
|
||||
// video (dimensions, color depth, etc.)
|
||||
if( FAILED( hr = InitDShowTextureRenderer() ) )
|
||||
RageErrorHr( "Could not initialize the DirectShow Texture Renderer!", hr );
|
||||
|
||||
if( FAILED( hr = CreateD3DTexture() ) )
|
||||
RageErrorHr( "Could not create the D3D Texture!", hr );
|
||||
|
||||
// Pass the D3D texture to our TextureRenderer so it knows
|
||||
// where to render new movie frames to.
|
||||
if( FAILED( hr = m_pCTR->SetRenderTarget(GetD3DTexture()) ) )
|
||||
RageErrorHr( "RageMovieTexture: SetRenderTarget failed.", hr );
|
||||
|
||||
// Start the graph running
|
||||
if( FAILED( hr = PlayMovie() ) )
|
||||
RageErrorHr( "Could not run the DirectShow graph.", hr );
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// InitDShowTextureRenderer : Create DirectShow filter graph and run the graph
|
||||
//-----------------------------------------------------------------------------
|
||||
HRESULT RageMovieTexture::InitDShowTextureRenderer()
|
||||
{
|
||||
HRESULT hr = S_OK;
|
||||
CComPtr<IBaseFilter> pFTR; // Texture Renderer Filter
|
||||
CComPtr<IPin> pFTRPinIn; // Texture Renderer Input Pin
|
||||
CComPtr<IBaseFilter> pFSrc; // Source Filter
|
||||
CComPtr<IPin> pFSrcPinOut; // Source Filter Output Pin
|
||||
|
||||
// Create the filter graph
|
||||
if( FAILED( m_pGB.CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC) ) )
|
||||
RageErrorHr( "Could not create CLSID_FilterGraph!", hr );
|
||||
|
||||
// Create the Texture Renderer object
|
||||
m_pCTR = new CTextureRenderer(NULL, &hr);
|
||||
if( FAILED(hr) )
|
||||
RageErrorHr( "Could not create texture renderer object!", hr );
|
||||
|
||||
// Get a pointer to the IBaseFilter on the TextureRenderer, add it to graph
|
||||
pFTR = m_pCTR;
|
||||
if( FAILED( hr = m_pGB->AddFilter(pFTR, L"TEXTURERENDERER" ) ) )
|
||||
RageErrorHr( "Could not add renderer filter to graph!", hr );
|
||||
|
||||
// convert movie file path to wide char string
|
||||
WCHAR wFileName[MAX_PATH];
|
||||
|
||||
#ifndef UNICODE
|
||||
MultiByteToWideChar(CP_ACP, 0, m_sFilePath, -1, wFileName, MAX_PATH);
|
||||
#else
|
||||
lstrcpy(wFileName, m_szFilePath);
|
||||
#endif
|
||||
|
||||
|
||||
// Add the source filter
|
||||
if( FAILED( hr = m_pGB->AddSourceFilter( wFileName, L"SOURCE", &pFSrc ) ) )
|
||||
RageErrorHr( "Could not create source filter to graph!", hr );
|
||||
|
||||
// Find the source's output and the renderer's input
|
||||
if( FAILED( hr = pFTR->FindPin( L"In", &pFTRPinIn ) ) )
|
||||
RageErrorHr( "Could not find input pin!", hr );
|
||||
|
||||
if( FAILED( hr = pFSrc->FindPin( L"Output", &pFSrcPinOut ) ) )
|
||||
RageErrorHr( "Could not find output pin!", hr );
|
||||
|
||||
// Connect these two filters
|
||||
if( FAILED( hr = m_pGB->Connect( pFSrcPinOut, pFTRPinIn ) ) )
|
||||
RageErrorHr( "Could not connect pins!", hr );
|
||||
|
||||
// Get the graph's media control, event & position interfaces
|
||||
m_pGB.QueryInterface(&m_pMC);
|
||||
m_pGB.QueryInterface(&m_pMP);
|
||||
m_pGB.QueryInterface(&m_pME);
|
||||
|
||||
// The graph is built, now get the set the output video width and height
|
||||
m_uImageWidth = m_pCTR->GetVidWidth();
|
||||
m_uImageHeight = m_pCTR->GetVidHeight();
|
||||
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT RageMovieTexture::CreateD3DTexture()
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
// Create the texture that maps to this media type
|
||||
//////////////////////////////////////////////////
|
||||
if( FAILED( hr = D3DXCreateTexture(m_pd3dDevice,
|
||||
m_uImageWidth, m_uImageHeight,
|
||||
1, 0,
|
||||
D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &m_pd3dTexture ) ) )
|
||||
RageErrorHr( "Could not create the D3DX texture!", hr );
|
||||
|
||||
// D3DXCreateTexture can silently change the parameters on us
|
||||
D3DSURFACE_DESC ddsd;
|
||||
if ( FAILED( hr = m_pd3dTexture->GetLevelDesc( 0, &ddsd ) ) )
|
||||
RageErrorHr( "Could not get level Description of D3DX texture!", hr );
|
||||
|
||||
m_uTextureWidth = ddsd.Width;
|
||||
m_uTextureHeight = ddsd.Height;
|
||||
m_TextureFormat = ddsd.Format;
|
||||
if( m_TextureFormat != D3DFMT_A8R8G8B8 &&
|
||||
m_TextureFormat != D3DFMT_A1R5G5B5 )
|
||||
RageErrorHr( "Texture is format we can't handle! Format = 0x%x!", m_TextureFormat );
|
||||
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT RageMovieTexture::PlayMovie()
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
// Start the graph running;
|
||||
if( FAILED( hr = m_pMC->Run() ) )
|
||||
RageErrorHr( "Could not run the DirectShow graph.", hr );
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// CheckMovieStatus: If the movie has ended, rewind to beginning
|
||||
//-----------------------------------------------------------------------------
|
||||
void RageMovieTexture::CheckMovieStatus()
|
||||
{
|
||||
long lEventCode;
|
||||
long lParam1;
|
||||
long lParam2;
|
||||
|
||||
// Check for completion events
|
||||
m_pME->GetEvent( &lEventCode, &lParam1, &lParam2, 0 );
|
||||
if( EC_COMPLETE == lEventCode )
|
||||
m_pMP->put_CurrentPosition(0);
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// CleanupDShow
|
||||
//-----------------------------------------------------------------------------
|
||||
void RageMovieTexture::CleanupDShow()
|
||||
{
|
||||
// Shut down the graph
|
||||
if (m_pMC) m_pMC->Stop();
|
||||
if (m_pGB) m_pGB.Release ();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: RageMovieTexture.h
|
||||
//
|
||||
// Desc: Based on the DShowTextures example in the DX8 SDK.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _RAGEMOVIETEXTURE_H_
|
||||
#define _RAGEMOVIETEXTURE_H_
|
||||
|
||||
|
||||
#include "RageScreen.h"
|
||||
#include <d3dx8.h>
|
||||
//#include <d3d8types.h>
|
||||
#include <atlbase.h>
|
||||
|
||||
#include <streams.h>
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Define GUID for Texture Renderer
|
||||
// {71771540-2017-11cf-AE26-0020AFD79767}
|
||||
//-----------------------------------------------------------------------------
|
||||
struct __declspec(uuid("{71771540-2017-11cf-ae26-0020afd79767}")) CLSID_TextureRenderer;
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// CTextureRenderer Class Declarations
|
||||
//
|
||||
// Usage: 1) CheckMediaType is called by the graph
|
||||
// 2) SetMediaType is called by the graph
|
||||
// 3) call GetVidWidth and GetVidHeight to get texture information
|
||||
// 4) call SetRenderTarget
|
||||
// 5) Do RenderSample is called by the graph
|
||||
//-----------------------------------------------------------------------------
|
||||
class CTextureRenderer : public CBaseVideoRenderer
|
||||
{
|
||||
public:
|
||||
CTextureRenderer(LPUNKNOWN pUnk,HRESULT *phr);
|
||||
~CTextureRenderer();
|
||||
|
||||
public:
|
||||
// overwritten methods
|
||||
HRESULT CheckMediaType(const CMediaType *pmt ); // Format acceptable?
|
||||
HRESULT SetMediaType(const CMediaType *pmt ); // Video format notification
|
||||
HRESULT DoRenderSample(IMediaSample *pMediaSample); // New video sample
|
||||
|
||||
// new methods
|
||||
LONG GetVidWidth() {return m_lVidWidth;};
|
||||
LONG GetVidHeight(){return m_lVidHeight;};
|
||||
HRESULT SetRenderTarget(LPDIRECT3DTEXTURE8 pTexture);
|
||||
BOOL IsLocked() { return m_bLocked; };
|
||||
|
||||
protected:
|
||||
LONG m_lVidWidth; // Video width
|
||||
LONG m_lVidHeight; // Video Height
|
||||
LONG m_lVidPitch; // Video Pitch
|
||||
|
||||
LPDIRECT3DTEXTURE8 m_pTexture; // the video surface we will copy new frames to
|
||||
D3DFORMAT m_TextureFormat; // Texture format
|
||||
BOOL m_bLocked; // Is the texture currently locked while we
|
||||
// copy the movie frame to it?
|
||||
};
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// RageMovieTexture Class Declarations
|
||||
//-----------------------------------------------------------------------------
|
||||
class RageMovieTexture : public RageTexture
|
||||
{
|
||||
public:
|
||||
RageMovieTexture( LPRageScreen pScreen, CString sFilePath );
|
||||
virtual ~RageMovieTexture();
|
||||
|
||||
LPDIRECT3DTEXTURE8 GetD3DTexture();
|
||||
|
||||
protected:
|
||||
virtual VOID Create();
|
||||
|
||||
virtual HRESULT CreateD3DTexture();
|
||||
virtual HRESULT InitDShowTextureRenderer();
|
||||
virtual HRESULT PlayMovie();
|
||||
virtual void CheckMovieStatus();
|
||||
virtual void CleanupDShow();
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// DirectShow pointers
|
||||
//-----------------------------------------------------------------------------
|
||||
CComPtr<IGraphBuilder> m_pGB; // GraphBuilder
|
||||
CComPtr<IMediaControl> m_pMC; // Media Control
|
||||
CComPtr<IMediaPosition> m_pMP; // Media Postion
|
||||
CComPtr<IMediaEvent> m_pME; // Media Event
|
||||
CTextureRenderer *m_pCTR; // DShow Texture renderer
|
||||
};
|
||||
|
||||
typedef RageMovieTexture* LPRageMovieTexture;
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,70 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: RageSound.cpp
|
||||
//
|
||||
// Desc: Sound effects library (currently a wrapper around Bass Sound Library).
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
#include "RageSound.h"
|
||||
#include "RageUtil.h"
|
||||
|
||||
#include "bass/bass.h"
|
||||
#pragma comment(lib, "bass/bass.lib")
|
||||
|
||||
|
||||
LPRageSound SOUND = NULL;
|
||||
|
||||
|
||||
RageSound::RageSound( HWND hWnd )
|
||||
{
|
||||
// save the HWND
|
||||
if( !hWnd )
|
||||
RageError( "RageSound called with NULL hWnd." );
|
||||
m_hWndApp = hWnd;
|
||||
|
||||
if( BASS_GetVersion() != MAKELONG(1,1) )
|
||||
RageError( "BASS version 1.1 DLL could not be loaded. Verify that Bass.dll exists in the program directory.");
|
||||
|
||||
if( !BASS_Init( -1, 44100, BASS_DEVICE_NOSYNC, m_hWndApp ) )
|
||||
RageError( "BASS can't initialize sound device." );
|
||||
|
||||
BASS_Start();
|
||||
}
|
||||
|
||||
RageSound::~RageSound()
|
||||
{
|
||||
BASS_Free();
|
||||
}
|
||||
|
||||
|
||||
HSAMPLE RageSound::LoadSound( const CString sFileName )
|
||||
{
|
||||
RageLog( "RageSound::LoadSound( '%s' )", sFileName );
|
||||
|
||||
HSAMPLE hSample = BASS_SampleLoad( FALSE, (void*)((LPCTSTR)sFileName), 0, 0, 0, 0 );
|
||||
if( hSample == NULL )
|
||||
RageError( ssprintf("RageSound::LoadSound: error loading %s (error code %d)",
|
||||
sFileName, BASS_ErrorGetCode()) );
|
||||
return hSample;
|
||||
}
|
||||
|
||||
VOID RageSound::UnloadSound( HSAMPLE hSample )
|
||||
{
|
||||
BASS_SampleFree( hSample );
|
||||
}
|
||||
|
||||
VOID RageSound::Play( HSAMPLE hSample )
|
||||
{
|
||||
if( NULL == BASS_SamplePlay( hSample ) )
|
||||
RageError( "There was an error playing a sound sample. Are you sure this is a valid HSAMPLE?" );
|
||||
}
|
||||
|
||||
VOID RageSound::Stop( HSAMPLE hSample )
|
||||
{
|
||||
if( FALSE == BASS_SampleStop( hSample ) )
|
||||
RageError( "There was an error stopping a sound sample. Are you sure this is a valid HSAMPLE?" );
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: RageSound.h
|
||||
//
|
||||
// Desc: Sound effects library (currently a wrapper around Bass Sound Library).
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _RAGESOUND_H_
|
||||
#define _RAGESOUND_H_
|
||||
|
||||
|
||||
#include "bass/bass.h"
|
||||
|
||||
|
||||
#define NUM_STREAMS 16
|
||||
|
||||
#define EFFECT_CHANNEL_1 0
|
||||
#define EFFECT_CHANNEL_2 1
|
||||
#define EFFECT_CHANNEL_3 2
|
||||
#define EFFECT_CHANNEL_4 3
|
||||
#define EFFECT_CHANNEL_5 4
|
||||
#define ANOUNCER_CHANNEL 13
|
||||
#define CROWD_CHANNEL 14
|
||||
#define MUSIC_CHANNEL 15
|
||||
|
||||
|
||||
class RageSound
|
||||
{
|
||||
public:
|
||||
RageSound( HWND hWnd );
|
||||
~RageSound();
|
||||
|
||||
HSAMPLE LoadSound( const CString sFileName );
|
||||
VOID UnloadSound( HSAMPLE hSample );
|
||||
VOID Play( HSAMPLE hSample );
|
||||
VOID Stop( HSAMPLE hSample );
|
||||
|
||||
private:
|
||||
HWND m_hWndApp; // this is set on GRAPHICS_Create()
|
||||
// HSAMPLE m_hSample[NUM_STREAMS];
|
||||
};
|
||||
|
||||
|
||||
typedef RageSound* LPRageSound;
|
||||
|
||||
|
||||
extern LPRageSound SOUND; // global and accessable from anywhere in our program
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,120 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: RageTexture.cpp
|
||||
//
|
||||
// Desc:
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Includes
|
||||
//-----------------------------------------------------------------------------
|
||||
#include "RageTexture.h"
|
||||
#include "RageUtil.h"
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// RageTexture constructor
|
||||
//-----------------------------------------------------------------------------
|
||||
RageTexture::RageTexture( LPRageScreen pScreen, CString sFilePath ) :
|
||||
m_uImageWidth( 0 ),
|
||||
m_uImageHeight( 0 ),
|
||||
m_uTextureWidth( 0 ),
|
||||
m_uTextureHeight( 0 ),
|
||||
m_uFramesWide( 1 ),
|
||||
m_uFramesHigh( 1 ),
|
||||
m_uFrameWidth( 0 ),
|
||||
m_uFrameHeight( 0 )
|
||||
{
|
||||
// RageLog( "RageTexture::RageTexture()" );
|
||||
|
||||
// save a pointer to the D3D device
|
||||
m_pd3dDevice = pScreen->GetDevice();
|
||||
assert( m_pd3dDevice != NULL );
|
||||
|
||||
// save the file path
|
||||
m_sFilePath = sFilePath;
|
||||
m_pd3dTexture = NULL;
|
||||
m_iRefCount = 1;
|
||||
|
||||
|
||||
}
|
||||
|
||||
RageTexture::~RageTexture()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
VOID RageTexture::CreateFrameRects()
|
||||
{
|
||||
GetFrameDimensionsFromFileName( m_sFilePath, m_uFramesWide, m_uFramesHigh );
|
||||
|
||||
///////////////////////////////////
|
||||
// Fill in the m_FrameRects with the bounds of each frame in the animation.
|
||||
///////////////////////////////////
|
||||
|
||||
// calculate the width and height of the frames
|
||||
m_uFrameWidth = GetImageWidth() / m_uFramesWide;
|
||||
m_uFrameHeight= GetImageHeight() / m_uFramesHigh;
|
||||
|
||||
for( UINT j=0; j<m_uFramesHigh; j++ )
|
||||
{
|
||||
for( UINT i=0; i<m_uFramesWide; i++ )
|
||||
{
|
||||
RECT rectCurFrame;
|
||||
::SetRect( &rectCurFrame, (i+0)*m_uFrameWidth, (j+0)*m_uFrameHeight,
|
||||
(i+1)*m_uFrameWidth, (j+1)*m_uFrameHeight );
|
||||
m_FrameRects.Add( rectCurFrame ); // the index of this array element will be (i + j*m_uFramesWide)
|
||||
|
||||
// RageLog( "Adding frame#%d: %d %d %d %d", (i + j*m_uFramesWide), rectCurFrame.left, rectCurFrame.top, rectCurFrame.right, rectCurFrame.bottom );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#include "string.h"
|
||||
VOID RageTexture::GetFrameDimensionsFromFileName( CString sPath, UINT &uFramesWide, UINT &uFramesHigh ) const
|
||||
{
|
||||
//////////////////////////////////////////////////
|
||||
// Parse m_sFilePath for the frame dimensions
|
||||
//
|
||||
// The file name must look like "name 4x15.gif". The the space is required.
|
||||
//////////////////////////////////////////////////
|
||||
CString sDimensionsString = sPath; // we will chop this down to the "4x15" part. Need regular... expressions... choke :-)
|
||||
|
||||
// chop off the extension
|
||||
int index_of_last_period = sDimensionsString.ReverseFind( '.' );
|
||||
if( index_of_last_period == -1 ) // this file name has no extension, but it the texture was loaded. I doubt this code will ever execute :-)
|
||||
{
|
||||
uFramesWide = uFramesHigh = 1;
|
||||
return;
|
||||
}
|
||||
sDimensionsString = sDimensionsString.Left(index_of_last_period);
|
||||
|
||||
// chop off everything before the last space
|
||||
int index_of_last_space = sDimensionsString.ReverseFind( ' ' );
|
||||
if( index_of_last_space == -1 ) // this file name has space, so the dimensions tag cannot be read
|
||||
{
|
||||
uFramesWide = uFramesHigh = 1;
|
||||
return;
|
||||
}
|
||||
sDimensionsString.Delete( 0, index_of_last_space+1 );
|
||||
|
||||
// now we are left with "4x15"
|
||||
int index_of_x = sDimensionsString.Find( 'x' );
|
||||
if( index_of_x == -1 ) // this file name doesn't have an x in the last token. So, this probably isn't a dimension tag.
|
||||
{
|
||||
uFramesWide = uFramesHigh = 1;
|
||||
return;
|
||||
}
|
||||
uFramesWide = (UINT) atoi( sDimensionsString.Left( index_of_x ) );
|
||||
|
||||
// chop off the frames wide part and read in the frames high
|
||||
sDimensionsString.Delete( 0, index_of_x+1 );
|
||||
uFramesHigh = (UINT) atoi( sDimensionsString );
|
||||
|
||||
if( uFramesWide == 0 ) uFramesWide = 1;
|
||||
if( uFramesHigh == 0 ) uFramesHigh = 1;
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: RageTexture.h
|
||||
//
|
||||
// Desc:
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
class RageTexture;
|
||||
typedef RageTexture* LPRageTexture;
|
||||
|
||||
|
||||
#ifndef _RAGETEXTURE_H_
|
||||
#define _RAGETEXTURE_H_
|
||||
|
||||
|
||||
#include "RageScreen.h"
|
||||
#include <d3dx8.h>
|
||||
#include <assert.h>
|
||||
//#include <d3d8types.h>
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// RageTexture Class Declarations
|
||||
//-----------------------------------------------------------------------------
|
||||
class RageTexture
|
||||
{
|
||||
public:
|
||||
RageTexture( LPRageScreen pScreen, CString sFilePath );
|
||||
virtual ~RageTexture() PURE;
|
||||
|
||||
virtual LPDIRECT3DTEXTURE8 GetD3DTexture() PURE;
|
||||
|
||||
UINT GetImageWidth() {return m_uImageWidth;};
|
||||
UINT GetImageHeight() {return m_uImageHeight;};
|
||||
UINT GetTextureWidth() {return m_uTextureWidth;};
|
||||
UINT GetTextureHeight() {return m_uTextureHeight;};
|
||||
|
||||
UINT GetFramesWide() {return m_uFramesWide;};
|
||||
UINT GetFramesHigh() {return m_uFramesHigh;};
|
||||
UINT GetFrameWidth() {return m_uFrameWidth;};
|
||||
UINT GetFrameHeight() {return m_uFrameHeight;};
|
||||
LPRECT GetFrameRect( UINT uFrameNo ) {return &m_FrameRects[uFrameNo];};
|
||||
UINT GetNumFrames() {return m_FrameRects.GetSize();};
|
||||
CString GetFilePath() {return m_sFilePath;};
|
||||
|
||||
INT m_iRefCount;
|
||||
|
||||
protected:
|
||||
virtual VOID CreateFrameRects();
|
||||
virtual VOID GetFrameDimensionsFromFileName( CString sPath, UINT &uFramesWide, UINT &uFramesHigh ) const;
|
||||
|
||||
CString m_sFilePath;
|
||||
LPDIRECT3DDEVICE8 m_pd3dDevice;
|
||||
LPDIRECT3DTEXTURE8 m_pd3dTexture;
|
||||
|
||||
UINT m_uImageWidth, m_uImageHeight;
|
||||
UINT m_uTextureWidth, m_uTextureHeight;
|
||||
D3DFORMAT m_TextureFormat;
|
||||
|
||||
// The number of frames of animation in each row and column of this texture.
|
||||
UINT m_uFramesWide, m_uFramesHigh;
|
||||
UINT m_uFrameWidth, m_uFrameHeight;
|
||||
|
||||
// RECTs that hold the bounds of each frame in the bitmap.
|
||||
// e.g., if the texture has 4 frames of animation, the SrcRect for each frame would
|
||||
// be in m_FrameRects[0..4].
|
||||
CArray<RECT, RECT&> m_FrameRects;
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,118 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: RageTextureManager.cpp
|
||||
//
|
||||
// Desc: Loads and releases textures
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Includes
|
||||
//-----------------------------------------------------------------------------
|
||||
#include "RageTextureManager.h"
|
||||
#include "RageBitmapTexture.h"
|
||||
#include "RageMovieTexture.h"
|
||||
#include "RageUtil.h"
|
||||
#include <assert.h>
|
||||
|
||||
LPRageTextureManager TM = NULL;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// constructor/destructor
|
||||
//-----------------------------------------------------------------------------
|
||||
RageTextureManager::RageTextureManager( LPRageScreen pScreen )
|
||||
{
|
||||
assert( pScreen != NULL );
|
||||
m_pScreen = pScreen;
|
||||
|
||||
}
|
||||
|
||||
RageTextureManager::~RageTextureManager()
|
||||
{
|
||||
// delete all textures
|
||||
POSITION pos = m_mapPathToTexture.GetStartPosition();
|
||||
CString key;
|
||||
LPRageTexture value;
|
||||
|
||||
while( pos != NULL ) // iterate over all k/v pairs in map
|
||||
{
|
||||
m_mapPathToTexture.GetNextAssoc( pos, key, value );
|
||||
SAFE_DELETE( value );
|
||||
}
|
||||
|
||||
m_mapPathToTexture.RemoveAll();
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Load/Unload textures from disk
|
||||
//-----------------------------------------------------------------------------
|
||||
LPRageTexture RageTextureManager::LoadTexture( CString sTexturePath )
|
||||
{
|
||||
// RageLog( "RageTextureManager::LoadTexture(%s).", sTexturePath );
|
||||
|
||||
// holder for the new texture
|
||||
LPRageTexture pTexture;
|
||||
|
||||
// Convert the path to lowercase so that we don't load duplicates.
|
||||
// Really, this does not solve the duplicate problem. We could have to copies
|
||||
// of the same bitmap if there are equivalent but different paths
|
||||
// (e.g. "Bitmaps\me.bmp" and "..\Rage PC Edition\Bitmaps\me.bmp" ).
|
||||
sTexturePath.MakeLower();
|
||||
|
||||
if( m_mapPathToTexture.Lookup( sTexturePath, pTexture ) ) // if the texture already exists in the map
|
||||
{
|
||||
// RageLog( ssprintf("Found that '%s' is already loaded. Using the loaded copy.", sTexturePath) );
|
||||
pTexture->m_iRefCount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
RageLog( ssprintf("Didn't find '%s' already loaded. Creating a new texture.", sTexturePath) );
|
||||
|
||||
CString sDrive, sDir, sFName, sExt;
|
||||
splitpath( FALSE, sTexturePath, sDrive, sDir, sFName, sExt );
|
||||
|
||||
if( sExt == "avi" || sExt == "mpg" || sExt == "mpeg" )
|
||||
pTexture = (LPRageTexture) new RageMovieTexture( m_pScreen, sTexturePath );
|
||||
else
|
||||
pTexture = (LPRageTexture) new RageBitmapTexture( m_pScreen, sTexturePath );
|
||||
|
||||
m_mapPathToTexture.SetAt( sTexturePath, pTexture );
|
||||
}
|
||||
|
||||
return pTexture;
|
||||
}
|
||||
|
||||
VOID RageTextureManager::UnloadTexture( CString sTexturePath )
|
||||
{
|
||||
// RageLog( "RageTextureManager::UnloadTexture(%s).", sTexturePath );
|
||||
|
||||
if( sTexturePath == "" )
|
||||
{
|
||||
RageLog( "RageTextureManager::UnloadTexture() tried to Unload a blank" );
|
||||
return;
|
||||
}
|
||||
|
||||
sTexturePath.MakeLower();
|
||||
LPRageTexture pTexture;
|
||||
|
||||
if( m_mapPathToTexture.Lookup( sTexturePath, pTexture ) ) // if the texture exists in the map
|
||||
{
|
||||
pTexture->m_iRefCount--;
|
||||
if( pTexture->m_iRefCount == 0 ) // there are no more references to this texture
|
||||
{
|
||||
RageLog( ssprintf("The texture '%s' has no more references. It will be deleted.", sTexturePath) );
|
||||
SAFE_DELETE( pTexture ); // free the texture
|
||||
m_mapPathToTexture.RemoveKey( sTexturePath ); // and remove the key in the map
|
||||
}
|
||||
// else
|
||||
// RageLog( ssprintf("The texture '%s' has %d more references. It will not be deleted.",
|
||||
// sTexturePath, pTexture->m_iRefCount) );
|
||||
|
||||
}
|
||||
else
|
||||
RageError( ssprintf("Tried to Unload a texture that wasn't loaded. '%s'", sTexturePath) );
|
||||
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: RageTextureManager.h
|
||||
//
|
||||
// Desc: Loads and releases textures
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
class RageTextureManager;
|
||||
typedef RageTextureManager* LPRageTextureManager;
|
||||
|
||||
|
||||
|
||||
|
||||
#ifndef _RAGETEXTUREMANAGER_H_
|
||||
#define _RAGETEXTUREMANAGER_H_
|
||||
|
||||
|
||||
#include "RageTexture.h"
|
||||
//#include <d3dx8.h>
|
||||
//#include <d3d8types.h>
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// RageTextureManager Class Declarations
|
||||
//-----------------------------------------------------------------------------
|
||||
class RageTextureManager
|
||||
{
|
||||
public:
|
||||
RageTextureManager( LPRageScreen pScreen );
|
||||
~RageTextureManager();
|
||||
|
||||
LPRageTexture LoadTexture( CString sTexturePath );
|
||||
VOID UnloadTexture( CString sTexturePath );
|
||||
|
||||
protected:
|
||||
LPRageScreen m_pScreen;
|
||||
|
||||
// map from file name to a texture holder
|
||||
CTypedPtrMap<CMapStringToPtr, CString, LPRageTexture> m_mapPathToTexture;
|
||||
};
|
||||
|
||||
extern LPRageTextureManager TM; // global and accessable from anywhere in our program
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,297 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: RageUtil.cpp
|
||||
//
|
||||
// Desc:
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include "RageUtil.h"
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// UTIL globals
|
||||
//-----------------------------------------------------------------------------
|
||||
const CString g_sLogFileName = "debug.log";
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: randomf()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
FLOAT randomf( FLOAT low, FLOAT high )
|
||||
{
|
||||
return low + ( high - low ) * ( (FLOAT)rand() ) / RAND_MAX;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: roundf()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
int roundf( FLOAT f )
|
||||
{
|
||||
return (int)((f)+0.5f);
|
||||
}
|
||||
|
||||
int roundf( double f )
|
||||
{
|
||||
return (int)((f)+0.5f);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: RageLogStart()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
void RageLogStart()
|
||||
{
|
||||
// delete the old log and create a new one
|
||||
DeleteFile( g_sLogFileName );
|
||||
FILE *fp = NULL;
|
||||
fp = fopen( g_sLogFileName, "w" );
|
||||
fclose( fp );
|
||||
|
||||
|
||||
SYSTEMTIME st;
|
||||
GetLocalTime( &st );
|
||||
|
||||
RageLog( "%s: last compiled on %s.", g_sLogFileName, __TIMESTAMP__ );
|
||||
RageLog( "Log starting %.4d-%.2d-%.2d %.2d:%.2d:%.2d",
|
||||
st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond );
|
||||
RageLog( "\n" );
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: RageLog()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
void RageLog( LPCTSTR fmt, ...)
|
||||
{
|
||||
|
||||
#if defined(DEBUG) | defined(_DEBUG)
|
||||
va_list va;
|
||||
va_start(va, fmt);
|
||||
|
||||
CString sBuff = vssprintf( fmt, va );
|
||||
sBuff += "\n";
|
||||
|
||||
FILE *fp = NULL;
|
||||
|
||||
// open our logging file
|
||||
fp = fopen( g_sLogFileName, "a" );
|
||||
if( fp==NULL )
|
||||
RageLog( ssprintf("Couldn't write to log %s", g_sLogFileName) );
|
||||
|
||||
fprintf(fp, sBuff);
|
||||
|
||||
fclose(fp);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: ssprintf()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
CString ssprintf( LPCTSTR fmt, ...)
|
||||
{
|
||||
va_list va;
|
||||
va_start(va, fmt);
|
||||
return vssprintf(fmt, va);
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: vssprintf()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
CString vssprintf( LPCTSTR fmt, va_list argList)
|
||||
{
|
||||
CString str;
|
||||
str.FormatV(fmt, argList);
|
||||
return str;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: join()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
CString join(CString Deliminator, CStringArray& Source)
|
||||
{
|
||||
CString csReturn;
|
||||
CString csTmp;
|
||||
|
||||
// Loop through the Array and Append the Deliminator
|
||||
for( int iNum = 0; iNum < Source.GetSize(); iNum++ ) {
|
||||
csTmp += Source.GetAt(iNum);
|
||||
csTmp += Deliminator;
|
||||
}
|
||||
csReturn = csTmp.Left(csTmp.GetLength() - 1);
|
||||
return csReturn;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: split()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
void split( CString Source, CString Deliminator, CStringArray& AddIt )
|
||||
{
|
||||
CString newCString;
|
||||
CString tmpCString;
|
||||
CString AddCString;
|
||||
|
||||
int pos1 = 0;
|
||||
int pos = 0;
|
||||
|
||||
newCString = Source;
|
||||
do {
|
||||
pos1 = 0;
|
||||
pos = newCString.Find(Deliminator, pos1);
|
||||
if ( pos != -1 ) {
|
||||
CString AddCString = newCString.Left(pos);
|
||||
if (!AddCString.IsEmpty())
|
||||
AddIt.Add(AddCString);
|
||||
|
||||
tmpCString = newCString.Mid(pos + Deliminator.GetLength());
|
||||
newCString = tmpCString;
|
||||
}
|
||||
} while ( pos != -1 );
|
||||
|
||||
if (!newCString.IsEmpty())
|
||||
AddIt.Add(newCString);
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: splitpath()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
void splitpath (BOOL UsingDirsOnly, CString Path, CString& Drive, CString& Dir, CString& FName, CString& Ext)
|
||||
{
|
||||
|
||||
int nSecond;
|
||||
|
||||
// Look for a UNC Name!
|
||||
if (Path.Left(2) == "\\\\") {
|
||||
int nFirst = Path.Find("\\",3);
|
||||
nSecond = Path.Find("\\",nFirst + 1);
|
||||
if (nSecond == -1) {
|
||||
Drive = Path;
|
||||
Dir = "";
|
||||
FName = "";
|
||||
Ext = "";
|
||||
}
|
||||
else if (nSecond > nFirst)
|
||||
Drive = Path.Left(nSecond);
|
||||
}
|
||||
else { // Look for normal Drive Structure
|
||||
nSecond = 2;
|
||||
Drive = Path.Left(2);
|
||||
}
|
||||
|
||||
if (UsingDirsOnly) {
|
||||
Dir = Path.Right((Path.GetLength() - nSecond) - 1);
|
||||
FName = "";
|
||||
Ext = "";
|
||||
}
|
||||
else {
|
||||
int nDirEnd = Path.ReverseFind('\\');
|
||||
if (nDirEnd == Path.GetLength()) {
|
||||
Dir = "";
|
||||
FName = "";
|
||||
Ext = "";
|
||||
}
|
||||
else {
|
||||
|
||||
Dir = Path.Mid(nSecond + 1, (nDirEnd - nSecond) - 1);
|
||||
|
||||
int nFileEnd = Path.ReverseFind('.');
|
||||
if (nFileEnd != -1) {
|
||||
|
||||
if (nDirEnd > nFileEnd) {
|
||||
FName = Path.Right(Path.GetLength() - nDirEnd);
|
||||
Ext = "";
|
||||
}
|
||||
else {
|
||||
FName = Path.Mid(nDirEnd + 1, (nFileEnd - nDirEnd) - 1);
|
||||
Ext = Path.Right((Path.GetLength() - nFileEnd) - 1);
|
||||
}
|
||||
}
|
||||
else {
|
||||
FName = Path.Right((Path.GetLength() - nDirEnd) - 1);
|
||||
Ext = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GetDirListing( CString sPath, CStringArray &AddTo, BOOL bOnlyDirs )
|
||||
{
|
||||
WIN32_FIND_DATA fd;
|
||||
HANDLE hFind = ::FindFirstFile( sPath, &fd );
|
||||
|
||||
if( INVALID_HANDLE_VALUE != hFind )
|
||||
{
|
||||
do
|
||||
{
|
||||
if( !bOnlyDirs || fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||
{
|
||||
CString sDirName( fd.cFileName );
|
||||
if( sDirName != "." && sDirName != ".." )
|
||||
AddTo.Add( sDirName );
|
||||
}
|
||||
} while( ::FindNextFile( hFind, &fd ) );
|
||||
::FindClose( hFind );
|
||||
}
|
||||
}
|
||||
|
||||
BOOL DoesFileExist( CString sPath )
|
||||
{
|
||||
RageLog( "DoesFileExist(%s)", sPath );
|
||||
|
||||
DWORD dwAttr = GetFileAttributes( sPath );
|
||||
if( dwAttr == (DWORD)-1 )
|
||||
return FALSE;
|
||||
else
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
int CompareCStrings(const void *arg1, const void *arg2)
|
||||
{
|
||||
CString str1 = *(CString *)arg1;
|
||||
CString str2 = *(CString *)arg2;
|
||||
return str1.CompareNoCase( str2 );
|
||||
}
|
||||
|
||||
void SortCStringArray( CStringArray &AddTo, BOOL bSortAcsending )
|
||||
{
|
||||
qsort( AddTo.GetData(), AddTo.GetSize(), sizeof(CString), CompareCStrings );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: DisplayErrorAndDie()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
VOID DisplayErrorAndDie( CString sError )
|
||||
{
|
||||
RageLog( "" );
|
||||
RageLog( "// Fatal Error /////////////////////////////" );
|
||||
RageLog( sError );
|
||||
RageLog( "////////////////////////////////////////////" );
|
||||
|
||||
// Something very bad happened. Display an error dialog, then exit right away.
|
||||
MessageBox(
|
||||
NULL, // handle of owner window
|
||||
sError, // text in message box
|
||||
"Fatal Error", // address of title of message box
|
||||
MB_OK | MB_ICONERROR // style of message box
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: RageUtil.h
|
||||
//
|
||||
// Desc:
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _RAGEUTIL_H_
|
||||
#define _RAGEUTIL_H_
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SAFE_ Macros
|
||||
//-----------------------------------------------------------------------------
|
||||
#define SAFE_DELETE(p) { if(p) { delete (p); (p)=NULL; } }
|
||||
#define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p)=NULL; } }
|
||||
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Other Macros
|
||||
//-----------------------------------------------------------------------------
|
||||
#define RECTWIDTH(rect) ((rect).right - (rect).left)
|
||||
#define RECTHEIGHT(rect) ((rect).bottom - (rect).top)
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Misc helper functions
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
// Simple function for generating random numbers
|
||||
FLOAT randomf( FLOAT low=-1.0f, FLOAT high=1.0f );
|
||||
int roundf( FLOAT f );
|
||||
int roundf( double f );
|
||||
|
||||
CString ssprintf( LPCTSTR fmt, ...);
|
||||
CString vssprintf( LPCTSTR fmt, va_list argList );
|
||||
|
||||
|
||||
/*
|
||||
@FUNCTION: Splits a Path into 4 parts (Directory, Drive, Filename, Extention).
|
||||
NOTE: Supports UNC path names.
|
||||
@PARAM1: Whether the Supplied Path (PARAM2) contains a directory name only
|
||||
or a file name (Reason: some directories will end with "xxx.xxx"
|
||||
which is like a file name).
|
||||
@PARAM2: Path to Split.
|
||||
@PARAM3: (Referenced) Directory.
|
||||
@PARAM4: (Referenced) Drive.
|
||||
@PARAM5: (Referenced) Filename.
|
||||
@PARAM6: (Referenced) Extention.
|
||||
*/
|
||||
void splitpath(BOOL UsingDirsOnly, CString Path, CString& Drive, CString& Dir, CString& FName, CString& Ext);
|
||||
|
||||
/*
|
||||
@FUNCTION: Splits a CString into an CStringArray according the Deliminator.
|
||||
NOTE: Supports UNC path names.
|
||||
@PARAM1: Source string to be Split.
|
||||
@PARAM2: Deliminator.
|
||||
@PARAM3: (Referenced) CStringArray to Add to.
|
||||
*/
|
||||
void split(CString Source, CString Deliminator, CStringArray& AddIt );
|
||||
|
||||
/*
|
||||
@FUNCTION: Joins a CStringArray to create a CString according the Deliminator.
|
||||
@PARAM1: Deliminator.
|
||||
@PARAM2: (Referenced) CStringArray to Add to.
|
||||
*/
|
||||
CString join(CString Deliminator, CStringArray& Source);
|
||||
|
||||
void GetDirListing( CString sPath, CStringArray &AddTo, BOOL bOnlyDirs=FALSE );
|
||||
|
||||
BOOL DoesFileExist( CString sPath );
|
||||
|
||||
int CompareCStrings(const void *arg1, const void *arg2);
|
||||
void SortCStringArray( CStringArray &AddTo, BOOL bSortAcsending = TRUE );
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Log helpers
|
||||
//-----------------------------------------------------------------------------
|
||||
void RageLogStart();
|
||||
void RageLog( LPCTSTR fmt, ...);
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Error helpers
|
||||
//-----------------------------------------------------------------------------
|
||||
#include "dxerr8.h"
|
||||
#pragma comment(lib, "dxerr8.lib")
|
||||
|
||||
|
||||
VOID DisplayErrorAndDie( CString sError );
|
||||
|
||||
|
||||
//#if defined(DEBUG) | defined(_DEBUG)
|
||||
#define RageError(str) DisplayErrorAndDie( ssprintf( "%s\n\n%s(%d)", str, __FILE__, (DWORD)__LINE__, str) )
|
||||
#define RageErrorHr(str,hr) DisplayErrorAndDie( ssprintf("%s (%s)\n\n%s(%d)", str, DXGetErrorString8(hr), __FILE__, (DWORD)__LINE__, str) )
|
||||
//#else
|
||||
// #define RageError(str) (0L)
|
||||
// #define RageErrorHr(str,hr) (hr)
|
||||
//#endif
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,417 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Song.cpp
|
||||
//
|
||||
// Desc: Holds metadata for a song and the song's step data.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "Util.h"
|
||||
#include "IniFile.h"
|
||||
#include "BmsFile.h"
|
||||
#include "Steps.h"
|
||||
#include "RageUtil.h"
|
||||
|
||||
#include "Song.h"
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
//////////////////////////////
|
||||
// Song
|
||||
//////////////////////////////
|
||||
|
||||
bool Song::LoadFromSongDir( CString sDir )
|
||||
{
|
||||
RageLog( "Song::LoadFromSongDir(%s)", sDir );
|
||||
|
||||
// make sure there is a trailing '\\' at the end of sDir
|
||||
if( sDir.Right(1) != "\\" )
|
||||
sDir += "\\";
|
||||
|
||||
// save song dir
|
||||
m_sSongDir = sDir;
|
||||
|
||||
// We are going to load from either a .song or .msd file.
|
||||
// If no .song files exist, then look for an .msd.
|
||||
|
||||
CStringArray arrayBMSFileNames;
|
||||
GetDirListing( sDir + CString("*.bms"), arrayBMSFileNames );
|
||||
int iNumBMSFiles = arrayBMSFileNames.GetSize();
|
||||
|
||||
CStringArray arrayMSDFileNames;
|
||||
GetDirListing( sDir + CString("*.msd"), arrayMSDFileNames );
|
||||
int iNumMSDFiles = arrayMSDFileNames.GetSize();
|
||||
|
||||
/*
|
||||
int j;
|
||||
RageLog( "Found the following .bms files:" );
|
||||
for( j=0; j<iNumBMSFiles; j++ )
|
||||
RageLog( arrayBMSFileNames.GetAt(j) );
|
||||
|
||||
RageLog( "Found the following .msd files:" );
|
||||
for( j=0; j<iNumMSDFiles; j++ )
|
||||
RageLog( arrayMSDFileNames.GetAt(j) );
|
||||
*/
|
||||
|
||||
if( iNumBMSFiles > 0 )
|
||||
{
|
||||
for( int i=0; i<iNumBMSFiles; i++ )
|
||||
LoadFromBMSFile( sDir + arrayBMSFileNames.GetAt(i) );
|
||||
}
|
||||
else if( iNumMSDFiles == 1 )
|
||||
{
|
||||
//m_sSongFile = arrayMSDFileNames.GetAt( 0 );
|
||||
//RageLog( "Found '%s'. Let's use it...", m_sSongFile );
|
||||
//LoadFromMSDFile( sDir + m_sSongFile );
|
||||
}
|
||||
else if( iNumMSDFiles > 0 )
|
||||
RageError( ssprintf("Found more than one MSD file in '%s'. Which should I use?", sDir) );
|
||||
else
|
||||
RageError( ssprintf("Couldn't find any BMS or MSD files in '%s'", sDir) );
|
||||
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
BOOL Song::LoadFromBMSFile( CString sPath )
|
||||
{
|
||||
RageLog( "Song::LoadFromBMSFile(%s)", sPath );
|
||||
|
||||
BmsFile bms( sPath );
|
||||
bms.ReadFile();
|
||||
|
||||
Steps new_steps; // just assume one steps per file for now
|
||||
|
||||
CMapStringToString &mapValues = bms.mapValues;
|
||||
|
||||
POSITION pos = mapValues.GetStartPosition();
|
||||
while( pos != NULL )
|
||||
{
|
||||
CString valuename;
|
||||
CString data_string;
|
||||
CStringArray data_array;
|
||||
mapValues.GetNextAssoc( pos, valuename, data_string );
|
||||
split(data_string, ":", data_array);
|
||||
|
||||
// handle the data
|
||||
if( valuename == "#PLAYER" )
|
||||
;
|
||||
|
||||
else if( valuename == "#GENRE" )
|
||||
m_sCreator = data_array[0];
|
||||
|
||||
else if( valuename == "#TITLE" )
|
||||
m_sTitle = data_array[0];
|
||||
|
||||
else if( valuename == "#ARTIST" )
|
||||
m_sArtist = data_array[0];
|
||||
|
||||
else if( valuename == "#BPM" )
|
||||
m_fBPM = (FLOAT)atof( data_array[0] );
|
||||
|
||||
else if( valuename == "#PLAYLEVEL" )
|
||||
new_steps.iDifficulty = atoi( data_array[0] );
|
||||
|
||||
else if( valuename == "#BackBMP" || valuename == "#backBMP")
|
||||
m_sBackground = data_array[0];
|
||||
|
||||
else if( valuename == "#WAV99" )
|
||||
m_sMusic = data_array[0];
|
||||
|
||||
else if( valuename.GetLength() == 6 ) // this is probably step or offset data. Looks like "#00705"
|
||||
{
|
||||
int iMeasureNo = atoi( valuename.Mid(1,3) );
|
||||
int iNoteNum = atoi( valuename.Mid(4,2) );
|
||||
CString sNoteData = data_array[0];
|
||||
CArray<BOOL, BOOL&> arrayNotes;
|
||||
|
||||
for( int i=0; i<sNoteData.GetLength(); i+=2 )
|
||||
{
|
||||
BOOL bThisIsANote = sNoteData.Mid(i,2) == "01" // step
|
||||
|| sNoteData.Mid(i,2) == "99"; // offset
|
||||
arrayNotes.Add( bThisIsANote );
|
||||
}
|
||||
|
||||
const int iNumNotesInThisMeasure = arrayNotes.GetSize();
|
||||
//RageLog( "%s:%s: iMeasureNo = %d, iNoteNum = %d, iNumNotesInThisMeasure = %d",
|
||||
// valuename, sNoteData, iMeasureNo, iNoteNum, iNumNotesInThisMeasure );
|
||||
for( int j=0; j<iNumNotesInThisMeasure; j++ )
|
||||
{
|
||||
if( arrayNotes.GetAt(j) == TRUE )
|
||||
{
|
||||
FLOAT fPercentThroughMeasure = (FLOAT)j/(FLOAT)iNumNotesInThisMeasure;
|
||||
|
||||
// index is in quarter beats starting at beat 0
|
||||
int iStepIndex = (int) ( (iMeasureNo + fPercentThroughMeasure)
|
||||
* BEATS_IN_MEASURE * ELEMENTS_PER_BEAT );
|
||||
// BMS encoding:
|
||||
// 4&8panel: Player1 Player2
|
||||
// Left 11 21
|
||||
// Down 13 23
|
||||
// Up 15 25
|
||||
// Right 16 26
|
||||
// 6panel: Player1 Player2
|
||||
// Left 11 21
|
||||
// Left+Up 12 22
|
||||
// Down 13 23
|
||||
// Up 14 24
|
||||
// Up+Right 15 25
|
||||
// Right 16 26
|
||||
//
|
||||
// Notice that 15 and 25 have two different meanings! What were they thinking???
|
||||
// While reading in, use the 6 panel mapping. After reading in, detect if only 4 notes
|
||||
// are filled in. If so, shift the Up+Right column back to the Up column
|
||||
//
|
||||
// Our internal encoding:
|
||||
// 0x0001 left player 1
|
||||
// 0x0002 left+up player 1
|
||||
// 0x0004 down player 1
|
||||
// 0x0008 up player 1
|
||||
// 0x0010 up+right player 1
|
||||
// 0x0020 right player 1
|
||||
// 0x0040 left player 2
|
||||
// 0x0080 left+up player 2
|
||||
// 0x0100 down player 2
|
||||
// 0x0200 up player 2
|
||||
// 0x0400 up+right player 2
|
||||
// 0x0800 right player 2
|
||||
CMap<int, int, Step, Step> mapBMSNumberToOurStepBit;
|
||||
mapBMSNumberToOurStepBit[11] = 0x0001;
|
||||
mapBMSNumberToOurStepBit[12] = 0x0002;
|
||||
mapBMSNumberToOurStepBit[13] = 0x0004;
|
||||
mapBMSNumberToOurStepBit[14] = 0x0008;
|
||||
mapBMSNumberToOurStepBit[15] = 0x0010;
|
||||
mapBMSNumberToOurStepBit[16] = 0x0020;
|
||||
mapBMSNumberToOurStepBit[21] = 0x0040;
|
||||
mapBMSNumberToOurStepBit[22] = 0x0080;
|
||||
mapBMSNumberToOurStepBit[23] = 0x0100;
|
||||
mapBMSNumberToOurStepBit[24] = 0x0200;
|
||||
mapBMSNumberToOurStepBit[25] = 0x0400;
|
||||
mapBMSNumberToOurStepBit[26] = 0x0800;
|
||||
|
||||
new_steps.StepArray[iStepIndex] |= mapBMSNumberToOurStepBit[iNoteNum];
|
||||
new_steps.StatusArray[iStepIndex] = not_stepped_on;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int iNumSteps = 0;
|
||||
for( int i=0; i<new_steps.StatusArray.GetSize(); i++ ) {
|
||||
if( new_steps.StatusArray[i] == not_stepped_on ) {
|
||||
iNumSteps++;
|
||||
}
|
||||
}
|
||||
|
||||
RageLog( "%d of %d steps elements are filled", iNumSteps, new_steps.StatusArray.GetSize() );
|
||||
// we're done reading in all of the BMS values
|
||||
|
||||
|
||||
if( m_sTitle.Find("<BASIC>") >0 ) new_steps.sDescription = "BASIC";
|
||||
else if( m_sTitle.Find("<ANOTHER>") >0 ) new_steps.sDescription = "ANOTHER";
|
||||
else if( m_sTitle.Find("<TRICK>") >0 ) new_steps.sDescription = "TRICK";
|
||||
else if( m_sTitle.Find("<MANIAC>") >0 ) new_steps.sDescription = "MANIAC";
|
||||
else if( m_sTitle.Find("<SSR>") >0 ) new_steps.sDescription = "SSR";
|
||||
else if( m_sTitle.Find("<6PANELS BASIC>") >0 ) new_steps.sDescription = "BASIC";
|
||||
else if( m_sTitle.Find("<6PANELS ANOTHER>") >0 ) new_steps.sDescription = "ANOTHER";
|
||||
else if( m_sTitle.Find("<6PANELS TRICK>") >0 ) new_steps.sDescription = "TRICK";
|
||||
else if( m_sTitle.Find("<6PANELS MANIAC>") >0 ) new_steps.sDescription = "MANIAC";
|
||||
else if( m_sTitle.Find("<6PANELS SSR>") >0 ) new_steps.sDescription = "SSR";
|
||||
else if( m_sTitle.Find("<BASIC DOUBLE>") >0 ) new_steps.sDescription = "BASIC DOUBLE";
|
||||
else if( m_sTitle.Find("<ANOTHER DOUBLE>") >0 ) new_steps.sDescription = "ANOTHER DOUBLE";
|
||||
else if( m_sTitle.Find("<TRICK DOUBLE>") >0 ) new_steps.sDescription = "TRICK DOUBLE";
|
||||
else if( m_sTitle.Find("<MANIAC DOUBLE>") >0 ) new_steps.sDescription = "MANIAC DOUBLE";
|
||||
else if( m_sTitle.Find("<SSR DOUBLE>") >0 ) new_steps.sDescription = "SSR DOUBLE";
|
||||
else if( m_sTitle.Find("<COUPLE>") >0 ) new_steps.sDescription = "COUPLE";
|
||||
else if( m_sTitle.Find("<BATTLE>") >0 ) new_steps.sDescription = "BATTLE";
|
||||
else new_steps.sDescription = "UNKNOWN";
|
||||
|
||||
if( new_steps.sDescription.Find("COUPLE") >0 ) new_steps.type = st_couple;
|
||||
else if( new_steps.sDescription.Find("BATTLE") >0 ) new_steps.type = st_couple;
|
||||
else if( new_steps.sDescription.Find("DOUBLE") >0 ) new_steps.type = st_double;
|
||||
else new_steps.type = st_single;
|
||||
|
||||
arraySteps.Add( new_steps );
|
||||
|
||||
// strip steps type out of description
|
||||
m_sTitle.Replace( " <" + new_steps.sDescription + ">", "" );
|
||||
|
||||
FillEmptyValuesWithDefaults();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
BOOL Song::LoadFromMSDFile( CString sPath )
|
||||
{
|
||||
RageLog( "Song::LoadFromMSDFile(%s)", sPath );
|
||||
|
||||
|
||||
// BROKEN
|
||||
/*
|
||||
CStdioFile file;
|
||||
if( !file.Open( GetSongFilePath(), CFile::modeRead ) )
|
||||
RageError( ssprintf("Error opening Song file '%s'.", GetSongFilePath()) );
|
||||
|
||||
// read the whole file into a sFileText
|
||||
CString sFileText;
|
||||
CString buffer;
|
||||
while( file.ReadString(buffer) )
|
||||
sFileText += buffer;
|
||||
file.Close();
|
||||
|
||||
// split sFileText into strings containing each value expression
|
||||
CStringArray arrayValueStrings;
|
||||
split( sFileText, ";", arrayValueStrings );
|
||||
|
||||
|
||||
// for each value expression string, parse it into a value name and data
|
||||
for( int i=0; i < arrayValueStrings.GetSize(); i++ )
|
||||
{
|
||||
CString sValueString = arrayValueStrings[i];
|
||||
|
||||
// split the value string into tokens
|
||||
CStringArray arrayValueTokens;
|
||||
split( sValueString, ":", arrayValueTokens );
|
||||
|
||||
CString sValueName = arrayValueTokens.GetAt( 0 );
|
||||
|
||||
// handle the data
|
||||
if( sValueName == "#TITLE" )
|
||||
m_sTitle = arrayValueTokens[1];
|
||||
|
||||
else if( sValueName == "#ARTIST" )
|
||||
m_sArtist = arrayValueTokens[1];
|
||||
|
||||
else if( sValueName == "#REMIXER" || sValueName == "#MSD")
|
||||
m_sCreator = arrayValueTokens[1];
|
||||
|
||||
else if( sValueName == "#BPM" )
|
||||
m_fBPM = (FLOAT)atof( arrayValueTokens[1] );
|
||||
|
||||
else if( sValueName == "#OFFSET" )
|
||||
m_fBeatOffset = (FLOAT)atoi( arrayValueTokens[1] );
|
||||
|
||||
else if( sValueName == "#GAP" )
|
||||
// the units of GAP is 1/10 second
|
||||
m_fBeatOffset = (FLOAT)atof( arrayValueTokens[1] ) / 10.0f;
|
||||
|
||||
else if( sValueName == "#MUSIC" )
|
||||
m_sMusic = arrayValueTokens[1];
|
||||
|
||||
else if( sValueName == "#SAMPLE" )
|
||||
m_sSample = arrayValueTokens[1];
|
||||
|
||||
else if( sValueName == "#BANNER" )
|
||||
m_sBanner = arrayValueTokens[1];
|
||||
|
||||
else if( sValueName == "#BACKGROUND" )
|
||||
m_sBackground = arrayValueTokens[1];
|
||||
|
||||
// handle STEPS defined in the file for backwards compatibility with MSD files
|
||||
else if( sValueName == "#SINGLE" || sValueName == "#DOUBLE" || sValueName == "#COUPLE" )
|
||||
{
|
||||
Steps s;
|
||||
if( sValueName == "#SINGLE" )
|
||||
s.type = st_single;
|
||||
else if( sValueName == "#DOUBLE" )
|
||||
s.type = st_double;
|
||||
else if( sValueName == "#COUPLE" )
|
||||
s.type = st_couple;
|
||||
else
|
||||
RageError( ssprintf("Unknown game type '%s' in '%s'", sValueName, GetSongFilePath()) );
|
||||
|
||||
s.sDescription = arrayValueTokens[1];
|
||||
s.iDifficulty = atoi( arrayValueTokens[2] );
|
||||
s.sPadDataLeft = arrayValueTokens[3];
|
||||
if( sValueName == "#DOUBLE" || sValueName == "#COUPLE" )
|
||||
s.sPadDataRight = arrayValueTokens[4];
|
||||
|
||||
switch( s.type)
|
||||
{
|
||||
case st_single:
|
||||
arraySingleSteps.Add( s );
|
||||
break;
|
||||
case st_double:
|
||||
arrayDoubleSteps.Add( s );
|
||||
break;
|
||||
case st_couple:
|
||||
arrayCoupleSteps.Add( s );
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
// do nothing. We don't care about this value name
|
||||
;
|
||||
}
|
||||
|
||||
FillEmptyValuesWithDefaults();
|
||||
*/
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
void Song::FillEmptyValuesWithDefaults()
|
||||
{
|
||||
if( m_sTitle == "" ) m_sTitle = "Untitled song";
|
||||
if( m_sArtist == "" ) m_sArtist = "Unknown artist";
|
||||
if( m_sCreator == "" ) m_sCreator = "";
|
||||
if( m_fBPM == 0.0 )
|
||||
RageError( ssprintf("No #BPM specified in '%s.'", GetSongFilePath()) );
|
||||
|
||||
if( m_fBeatOffset == 0.0 )
|
||||
RageLog( "Warning: #OFFSET or #GAP in '%s' is either 0.0, or was missing.", GetSongFilePath() );
|
||||
|
||||
if( m_sMusic == "" )
|
||||
{
|
||||
m_sMusic = "music.mp3";
|
||||
if( !DoesFileExist( m_sSongDir + m_sMusic ) )
|
||||
{
|
||||
// music.mp3 didn't exist, so search for any mp3 in the same dir
|
||||
CStringArray arrayMP3Files;
|
||||
GetDirListing( m_sSongDir + CString("*.mp3"), arrayMP3Files );
|
||||
|
||||
if( arrayMP3Files.GetSize() != 0 ) // we found a .mp3 file!
|
||||
m_sMusic = arrayMP3Files.GetAt( 0 );
|
||||
else
|
||||
RageError( ssprintf("Music could not be found. In Song file '%s' no #MUSIC was specified, music.mp3 doesn't exist, and no other MP3s could be found.", GetSongFilePath()) );
|
||||
}
|
||||
}
|
||||
if( m_sSample == "" )
|
||||
{
|
||||
m_sSample = "sample.mp3";
|
||||
if( !DoesFileExist( m_sSongDir + m_sSample ) )
|
||||
m_sSample = m_sMusic; // we assured above that the m_sMusic file exists
|
||||
}
|
||||
if( m_sBanner == "" )
|
||||
{
|
||||
m_sBanner = "banner.bmp";
|
||||
if( !DoesFileExist( m_sSongDir + m_sBanner ) )
|
||||
{
|
||||
m_sBanner = "banner.png";
|
||||
if( !DoesFileExist( m_sSongDir + m_sBanner ) )
|
||||
{
|
||||
// couldn't find a true banner, so search for any bmp in the same dir
|
||||
CStringArray arrayBMPFiles;
|
||||
GetDirListing( m_sSongDir + CString("*.bmp"), arrayBMPFiles );
|
||||
|
||||
if( arrayBMPFiles.GetSize() != 0 ) // we found a .bmp file!
|
||||
m_sBanner = arrayBMPFiles.GetAt( 0 );
|
||||
else
|
||||
RageError( ssprintf("Banner could not be found. In Song file '%s' no #BANNER was specified, banner.bmp doesn't exist, and no other BMPs could be found.", GetSongFilePath()) );
|
||||
}
|
||||
}
|
||||
}
|
||||
if( m_sBackground == "" )
|
||||
{
|
||||
m_sBackground = "background.bmp";
|
||||
if( !DoesFileExist( m_sSongDir + m_sBackground ) )
|
||||
m_sBackground = m_sBanner; // we assured above that the m_sBanner file exists
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,376 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Sprite.cpp
|
||||
//
|
||||
// Desc: A bitmap actor that animates and moves around.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "Sprite.h"
|
||||
#include "RageTextureManager.h"
|
||||
#include "IniFile.h"
|
||||
#include <assert.h>
|
||||
#include <math.h>
|
||||
|
||||
|
||||
Sprite::Sprite()
|
||||
{
|
||||
Init();
|
||||
}
|
||||
|
||||
void Sprite::Init()
|
||||
{
|
||||
Actor::Init();
|
||||
|
||||
m_pTexture = NULL;
|
||||
m_uNumStates = 0;
|
||||
m_uCurState = 0;
|
||||
m_bIsAnimating = TRUE;
|
||||
m_fSecsIntoState = 0.0;
|
||||
m_bUsingCustomSrcRect = FALSE ;
|
||||
m_Effect = no_effect ;
|
||||
m_fPercentBetweenColors = 0.0f ;
|
||||
m_bTweeningTowardEndColor = TRUE ;
|
||||
m_fDeltaPercentPerSecond = 1.0 ;
|
||||
m_fWagRadians = 0.2f ;
|
||||
m_fWagPeriod = 2.0f ;
|
||||
m_fWagTimer = 0.0f ;
|
||||
m_fSpinSpeed = 2.0f ;
|
||||
m_fVibrationDistance = 5.0f ;
|
||||
m_bVisibleThisFrame = FALSE;
|
||||
m_bBlendAdd = FALSE;
|
||||
}
|
||||
|
||||
Sprite::~Sprite()
|
||||
{
|
||||
// RageLog( "Sprite Destructor" );
|
||||
|
||||
TM->UnloadTexture( m_sTexturePath );
|
||||
}
|
||||
|
||||
|
||||
BOOL Sprite::LoadFromTexture( CString sTexturePath )
|
||||
{
|
||||
RageLog( ssprintf("Sprite::LoadFromTexture(%s)", sTexturePath) );
|
||||
|
||||
Init();
|
||||
return LoadTexture( sTexturePath );
|
||||
}
|
||||
|
||||
// Sprite file has the format:
|
||||
//
|
||||
// [Sprite]
|
||||
// Texture=Textures\Logo 1x1.bmp
|
||||
// Frame0000=0
|
||||
// Delay0000=1.0
|
||||
// Frame0001=3
|
||||
// Delay0000=2.0
|
||||
BOOL Sprite::LoadFromSpriteFile( CString sSpritePath )
|
||||
{
|
||||
RageLog( ssprintf("Sprite::LoadFromSpriteFile(%s)", sSpritePath) );
|
||||
|
||||
Init();
|
||||
|
||||
m_sSpritePath = sSpritePath;
|
||||
|
||||
// read sprite file
|
||||
IniFile ini;
|
||||
ini.SetPath( m_sSpritePath );
|
||||
if( !ini.ReadFile() )
|
||||
RageError( ssprintf("Error opening Sprite file '%s'.", m_sSpritePath) );
|
||||
|
||||
CString sTexturePath = ini.GetValue( "Sprite", "Texture" );
|
||||
if( sTexturePath == "" )
|
||||
RageError( ssprintf("Error reading value 'Texture' from %s.", m_sSpritePath) );
|
||||
|
||||
// Load the texture
|
||||
if( !LoadTexture( sTexturePath ) )
|
||||
return FALSE;
|
||||
|
||||
|
||||
// Read in frames and delays from the sprite file,
|
||||
// overwriting the states that LoadFromTexture created.
|
||||
for( UINT i=0; i<MAX_SPRITE_STATES; i++ )
|
||||
{
|
||||
CString sStateNo;
|
||||
sStateNo.Format( "%u%u%u%u", (i%10000)/1000, (i%1000)/100, (i%100)/10, (i%10) ); // four digit state no
|
||||
|
||||
CString sFrameKey( CString("Frame") + sStateNo );
|
||||
CString sDelayKey( CString("Delay") + sStateNo );
|
||||
|
||||
m_uFrame[i] = ini.GetValueI( "Sprite", sFrameKey );
|
||||
if( m_uFrame[i] >= m_pTexture->GetNumFrames() )
|
||||
RageError( ssprintf("In '%s', %s is %d, but the texture %s only has %d frames.",
|
||||
m_sSpritePath, sFrameKey, m_uFrame[i], sTexturePath, m_pTexture->GetNumFrames()) );
|
||||
m_fDelay[i] = (float)ini.GetValueF( "Sprite", sDelayKey );
|
||||
|
||||
if( m_uFrame[i] == 0 && m_fDelay[i] > -0.00001f && m_fDelay[i] < 0.00001f ) // both values are empty
|
||||
break;
|
||||
|
||||
m_uNumStates = i+1;
|
||||
}
|
||||
|
||||
if( m_uNumStates == 0 )
|
||||
RageError( ssprintf("Failed to find at least one state in %s.", m_sSpritePath) );
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL Sprite::LoadTexture( CString sTexturePath )
|
||||
{
|
||||
if( m_sTexturePath != "" ) // If there was a previous bitmap...
|
||||
TM->UnloadTexture( m_sTexturePath ); // Unload it.
|
||||
|
||||
|
||||
m_sTexturePath = sTexturePath;
|
||||
|
||||
m_pTexture = TM->LoadTexture( m_sTexturePath );
|
||||
assert( m_pTexture != NULL );
|
||||
SetWidth( (FLOAT)m_pTexture->GetFrameWidth() );
|
||||
SetHeight( (FLOAT)m_pTexture->GetFrameHeight() );
|
||||
|
||||
// Assume the frames of this animation play in sequential order with 0.2 second delay.
|
||||
for( UINT i=0; i<m_pTexture->GetNumFrames(); i++ )
|
||||
{
|
||||
m_uFrame[i] = i;
|
||||
m_fDelay[i] = 0.1f;
|
||||
m_uNumStates = i+1;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
void Sprite::PrintDebugInfo()
|
||||
{
|
||||
// Actor::PrintDebugInfo();
|
||||
|
||||
RageLog( "Sprite::PrintDebugInfo()" );
|
||||
RageLog( "m_uNumStates: %u, m_uCurState: %u, m_fSecsIntoState: %f",
|
||||
m_uNumStates, m_uCurState, m_fSecsIntoState );
|
||||
}
|
||||
|
||||
|
||||
void Sprite::Update( const FLOAT &fDeltaTime )
|
||||
{
|
||||
//PrintDebugInfo();
|
||||
|
||||
Actor::Update( fDeltaTime ); // do tweening
|
||||
|
||||
|
||||
// update animation
|
||||
if( m_bIsAnimating )
|
||||
{
|
||||
m_fSecsIntoState += fDeltaTime;
|
||||
|
||||
if( m_fSecsIntoState > m_fDelay[m_uCurState] ) // it's time to switch frames
|
||||
{
|
||||
// increment frame and reset the counter
|
||||
m_fSecsIntoState -= m_fDelay[m_uCurState]; // leave the left over time for the next frame
|
||||
m_uCurState ++;
|
||||
if( m_uCurState >= m_uNumStates )
|
||||
m_uCurState = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// update SpriteEffect
|
||||
switch( m_Effect )
|
||||
{
|
||||
case no_effect:
|
||||
break;
|
||||
case blinking:
|
||||
case camelion:
|
||||
case glowing:
|
||||
if( m_bTweeningTowardEndColor ) {
|
||||
m_fPercentBetweenColors += m_fDeltaPercentPerSecond * fDeltaTime;
|
||||
if( m_fPercentBetweenColors > 1.0f ) {
|
||||
m_fPercentBetweenColors = 1.0f;
|
||||
m_bTweeningTowardEndColor = FALSE;
|
||||
}
|
||||
}
|
||||
else { // !m_bTweeningTowardEndColor
|
||||
m_fPercentBetweenColors -= m_fDeltaPercentPerSecond * fDeltaTime;
|
||||
if( m_fPercentBetweenColors < 0.0f ) {
|
||||
m_fPercentBetweenColors = 0.0f;
|
||||
m_bTweeningTowardEndColor = TRUE;
|
||||
}
|
||||
}
|
||||
case wagging:
|
||||
m_fWagTimer += fDeltaTime;
|
||||
if( m_fWagTimer > m_fWagPeriod )
|
||||
m_fWagTimer -= m_fWagPeriod;
|
||||
break;
|
||||
case spinning:
|
||||
FLOAT rotation;
|
||||
rotation = GetRotation();
|
||||
rotation += m_fSpinSpeed * fDeltaTime;
|
||||
if( rotation > 2.0f * D3DX_PI )
|
||||
rotation -= 2.0f * D3DX_PI;
|
||||
else if( rotation < 0.0f )
|
||||
rotation += 2.0f * D3DX_PI;
|
||||
SetRotation( rotation );
|
||||
break;
|
||||
case vibrating:
|
||||
break;
|
||||
case flickering:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
void Sprite::Draw()
|
||||
{
|
||||
if( m_pTexture == NULL )
|
||||
return;
|
||||
|
||||
UINT uFrameNo = m_uFrame[m_uCurState];
|
||||
|
||||
LPRECT pRectSrc;
|
||||
if( m_bUsingCustomSrcRect )
|
||||
pRectSrc = &m_rectCustomSrcRect;
|
||||
else
|
||||
pRectSrc = m_pTexture->GetFrameRect( uFrameNo );
|
||||
|
||||
//::SetRect( &rectSrc, 0, 0, m_pTexture->GetImageWidth(), m_pTexture->GetImageHeight() );
|
||||
|
||||
D3DXVECTOR2 scaling;
|
||||
scaling.x = GetZoom();
|
||||
scaling.y = GetZoom();
|
||||
|
||||
D3DXVECTOR2 translation;
|
||||
translation.x = (float)GetLeftEdge();
|
||||
translation.y = (float)GetTopEdge();
|
||||
|
||||
D3DXVECTOR3 rotation = m_rotation;
|
||||
|
||||
D3DXVECTOR2 rot_center;
|
||||
rot_center.x = GetZoomedWidth()/2.0f;
|
||||
rot_center.y = GetZoomedHeight()/2.0f;
|
||||
|
||||
D3DXCOLOR color = m_color;
|
||||
|
||||
|
||||
// update SpriteEffect
|
||||
switch( m_Effect )
|
||||
{
|
||||
case no_effect:
|
||||
break;
|
||||
case blinking:
|
||||
color = m_bTweeningTowardEndColor ? m_start_color : m_end_color;
|
||||
break;
|
||||
case camelion:
|
||||
case glowing:
|
||||
color = m_start_color*m_fPercentBetweenColors + m_end_color*(1.0f-m_fPercentBetweenColors);
|
||||
break;
|
||||
case wagging:
|
||||
rotation.z = m_fWagRadians * (FLOAT)sin(
|
||||
(m_fWagTimer / m_fWagPeriod) // percent through wag
|
||||
* 2.0 * D3DX_PI );
|
||||
break;
|
||||
case spinning:
|
||||
// nothing special needed
|
||||
break;
|
||||
case vibrating:
|
||||
translation.x += m_fVibrationDistance * randomf(-1.0f, 1.0f) * GetZoom();
|
||||
translation.y += m_fVibrationDistance * randomf(-1.0f, 1.0f) * GetZoom();
|
||||
break;
|
||||
case flickering:
|
||||
m_bVisibleThisFrame = !m_bVisibleThisFrame;
|
||||
if( m_bVisibleThisFrame )
|
||||
return; // don't draw the frame
|
||||
break;
|
||||
}
|
||||
|
||||
SCREEN->DrawQuad( m_pTexture,
|
||||
pRectSrc,
|
||||
&scaling, // scaling
|
||||
&rot_center, // rotation center
|
||||
&rotation, // rotation
|
||||
&translation, // translation
|
||||
color,
|
||||
m_Effect == glowing ? op_add : op_modulate,
|
||||
m_bBlendAdd );
|
||||
|
||||
}
|
||||
|
||||
|
||||
void Sprite::SetState( UINT uNewState )
|
||||
{
|
||||
ASSERT( uNewState >= 0 && uNewState < m_uNumStates );
|
||||
m_uCurState = uNewState;
|
||||
m_fSecsIntoState = 0.0;
|
||||
}
|
||||
|
||||
void Sprite::SetCustomSrcRect( RECT newRect )
|
||||
{
|
||||
m_bUsingCustomSrcRect = TRUE;
|
||||
m_rectCustomSrcRect = newRect;
|
||||
|
||||
SetWidth( (FLOAT) RECTWIDTH(newRect) );
|
||||
SetHeight( (FLOAT) RECTHEIGHT(newRect) );
|
||||
|
||||
};
|
||||
|
||||
VOID Sprite::SetEffectNone()
|
||||
{
|
||||
m_Effect = no_effect;
|
||||
//m_color = D3DXCOLOR( 1.0,1.0,1.0,1.0 );
|
||||
}
|
||||
|
||||
VOID Sprite::SetEffectBlinking( FLOAT fDeltaPercentPerSecond, D3DXCOLOR Color, D3DXCOLOR Color2 )
|
||||
{
|
||||
m_Effect = blinking;
|
||||
m_start_color = Color;
|
||||
m_end_color = Color2;
|
||||
//m_fPercentBetweenColors = 0.0;
|
||||
//m_bTweeningTowardEndColor = TRUE;
|
||||
m_fDeltaPercentPerSecond = fDeltaPercentPerSecond;
|
||||
}
|
||||
|
||||
VOID Sprite::SetEffectCamelion( FLOAT fDeltaPercentPerSecond, D3DXCOLOR Color, D3DXCOLOR Color2 )
|
||||
{
|
||||
m_Effect = camelion;
|
||||
m_start_color = Color;
|
||||
m_end_color = Color2;
|
||||
//m_fPercentBetweenColors = 0.0;
|
||||
//m_bTweeningTowardEndColor = TRUE;
|
||||
m_fDeltaPercentPerSecond = fDeltaPercentPerSecond;
|
||||
}
|
||||
|
||||
VOID Sprite::SetEffectGlowing( FLOAT fDeltaPercentPerSecond, D3DXCOLOR Color, D3DXCOLOR Color2 )
|
||||
{
|
||||
m_Effect = glowing;
|
||||
m_start_color = Color;
|
||||
m_end_color = Color2;
|
||||
//m_fPercentBetweenColors = 0.0;
|
||||
//m_bTweeningTowardEndColor = TRUE;
|
||||
m_fDeltaPercentPerSecond = fDeltaPercentPerSecond;
|
||||
}
|
||||
|
||||
VOID Sprite::SetEffectWagging( FLOAT fWagRadians, FLOAT fWagPeriod )
|
||||
{
|
||||
m_Effect = wagging;
|
||||
m_fWagRadians = fWagRadians;
|
||||
m_fWagPeriod = fWagPeriod;
|
||||
}
|
||||
|
||||
VOID Sprite::SetEffectSpinning( FLOAT fSpinSpeed /*radians per second*/ )
|
||||
{
|
||||
m_Effect = spinning;
|
||||
m_fSpinSpeed = fSpinSpeed;
|
||||
}
|
||||
|
||||
VOID Sprite::SetEffectVibrating( FLOAT fVibrationDistance )
|
||||
{
|
||||
m_Effect = vibrating;
|
||||
m_fVibrationDistance = fVibrationDistance;
|
||||
}
|
||||
|
||||
VOID Sprite::SetEffectFlickering()
|
||||
{
|
||||
m_Effect = flickering;
|
||||
}
|
||||
@@ -0,0 +1,122 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Sprite.h
|
||||
//
|
||||
// Desc: A bitmap Actor that animates and moves around.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _SPRITE_H_
|
||||
#define _SPRITE_H_
|
||||
|
||||
|
||||
#include "Actor.h"
|
||||
#include "RageUtil.h"
|
||||
#include "RageTexture.h"
|
||||
|
||||
|
||||
|
||||
#define MAX_SPRITE_STATES 256
|
||||
|
||||
|
||||
|
||||
class Sprite: public Actor
|
||||
{
|
||||
public:
|
||||
Sprite();
|
||||
virtual ~Sprite();
|
||||
|
||||
|
||||
enum SpriteEffect { no_effect,
|
||||
blinking, camelion, glowing,
|
||||
wagging, spinning,
|
||||
vibrating, flickering
|
||||
};
|
||||
|
||||
|
||||
BOOL LoadFromTexture( CString sTexturePath );
|
||||
BOOL LoadFromSpriteFile( CString sSpritePath );
|
||||
|
||||
VOID PrintDebugInfo();
|
||||
|
||||
virtual void Draw();
|
||||
virtual void Update( const FLOAT &fDeltaTime );
|
||||
|
||||
void StartAnimating() { m_bIsAnimating = TRUE; };
|
||||
void StopAnimating() { m_bIsAnimating = FALSE; };
|
||||
void SetState( UINT uNewState );
|
||||
|
||||
UINT GetNumStates() { return m_uNumStates; };
|
||||
CString GetTexturePath() { return m_sTexturePath; };
|
||||
|
||||
|
||||
VOID SetCustomSrcRect( RECT newRect ); // for cropping or flipping
|
||||
|
||||
|
||||
VOID SetEffectNone();
|
||||
VOID SetEffectBlinking( FLOAT fDeltaPercentPerSecond = 2.5,
|
||||
D3DXCOLOR Color = D3DXCOLOR(0.5f,0.5f,0.5f,1),
|
||||
D3DXCOLOR Color2 = D3DXCOLOR(1,1,1,1) );
|
||||
VOID SetEffectCamelion( FLOAT fDeltaPercentPerSecond = 2.5,
|
||||
D3DXCOLOR Color = D3DXCOLOR(0,0,0,1),
|
||||
D3DXCOLOR Color2 = D3DXCOLOR(1,1,1,1) );
|
||||
VOID SetEffectGlowing( FLOAT fDeltaPercentPerSecond = 2.5,
|
||||
D3DXCOLOR Color = D3DXCOLOR(0.4f,0.4f,0.4f,0),
|
||||
D3DXCOLOR Color2 = D3DXCOLOR(1.0f,1.0f,1.0f,0) );
|
||||
VOID SetEffectWagging( FLOAT fWagRadians = 0.2,
|
||||
FLOAT fWagPeriod = 2.0 );
|
||||
VOID SetEffectSpinning( FLOAT fRadsPerSpeed = 2.0 );
|
||||
VOID SetEffectVibrating( FLOAT fVibrationDistance = 5.0 );
|
||||
VOID SetEffectFlickering();
|
||||
SpriteEffect GetEffect() { return m_Effect; };
|
||||
|
||||
VOID SetBlendMode( BOOL bBlendAdd ) { m_bBlendAdd = bBlendAdd; };
|
||||
|
||||
protected:
|
||||
void Init();
|
||||
|
||||
BOOL LoadTexture( CString sTexture );
|
||||
|
||||
CString m_sSpritePath;
|
||||
LPRageTexture m_pTexture;
|
||||
CString m_sTexturePath;
|
||||
|
||||
UINT m_uFrame[MAX_SPRITE_STATES]; // array of indicies into m_rectBitmapFrames
|
||||
FLOAT m_fDelay[MAX_SPRITE_STATES];
|
||||
UINT m_uNumStates;
|
||||
UINT m_uCurState;
|
||||
BOOL m_bIsAnimating;
|
||||
FLOAT m_fSecsIntoState; // number of seconds that have elapsed since we switched to this frame
|
||||
|
||||
BOOL m_bBlendAdd;
|
||||
|
||||
BOOL m_bUsingCustomSrcRect;
|
||||
RECT m_rectCustomSrcRect;
|
||||
|
||||
SpriteEffect m_Effect;
|
||||
|
||||
// Counting variables for sprite effects:
|
||||
// camelion and glowing:
|
||||
// D3DXCOLOR m_Color2;
|
||||
FLOAT m_fPercentBetweenColors;
|
||||
BOOL m_bTweeningTowardEndColor; // TRUE is fading toward end_color, FALSE if fading toward start_color
|
||||
FLOAT m_fDeltaPercentPerSecond; // percentage change in tweening per second
|
||||
|
||||
// wagging:
|
||||
FLOAT m_fWagRadians;
|
||||
FLOAT m_fWagPeriod; // seconds to complete a wag (back and forth)
|
||||
FLOAT m_fWagTimer; // num of seconds into this wag
|
||||
|
||||
// spinning:
|
||||
FLOAT m_fSpinSpeed; // radians per second
|
||||
|
||||
// vibrating:
|
||||
FLOAT m_fVibrationDistance;
|
||||
|
||||
// flickering:
|
||||
BOOL m_bVisibleThisFrame;
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,6 @@
|
||||
// stdafx.cpp : source file that includes just the standard includes
|
||||
// Basic.pch will be the pre-compiled header
|
||||
// stdafx.obj will contain the pre-compiled type information
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
// stdafx.h : include file for standard system include files,
|
||||
// or project specific include files that are used frequently, but
|
||||
// are changed infrequently
|
||||
//
|
||||
|
||||
#if !defined(AFX_STDAFX_H__9FF379EB_FAE2_11D1_BFC5_D41F722B624A__INCLUDED_)
|
||||
#define AFX_STDAFX_H__9FF379EB_FAE2_11D1_BFC5_D41F722B624A__INCLUDED_
|
||||
|
||||
#if _MSC_VER >= 1000
|
||||
#pragma once
|
||||
#endif // _MSC_VER >= 1000
|
||||
|
||||
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
|
||||
|
||||
#include <afxwin.h> // MFC core and standard components
|
||||
#include <afxext.h> // MFC extensions
|
||||
#include <afxtempl.h> // MFC templated collections
|
||||
#ifndef _AFX_NO_AFXCMN_SUPPORT
|
||||
#include <afxcmn.h> // MFC support for Windows Common Controls
|
||||
#endif // _AFX_NO_AFXCMN_SUPPORT
|
||||
|
||||
|
||||
//{{AFX_INSERT_LOCATION}}
|
||||
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
|
||||
|
||||
#endif // !defined(AFX_STDAFX_H__9FF379EB_FAE2_11D1_BFC5_D41F722B624A__INCLUDED_)
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 5.9 KiB |
@@ -0,0 +1,133 @@
|
||||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Accelerator
|
||||
//
|
||||
|
||||
IDR_MAIN_ACCEL ACCELERATORS DISCARDABLE
|
||||
BEGIN
|
||||
"P", IDM_PADS, VIRTKEY, CONTROL, NOINVERT
|
||||
VK_ESCAPE, IDM_WINDOWED, VIRTKEY, NOINVERT
|
||||
VK_F4, IDM_TOGGLEFULLSCREEN, VIRTKEY, NOINVERT
|
||||
VK_RETURN, IDM_TOGGLEFULLSCREEN, VIRTKEY, ALT, NOINVERT
|
||||
"X", IDM_EXIT, VIRTKEY, ALT, NOINVERT
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Icon
|
||||
//
|
||||
|
||||
// Icon with lowest ID value placed first to ensure application icon
|
||||
// remains consistent on all systems.
|
||||
IDI_ICON ICON DISCARDABLE "StepMania.ICO"
|
||||
|
||||
#ifndef _MAC
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Version
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,0,0,1
|
||||
PRODUCTVERSION 1,0,0,1
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
#else
|
||||
FILEFLAGS 0x0L
|
||||
#endif
|
||||
FILEOS 0x40004L
|
||||
FILETYPE 0x1L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
BEGIN
|
||||
BLOCK "040904b0"
|
||||
BEGIN
|
||||
VALUE "Comments", "\0"
|
||||
VALUE "CompanyName", "Chris Danford\0"
|
||||
VALUE "FileDescription", "StepMania\0"
|
||||
VALUE "FileVersion", "1, 0, 0, 1\0"
|
||||
VALUE "InternalName", "StepMania\0"
|
||||
VALUE "LegalCopyright", "Copyright © 2001\0"
|
||||
VALUE "LegalTrademarks", "\0"
|
||||
VALUE "OriginalFilename", "StepMania.exe\0"
|
||||
VALUE "PrivateBuild", "\0"
|
||||
VALUE "ProductName", " StepMania\0"
|
||||
VALUE "ProductVersion", "1, 0, 0, 1\0"
|
||||
VALUE "SpecialBuild", "\0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
BEGIN
|
||||
VALUE "Translation", 0x409, 1200
|
||||
END
|
||||
END
|
||||
|
||||
#endif // !_MAC
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
||||
@@ -0,0 +1,477 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: StepMania.cpp
|
||||
//
|
||||
// Desc:
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Includes
|
||||
//-----------------------------------------------------------------------------
|
||||
#include "resource.h"
|
||||
|
||||
#include "RageScreen.h"
|
||||
#include "RageTextureManager.h"
|
||||
#include "RageSound.h"
|
||||
#include "RageMusic.h"
|
||||
#include "RageInput.h"
|
||||
|
||||
#include "GameOptions.h"
|
||||
#include "WindowManager.h"
|
||||
|
||||
#include "WindowIntroCovers.h"
|
||||
|
||||
#include <DXUtil.h>
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Links
|
||||
//-----------------------------------------------------------------------------
|
||||
#pragma comment(lib, "d3dx8.lib")
|
||||
#pragma comment(lib, "d3d8.lib")
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Application globals
|
||||
//-----------------------------------------------------------------------------
|
||||
const CString g_sAppName = "StepMania";
|
||||
const CString g_sAppClassName = "StepMania Class";
|
||||
|
||||
|
||||
HWND g_hWndMain; // Main Window Handle
|
||||
HINSTANCE g_hInstance; // The Handle to Window Instance
|
||||
|
||||
const DWORD g_dwScreenWidth = 640; // The window width
|
||||
const DWORD g_dwScreenHeight = 480; // The window height
|
||||
|
||||
|
||||
const DWORD g_dwWindowStyle = WS_VISIBLE|WS_POPUP|WS_CAPTION|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU;
|
||||
|
||||
|
||||
BOOL g_bFullscreen = FALSE; // Whether app is fullscreen (or windowed)
|
||||
BOOL g_bIsActive = FALSE; // Whether the focus is on our app
|
||||
|
||||
|
||||
//LPRageMovieTexture g_pMovieTexture = NULL;
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Function prototypes
|
||||
//-----------------------------------------------------------------------------
|
||||
// Main game functions
|
||||
LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
|
||||
|
||||
void Update(); // Update the game logic
|
||||
void Render(); // Render a frame
|
||||
void ShowFrame(); // Display the contents of the back buffer to the screen
|
||||
void SetFullscreen( BOOL bFullscreen ); // Switch between fullscreen and windowed modes.
|
||||
|
||||
|
||||
// Functions that work with game objects
|
||||
HRESULT CreateObjects( HWND hWnd ); // allocate and initialize game objects
|
||||
HRESULT InvalidateObjects(); // invalidate game objects before a display mode change
|
||||
HRESULT RestoreObjects(); // restore game objects after a display mode change
|
||||
VOID DestroyObjects(); // deallocate game objects when we're done with them
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: WinMain()
|
||||
// Desc: Application entry point
|
||||
//-----------------------------------------------------------------------------
|
||||
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow )
|
||||
{
|
||||
CoInitialize (NULL); // Initialize COM
|
||||
|
||||
// Register the window class
|
||||
WNDCLASS wndClass = {
|
||||
0,
|
||||
WndProc, // callback handler
|
||||
0, // cbClsExtra;
|
||||
0, // cbWndExtra;
|
||||
hInstance,
|
||||
LoadIcon( hInstance, MAKEINTRESOURCE(IDI_ICON) ),
|
||||
LoadCursor( hInstance, IDC_ARROW),
|
||||
(HBRUSH)GetStockObject( BLACK_BRUSH ),
|
||||
NULL, // lpszMenuName;
|
||||
g_sAppClassName // lpszClassName;
|
||||
};
|
||||
RegisterClass( &wndClass );
|
||||
|
||||
|
||||
// Set the window's initial width
|
||||
RECT rcWnd;
|
||||
SetRect( &rcWnd, 0, 0, g_dwScreenWidth, g_dwScreenHeight );
|
||||
AdjustWindowRect( &rcWnd, g_dwWindowStyle, FALSE );
|
||||
|
||||
|
||||
// Create our main window
|
||||
g_hWndMain = CreateWindow(
|
||||
g_sAppClassName,// pointer to registered class name
|
||||
g_sAppName, // pointer to window name
|
||||
g_dwWindowStyle, // window style
|
||||
CW_USEDEFAULT, // horizontal position of window
|
||||
CW_USEDEFAULT, // vertical position of window
|
||||
RECTWIDTH(rcWnd), // window width
|
||||
RECTHEIGHT(rcWnd),// window height
|
||||
NULL, // handle to parent or owner window
|
||||
NULL, // handle to menu, or child-window identifier
|
||||
hInstance, // handle to application instance
|
||||
NULL // pointer to window-creation data
|
||||
);
|
||||
if( NULL == g_hWndMain )
|
||||
exit(1);
|
||||
|
||||
|
||||
// Load keyboard accelerators
|
||||
HACCEL hAccel = LoadAccelerators( NULL, MAKEINTRESOURCE(IDR_MAIN_ACCEL) );
|
||||
|
||||
|
||||
// run the game
|
||||
CreateObjects( g_hWndMain ); // Create the game objects
|
||||
|
||||
// Now we're ready to recieve and process Windows messages.
|
||||
MSG msg;
|
||||
ZeroMemory( &msg, sizeof(msg) );
|
||||
|
||||
|
||||
while( WM_QUIT != msg.message )
|
||||
{
|
||||
// Look for messages, if none are found then
|
||||
// update the state and display it
|
||||
if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
|
||||
{
|
||||
GetMessage(&msg, NULL, 0, 0 );
|
||||
|
||||
// Translate and dispatch the message
|
||||
if( 0 == TranslateAccelerator( g_hWndMain, hAccel, &msg ) )
|
||||
{
|
||||
TranslateMessage( &msg );
|
||||
DispatchMessage( &msg );
|
||||
}
|
||||
}
|
||||
else // No messages are waiting. Render a frame during idle time.
|
||||
{
|
||||
Update();
|
||||
Render();
|
||||
ShowFrame();
|
||||
//if( !g_bFullscreen )
|
||||
::Sleep(16); // cap the frame rate to ~30 fps for now
|
||||
}
|
||||
} // end while( WM_QUIT != msg.message )
|
||||
|
||||
|
||||
// clean up after a normal exit
|
||||
DestroyObjects(); // deallocate our game objects and leave fullscreen
|
||||
DestroyWindow( g_hWndMain );
|
||||
UnregisterClass( g_sAppClassName, hInstance );
|
||||
CoUninitialize(); // Uninitialize COM
|
||||
return 0L;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: WndProc()
|
||||
// Desc: Callback for all Windows messages
|
||||
//-----------------------------------------------------------------------------
|
||||
LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
|
||||
{
|
||||
switch( msg )
|
||||
{
|
||||
case WM_ACTIVATEAPP:
|
||||
// Check to see if we are losing our window...
|
||||
g_bIsActive = (BOOL)wParam;
|
||||
break;
|
||||
|
||||
case WM_SIZE:
|
||||
// Check to see if we are losing our window...
|
||||
if( SIZE_MAXIMIZED == wParam)
|
||||
MessageBeep( MB_OK );
|
||||
else if( SIZE_MAXHIDE==wParam || SIZE_MINIMIZED==wParam )
|
||||
g_bIsActive = FALSE;
|
||||
else
|
||||
g_bIsActive = TRUE;
|
||||
break;
|
||||
|
||||
case WM_GETMINMAXINFO:
|
||||
{
|
||||
// don't allow the window to be resized smaller than the screen resolution
|
||||
RECT rcWnd;
|
||||
SetRect( &rcWnd, 0, 0, g_dwScreenWidth, g_dwScreenHeight );
|
||||
DWORD dwWindowStyle = GetWindowLong( g_hWndMain, GWL_STYLE );
|
||||
AdjustWindowRect( &rcWnd, dwWindowStyle, FALSE );
|
||||
|
||||
((MINMAXINFO*)lParam)->ptMinTrackSize.x = RECTWIDTH(rcWnd);
|
||||
((MINMAXINFO*)lParam)->ptMinTrackSize.y = RECTHEIGHT(rcWnd);
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_SETCURSOR:
|
||||
// Turn off Windows cursor in fullscreen mode
|
||||
if( g_bFullscreen )
|
||||
{
|
||||
SetCursor( NULL );
|
||||
return TRUE; // prevent Windows from setting the cursor
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_SYSCOMMAND:
|
||||
// Prevent moving/sizing and power loss
|
||||
switch( wParam )
|
||||
{
|
||||
case SC_MOVE:
|
||||
case SC_SIZE:
|
||||
case SC_KEYMENU:
|
||||
case SC_MONITORPOWER:
|
||||
return 1;
|
||||
case SC_MAXIMIZE:
|
||||
SendMessage( g_hWndMain, WM_COMMAND, IDM_TOGGLEFULLSCREEN, 0 );
|
||||
return 1;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case WM_COMMAND:
|
||||
switch( LOWORD(wParam) )
|
||||
{
|
||||
case IDM_TOGGLEFULLSCREEN:
|
||||
SetFullscreen( !g_bFullscreen );
|
||||
return 0;
|
||||
|
||||
case IDM_WINDOWED:
|
||||
SetFullscreen( FALSE );
|
||||
return 0;
|
||||
|
||||
case IDM_EXIT:
|
||||
// Recieved key/menu command to exit app
|
||||
SendMessage( hWnd, WM_CLOSE, 0, 0 );
|
||||
return 0;
|
||||
|
||||
case IDM_PADS:
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case WM_NCHITTEST:
|
||||
// Prevent the user from selecting the menu in fullscreen mode
|
||||
if( g_bFullscreen )
|
||||
return HTCLIENT;
|
||||
break;
|
||||
|
||||
case WM_PAINT:
|
||||
// redisplay the contents of the back buffer if the window needs to be redrawn
|
||||
ShowFrame();
|
||||
break;
|
||||
|
||||
case WM_DESTROY:
|
||||
PostQuitMessage( 0 );
|
||||
break;
|
||||
}
|
||||
|
||||
return DefWindowProc( hWnd, msg, wParam, lParam );
|
||||
}
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: CreateObjects()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
HRESULT CreateObjects( HWND hWnd )
|
||||
{
|
||||
SCREEN = new RageScreen( hWnd );
|
||||
TM = new RageTextureManager( SCREEN );
|
||||
SOUND = new RageSound( hWnd );
|
||||
MUSIC = new RageMusic;
|
||||
INPUT = new RageInput( hWnd );
|
||||
|
||||
GAMEOPTIONS = new GameOptions;
|
||||
WM = new WindowManager;
|
||||
|
||||
RageLogStart();
|
||||
|
||||
WM->SetNewWindow( new WindowIntroCovers );
|
||||
|
||||
srand( (unsigned)time(NULL) );
|
||||
// Start the accurate timer
|
||||
DXUtil_Timer( TIMER_START );
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: DestroyObjects()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
void DestroyObjects()
|
||||
{
|
||||
// Setup the app so it can support single-stepping
|
||||
DXUtil_Timer( TIMER_STOP );
|
||||
|
||||
SAFE_DELETE( WM );
|
||||
SAFE_DELETE( GAMEOPTIONS );
|
||||
|
||||
SAFE_DELETE( INPUT );
|
||||
SAFE_DELETE( MUSIC );
|
||||
SAFE_DELETE( SOUND );
|
||||
SAFE_DELETE( TM );
|
||||
SAFE_DELETE( SCREEN );
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: RestoreObjects()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
HRESULT RestoreObjects()
|
||||
{
|
||||
/////////////////////
|
||||
// Restore the window
|
||||
/////////////////////
|
||||
|
||||
// Set window size
|
||||
RECT rcWnd;
|
||||
if( g_bFullscreen )
|
||||
SetRect( &rcWnd, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN) );
|
||||
else // if( !g_bFullscreen )
|
||||
{
|
||||
SetRect( &rcWnd, 0, 0, g_dwScreenWidth, g_dwScreenHeight );
|
||||
AdjustWindowRect( &rcWnd, g_dwWindowStyle, FALSE );
|
||||
}
|
||||
|
||||
// Bring the window to the foreground
|
||||
SetWindowPos( g_hWndMain,
|
||||
HWND_NOTOPMOST,
|
||||
0,
|
||||
0,
|
||||
RECTWIDTH(rcWnd),
|
||||
RECTHEIGHT(rcWnd),
|
||||
0 );
|
||||
|
||||
|
||||
///////////////////////////
|
||||
// Restore all game objects
|
||||
///////////////////////////
|
||||
|
||||
SCREEN->Restore();
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: InvalidateObjects()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
HRESULT InvalidateObjects()
|
||||
{
|
||||
SCREEN->Invalidate();
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: Update()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
void Update()
|
||||
{
|
||||
FLOAT fDeltaTime = DXUtil_Timer( TIMER_GETELAPSEDTIME );
|
||||
|
||||
// This was a hack to fix timing issues with the old WindowSelectSong
|
||||
//
|
||||
//if( fDeltaTime > 0.050f ) // we dropped > 5 frames
|
||||
// fDeltaTime = 0.050f;
|
||||
|
||||
MUSIC->Update( fDeltaTime );
|
||||
|
||||
WM->Update( fDeltaTime );
|
||||
|
||||
|
||||
static RageRawInputList listRawInput;
|
||||
listRawInput.RemoveAll();
|
||||
INPUT->GetRawInput( listRawInput );
|
||||
|
||||
RageRawInput ri;
|
||||
PadInput pi;
|
||||
POSITION pos = listRawInput.GetHeadPosition();
|
||||
while( pos != NULL )
|
||||
{
|
||||
ri = listRawInput.GetNext( pos );
|
||||
pi = GAMEOPTIONS->RawToPad( ri );
|
||||
|
||||
WM->Input( ri, pi );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: Render()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
void Render()
|
||||
{
|
||||
HRESULT hr = SCREEN->BeginFrame();
|
||||
switch( hr )
|
||||
{
|
||||
case D3DERR_DEVICELOST:
|
||||
// The user probably alt-tabbed out of fullscreen.
|
||||
// Do not render a frame until we re-acquire the device
|
||||
break;
|
||||
case D3DERR_DEVICENOTRESET:
|
||||
InvalidateObjects();
|
||||
|
||||
// Resize the device
|
||||
if( SUCCEEDED( SCREEN->Reset() ) )
|
||||
{
|
||||
// Initialize the app's device-dependent objects
|
||||
RestoreObjects();
|
||||
return;
|
||||
}
|
||||
else
|
||||
RageError( "Failed to SCREEN->Reset()" );
|
||||
|
||||
break;
|
||||
case S_OK:
|
||||
// draw the game
|
||||
WM->Draw();
|
||||
|
||||
|
||||
SCREEN->EndFrame();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: ShowFrame()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
void ShowFrame()
|
||||
{
|
||||
// display the contents of the back buffer to the front
|
||||
if( SCREEN )
|
||||
SCREEN->ShowFrame();
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: SetFullscreen()
|
||||
// Desc:
|
||||
//-----------------------------------------------------------------------------
|
||||
void SetFullscreen( BOOL bFullscreen )
|
||||
{
|
||||
InvalidateObjects();
|
||||
g_bFullscreen = bFullscreen;
|
||||
SCREEN->SwitchDisplayModes( g_bFullscreen,
|
||||
g_dwScreenWidth,
|
||||
g_dwScreenHeight );
|
||||
RestoreObjects();
|
||||
}
|
||||
@@ -0,0 +1,531 @@
|
||||
# Microsoft Developer Studio Project File - Name="StepMania" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Application" 0x0101
|
||||
|
||||
CFG=StepMania - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "StepMania.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "StepMania.mak" CFG="StepMania - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "StepMania - Win32 Release" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "StepMania - Win32 Debug" (based on "Win32 (x86) Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "StepMania - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 1
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "../Release"
|
||||
# PROP Intermediate_Dir "../Release"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
|
||||
# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /FR /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
|
||||
# ADD LINK32 /nologo /subsystem:windows /machine:I386
|
||||
|
||||
!ELSEIF "$(CFG)" == "StepMania - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 1
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "../Debug"
|
||||
# PROP Intermediate_Dir "../Debug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /FR /YX /FD /GZ /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "StepMania - Win32 Release"
|
||||
# Name "StepMania - Win32 Debug"
|
||||
# Begin Group "Rage"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageBitmapTexture.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageBitmapTexture.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageInput.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageInput.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageMovieTexture.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageMovieTexture.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageMusic.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageMusic.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageScreen.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageScreen.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageSound.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageSound.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageTexture.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageTexture.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageTextureManager.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageTextureManager.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageUtil.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RageUtil.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Windows"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Window.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Window.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowConfigurePads.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowConfigurePads.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowDancing.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowDancing.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowIntroCovers.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowIntroCovers.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowManager.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowManager.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowResults.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowResults.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowSandbox.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowSandbox.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowSelectGameMode.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowSelectGameMode.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowSelectSong.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowSelectSong.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowSelectSteps.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowSelectSteps.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowTitleMenu.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\WindowTitleMenu.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Game Objects"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Actor.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Actor.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Background.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Background.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Banner.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Banner.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\BitmapText.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\BitmapText.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\BlurredTitle.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\BlurredTitle.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Button.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\button.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ColorArrows.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ColorArrows.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Combo.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Combo.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\FootBar.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\FootBar.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\GameOptions.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\GameOptions.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\GrayArrows.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\GrayArrows.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Judgement.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Judgement.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\LifeMeter.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\LifeMeter.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\PadInput.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Player.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Player.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\PreviewGraphic.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\previewgraphic.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Score.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Score.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Song.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\song.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\SoundSet.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\SoundSet.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Sprite.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Sprite.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Steps.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Steps.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "File Types"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\BmsFile.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\BmsFile.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\IniFile.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\IniFile.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "System"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\dxutil.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\resource.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\StdAfx.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\StdAfx.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\StepMania.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\StepMania.ICO
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\StepMania.RC
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Transitions"
|
||||
|
||||
# PROP Default_Filter ""
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Transition.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\Transition.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\TransitionFade.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\TransitionFade.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\TransitionFadeWipe.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\TransitionFadeWipe.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\TransitionRectWipe.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\TransitionRectWipe.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\TransitionStarburst.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\TransitionStarburst.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\TransitionStarWipe.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\TransitionStarWipe.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
||||
@@ -0,0 +1,29 @@
|
||||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "StepMania"=".\StepMania.dsp" - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Transition.cpp
|
||||
//
|
||||
// Desc: Abstract base class for all transitions
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "RageUtil.h"
|
||||
|
||||
#include "Transition.h"
|
||||
|
||||
#define SOUND_BACK "Sounds\\back.mp3"
|
||||
#define SOUND_NEXT "Sounds\\next.mp3"
|
||||
|
||||
|
||||
Transition::Transition() :
|
||||
m_TransitionState( closed ),
|
||||
m_fTransitionTime( DEFAULT_TRANSITION_TIME ),
|
||||
m_fPercentThroughTransition( 0.0f ),
|
||||
m_Color(0,0,0,1)
|
||||
{
|
||||
m_bPlayCloseWipingRightSound = TRUE;
|
||||
m_bPlayCloseWipingLeftSound = TRUE;
|
||||
m_hCloseWipingRightSound = SOUND->LoadSound( SOUND_NEXT );
|
||||
m_hCloseWipingLeftSound = SOUND->LoadSound( SOUND_BACK );
|
||||
}
|
||||
|
||||
Transition::~Transition()
|
||||
{
|
||||
SOUND->UnloadSound( m_hCloseWipingRightSound );
|
||||
SOUND->UnloadSound( m_hCloseWipingLeftSound );
|
||||
}
|
||||
|
||||
void Transition::Update( const FLOAT &fDeltaTime )
|
||||
{
|
||||
switch( m_TransitionState )
|
||||
{
|
||||
case opening_right:
|
||||
case opening_left:
|
||||
case closing_right:
|
||||
case closing_left:
|
||||
|
||||
m_fPercentThroughTransition += fDeltaTime/m_fTransitionTime;
|
||||
if( m_fPercentThroughTransition > 1.0f ) // the wipe is over
|
||||
{
|
||||
m_fPercentThroughTransition = 0.0;
|
||||
switch( m_TransitionState )
|
||||
{
|
||||
case opening_right:
|
||||
case opening_left:
|
||||
m_TransitionState = opened;
|
||||
break;
|
||||
case closing_right:
|
||||
case closing_left:
|
||||
m_TransitionState = closed;
|
||||
break;
|
||||
}
|
||||
WM->SendMessageToTopWindow( m_MessageToSendWhenDone, 0 );
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Transition::SetClosed()
|
||||
{
|
||||
m_TransitionState = closed;
|
||||
}
|
||||
|
||||
void Transition::SetOpened()
|
||||
{
|
||||
m_TransitionState = opened;
|
||||
}
|
||||
|
||||
void Transition::OpenWipingRight( WindowMessage send_when_done )
|
||||
{
|
||||
m_MessageToSendWhenDone = send_when_done;
|
||||
m_TransitionState = opening_right;
|
||||
m_fPercentThroughTransition = 0.0;
|
||||
}
|
||||
|
||||
void Transition::OpenWipingLeft( WindowMessage send_when_done )
|
||||
{
|
||||
m_MessageToSendWhenDone = send_when_done;
|
||||
m_TransitionState = opening_left;
|
||||
m_fPercentThroughTransition = 0.0;
|
||||
}
|
||||
|
||||
void Transition::CloseWipingRight( WindowMessage send_when_done )
|
||||
{
|
||||
m_MessageToSendWhenDone = send_when_done;
|
||||
m_TransitionState = closing_right;
|
||||
m_fPercentThroughTransition = 0.0;
|
||||
if( m_bPlayCloseWipingRightSound )
|
||||
SOUND->Play( m_hCloseWipingRightSound );
|
||||
}
|
||||
|
||||
void Transition::CloseWipingLeft( WindowMessage send_when_done )
|
||||
{
|
||||
m_MessageToSendWhenDone = send_when_done;
|
||||
m_TransitionState = closing_left;
|
||||
m_fPercentThroughTransition = 0.0;
|
||||
if( m_bPlayCloseWipingLeftSound )
|
||||
SOUND->Play( m_hCloseWipingLeftSound );
|
||||
}
|
||||
|
||||
|
||||
void Transition::SetCloseWipingRightSound( CString sSoundPath )
|
||||
{
|
||||
if( sSoundPath == "" )
|
||||
{
|
||||
SOUND->UnloadSound( m_hCloseWipingRightSound );
|
||||
m_bPlayCloseWipingRightSound = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
SOUND->UnloadSound( m_hCloseWipingRightSound );
|
||||
m_hCloseWipingRightSound = SOUND->LoadSound( SOUND_NEXT );
|
||||
m_bPlayCloseWipingRightSound = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
void Transition::SetCloseWipingLeftSound( CString sSoundPath )
|
||||
{
|
||||
if( sSoundPath == "" )
|
||||
{
|
||||
SOUND->UnloadSound( m_hCloseWipingRightSound );
|
||||
m_bPlayCloseWipingLeftSound = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
SOUND->UnloadSound( m_hCloseWipingLeftSound );
|
||||
m_hCloseWipingLeftSound = SOUND->LoadSound( SOUND_NEXT );
|
||||
m_bPlayCloseWipingLeftSound = TRUE;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,71 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Transition.cpp
|
||||
//
|
||||
// Desc: Abstract base class for all transitions
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#ifndef _Transition_H_
|
||||
#define _Transition_H_
|
||||
|
||||
|
||||
#include "Actor.h"
|
||||
#include "RageScreen.h"
|
||||
#include "RageSound.h"
|
||||
#include "Window.h"
|
||||
#include "WindowManager.h"
|
||||
|
||||
|
||||
#define DEFAULT_TRANSITION_TIME 1.0f
|
||||
|
||||
|
||||
class Transition
|
||||
{
|
||||
public:
|
||||
Transition();
|
||||
~Transition();
|
||||
|
||||
void Update( const FLOAT &fDeltaTime );
|
||||
virtual void Draw() PURE;
|
||||
|
||||
virtual void SetOpened();
|
||||
virtual void SetClosed();
|
||||
|
||||
virtual void OpenWipingRight( WindowMessage send_when_done );
|
||||
virtual void OpenWipingLeft( WindowMessage send_when_done );
|
||||
virtual void CloseWipingRight(WindowMessage send_when_done );
|
||||
virtual void CloseWipingLeft( WindowMessage send_when_done );
|
||||
|
||||
BOOL IsClosed() { return m_TransitionState == closed; };
|
||||
BOOL IsClosing() { return m_TransitionState == closing_right || m_TransitionState == closing_left; };
|
||||
|
||||
VOID SetTransitionTime( FLOAT fNewTransitionTime ) { m_fTransitionTime = fNewTransitionTime; };
|
||||
|
||||
void SetColor( D3DXCOLOR new_color ) { m_Color = new_color; };
|
||||
void SetCloseWipingRightSound( CString sSoundPath );
|
||||
void SetCloseWipingLeftSound( CString sSoundPath );
|
||||
|
||||
protected:
|
||||
|
||||
enum TransitionState { opened, closed,
|
||||
opening_right, opening_left,
|
||||
closing_right, closing_left };
|
||||
|
||||
TransitionState m_TransitionState;
|
||||
FLOAT m_fTransitionTime;
|
||||
FLOAT m_fPercentThroughTransition;
|
||||
|
||||
WindowMessage m_MessageToSendWhenDone;
|
||||
|
||||
BOOL m_bPlayCloseWipingRightSound;
|
||||
BOOL m_bPlayCloseWipingLeftSound;
|
||||
HSAMPLE m_hCloseWipingRightSound;
|
||||
HSAMPLE m_hCloseWipingLeftSound;
|
||||
|
||||
D3DXCOLOR m_Color;
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,60 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: TransitionFade.cpp
|
||||
//
|
||||
// Desc: "Window blinds"-type transition.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "RageUtil.h"
|
||||
|
||||
#include "TransitionFade.h"
|
||||
|
||||
|
||||
#define SCREEN_WIDTH 640
|
||||
#define SCREEN_HEIGHT 480
|
||||
|
||||
#define RECTANGLE_WIDTH 20
|
||||
#define NUM_RECTANGLES (SCREEN_WIDTH/RECTANGLE_WIDTH)
|
||||
#define FADE_RECTS_WIDE (NUM_RECTANGLES/3) // number of rects from fade start to fade end
|
||||
|
||||
|
||||
|
||||
TransitionFade::TransitionFade()
|
||||
{
|
||||
}
|
||||
|
||||
TransitionFade::~TransitionFade()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void TransitionFade::Draw()
|
||||
{
|
||||
FLOAT fPercentageOpaque;
|
||||
switch( m_TransitionState )
|
||||
{
|
||||
case opened:
|
||||
fPercentageOpaque = 0.0;
|
||||
break;
|
||||
case closed:
|
||||
fPercentageOpaque = 1.0;
|
||||
break;
|
||||
case opening_right:
|
||||
case opening_left:
|
||||
fPercentageOpaque = 1.0f - m_fPercentThroughTransition;
|
||||
break;
|
||||
case closing_right:
|
||||
case closing_left:
|
||||
fPercentageOpaque = m_fPercentThroughTransition;
|
||||
break;
|
||||
}
|
||||
|
||||
m_Color.a = fPercentageOpaque;
|
||||
int alpha = (int)( fPercentageOpaque * 255 );
|
||||
SCREEN->DrawRect( CRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT), m_Color );
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: TransitionFade.cpp
|
||||
//
|
||||
// Desc: "Window blinds"-type transition.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#ifndef _TransitionFade_H_
|
||||
#define _TransitionFade_H_
|
||||
|
||||
|
||||
#include "Transition.h"
|
||||
#include "RageScreen.h"
|
||||
#include "RageSound.h"
|
||||
|
||||
|
||||
class TransitionFade : public Transition
|
||||
{
|
||||
public:
|
||||
TransitionFade();
|
||||
~TransitionFade();
|
||||
|
||||
void Draw();
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,88 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: TransitionFadeWipe.cpp
|
||||
//
|
||||
// Desc: "Window blinds"-type transition.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "RageUtil.h"
|
||||
|
||||
#include "TransitionFadeWipe.h"
|
||||
|
||||
|
||||
#define SCREEN_WIDTH 640
|
||||
#define SCREEN_HEIGHT 480
|
||||
|
||||
#define RECTANGLE_WIDTH 20
|
||||
#define NUM_RECTANGLES (SCREEN_WIDTH/RECTANGLE_WIDTH)
|
||||
#define FADE_RECTS_WIDE (NUM_RECTANGLES/3) // number of rects from fade start to fade end
|
||||
|
||||
|
||||
|
||||
TransitionFadeWipe::TransitionFadeWipe()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
TransitionFadeWipe::~TransitionFadeWipe()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void TransitionFadeWipe::Draw()
|
||||
{
|
||||
if( m_TransitionState == opened )
|
||||
return;
|
||||
|
||||
/////////////////////////
|
||||
// draw rectangles that get progressively smaller at the edge of the wipe
|
||||
/////////////////////////
|
||||
BOOL bLeftEdgeIsDarker = m_TransitionState == opening_left || m_TransitionState == closing_right;
|
||||
BOOL bFadeIsMovingLeft = m_TransitionState == opening_left || m_TransitionState == closing_left;
|
||||
|
||||
double fPercentComplete = m_fPercentThroughTransition;
|
||||
double fPercentAlongScreen = bFadeIsMovingLeft ? 1-fPercentComplete : fPercentComplete;
|
||||
|
||||
int iFadeLeftEdge = (int)
|
||||
(-FADE_RECTS_WIDE + (NUM_RECTANGLES + FADE_RECTS_WIDE) * fPercentAlongScreen);
|
||||
int iFadeRightEdge = (int)
|
||||
(0 + (NUM_RECTANGLES + FADE_RECTS_WIDE) * fPercentAlongScreen);
|
||||
|
||||
// draw all rectangles
|
||||
for( int i=0; i<NUM_RECTANGLES; i++ )
|
||||
{
|
||||
int iRectX = (int)(RECTANGLE_WIDTH * (i+0.5));
|
||||
int iRectWidth;
|
||||
|
||||
if( i < iFadeLeftEdge )
|
||||
iRectWidth = bLeftEdgeIsDarker ? RECTANGLE_WIDTH : 0;
|
||||
//iRectWidth = 0;
|
||||
else if( i > iFadeRightEdge )
|
||||
iRectWidth = bLeftEdgeIsDarker ? 0 : RECTANGLE_WIDTH;
|
||||
//iRectWidth = 0;
|
||||
else // this is a fading rectangle
|
||||
{
|
||||
int iRectsFromLeftFadeEdge = i - iFadeLeftEdge;
|
||||
double fPercentAlongFade = iRectsFromLeftFadeEdge / (double)FADE_RECTS_WIDE;
|
||||
double fPercentDarkness = bLeftEdgeIsDarker ? 1-fPercentAlongFade : fPercentAlongFade;
|
||||
iRectWidth = (int)(RECTANGLE_WIDTH * fPercentDarkness);
|
||||
|
||||
}
|
||||
//iRectWidth = RECTANGLE_WIDTH;
|
||||
|
||||
if( iRectWidth > 0 )
|
||||
//if( i == iFadeLeftEdge || i == iFadeRightEdge )
|
||||
{ // draw the rectangle
|
||||
int iRectAlpha = (int)( iRectWidth * 255.0f / RECTANGLE_WIDTH );
|
||||
RECT rect;
|
||||
SetRect( &rect, iRectX-RECTANGLE_WIDTH/2, 0,
|
||||
iRectX+RECTANGLE_WIDTH/2, SCREEN_HEIGHT );
|
||||
SCREEN->DrawRect( &rect, D3DCOLOR_ARGB(iRectAlpha,0,0,0) );
|
||||
}
|
||||
} // end foreach rect
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: TransitionFadeWipe.cpp
|
||||
//
|
||||
// Desc: "Window blinds"-type transition.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#ifndef _TransitionFadeWipe_H_
|
||||
#define _TransitionFadeWipe_H_
|
||||
|
||||
|
||||
#include "Transition.h"
|
||||
#include "RageScreen.h"
|
||||
#include "RageSound.h"
|
||||
|
||||
|
||||
class TransitionFadeWipe : public Transition
|
||||
{
|
||||
public:
|
||||
TransitionFadeWipe();
|
||||
~TransitionFadeWipe();
|
||||
|
||||
void Draw();
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,87 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: TransitionRectWipe.cpp
|
||||
//
|
||||
// Desc: "Window blinds"-type transition.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "RageUtil.h"
|
||||
|
||||
#include "TransitionRectWipe.h"
|
||||
|
||||
|
||||
#define SCREEN_WIDTH 640
|
||||
#define SCREEN_HEIGHT 480
|
||||
|
||||
#define RECTANGLE_WIDTH 20
|
||||
#define NUM_RECTANGLES (SCREEN_WIDTH/RECTANGLE_WIDTH)
|
||||
#define FADE_RECTS_WIDE (NUM_RECTANGLES/4) // number of rects from fade start to fade end
|
||||
|
||||
|
||||
|
||||
TransitionRectWipe::TransitionRectWipe()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
TransitionRectWipe::~TransitionRectWipe()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void TransitionRectWipe::Draw()
|
||||
{
|
||||
if( m_TransitionState == opened )
|
||||
return;
|
||||
|
||||
/////////////////////////
|
||||
// draw rectangles that get progressively smaller at the edge of the wipe
|
||||
/////////////////////////
|
||||
BOOL bLeftEdgeIsDarker = m_TransitionState == opening_left || m_TransitionState == closing_right;
|
||||
BOOL bFadeIsMovingLeft = m_TransitionState == opening_left || m_TransitionState == closing_left;
|
||||
|
||||
double fPercentComplete = m_fPercentThroughTransition;
|
||||
double fPercentAlongScreen = bFadeIsMovingLeft ? 1-fPercentComplete : fPercentComplete;
|
||||
|
||||
int iFadeLeftEdge = (int)
|
||||
(-FADE_RECTS_WIDE + (NUM_RECTANGLES + FADE_RECTS_WIDE) * fPercentAlongScreen);
|
||||
int iFadeRightEdge = (int)
|
||||
(0 + (NUM_RECTANGLES + FADE_RECTS_WIDE) * fPercentAlongScreen);
|
||||
|
||||
// draw all rectangles
|
||||
for( int i=0; i<NUM_RECTANGLES; i++ )
|
||||
{
|
||||
int iRectX = (int)(RECTANGLE_WIDTH * (i+0.5));
|
||||
int iRectWidth;
|
||||
|
||||
if( i < iFadeLeftEdge )
|
||||
iRectWidth = bLeftEdgeIsDarker ? RECTANGLE_WIDTH : 0;
|
||||
//iRectWidth = 0;
|
||||
else if( i > iFadeRightEdge )
|
||||
iRectWidth = bLeftEdgeIsDarker ? 0 : RECTANGLE_WIDTH;
|
||||
//iRectWidth = 0;
|
||||
else // this is a fading rectangle
|
||||
{
|
||||
int iRectsFromLeftFadeEdge = i - iFadeLeftEdge;
|
||||
double fPercentAlongFade = iRectsFromLeftFadeEdge / (double)FADE_RECTS_WIDE;
|
||||
double fPercentDarkness = bLeftEdgeIsDarker ? 1-fPercentAlongFade : fPercentAlongFade;
|
||||
iRectWidth = (int)(RECTANGLE_WIDTH * fPercentDarkness);
|
||||
|
||||
}
|
||||
//iRectWidth = RECTANGLE_WIDTH;
|
||||
|
||||
if( iRectWidth > 0 )
|
||||
//if( i == iFadeLeftEdge || i == iFadeRightEdge )
|
||||
{ // draw the rectangle
|
||||
RECT rect;
|
||||
SetRect( &rect, iRectX-iRectWidth/2, 0,
|
||||
iRectX+iRectWidth/2, SCREEN_HEIGHT );
|
||||
SCREEN->DrawRect( &rect, D3DCOLOR_ARGB(255,0,0,0) );
|
||||
}
|
||||
} // end foreach rect
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: TransitionRectWipe.cpp
|
||||
//
|
||||
// Desc: "Window blinds"-type transition.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#ifndef _TransitionRectWipe_H_
|
||||
#define _TransitionRectWipe_H_
|
||||
|
||||
|
||||
#include "Transition.h"
|
||||
#include "RageScreen.h"
|
||||
#include "RageSound.h"
|
||||
|
||||
|
||||
class TransitionRectWipe : public Transition
|
||||
{
|
||||
public:
|
||||
TransitionRectWipe();
|
||||
~TransitionRectWipe();
|
||||
|
||||
void Draw();
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,127 @@
|
||||
#include "stdafx.h"
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: TransitionStarWipe.cpp
|
||||
//
|
||||
// Desc: "Window blinds"-type transition.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "RageUtil.h"
|
||||
|
||||
#include "TransitionStarWipe.h"
|
||||
|
||||
|
||||
#define SCREEN_WIDTH 640
|
||||
#define SCREEN_HEIGHT 480
|
||||
|
||||
#define TEXTURE_STAR_BLUE "Textures\\Star Blue.png"
|
||||
#define TEXTURE_STAR_YELLOW "Textures\\Star Yellow.png"
|
||||
|
||||
TransitionStarWipe::TransitionStarWipe()
|
||||
{
|
||||
m_fTransitionTime = m_fTransitionTime * 1.5f;
|
||||
}
|
||||
|
||||
TransitionStarWipe::~TransitionStarWipe()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void TransitionStarWipe::Draw()
|
||||
{
|
||||
if( m_TransitionState == opened )
|
||||
return;
|
||||
else if( m_TransitionState == closed ) {
|
||||
SCREEN->DrawRect( CRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT), D3DCOLOR_RGBA(0,0,0,255) );
|
||||
return;
|
||||
}
|
||||
|
||||
FLOAT fPercentOpen;
|
||||
switch( m_TransitionState )
|
||||
{
|
||||
case opening_right:
|
||||
case opening_left:
|
||||
fPercentOpen = (1.0f - m_fPercentThroughTransition);
|
||||
break;
|
||||
case closing_right:
|
||||
case closing_left:
|
||||
fPercentOpen = m_fPercentThroughTransition;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
int iNumStars = SCREEN_HEIGHT/m_iStarHeight + 1;
|
||||
|
||||
for( int row=0; row<iNumStars; row++ ) // foreach row of stars
|
||||
{
|
||||
BOOL bIsAnEvenRow = row % 2;
|
||||
int y = m_iStarHeight*row + m_iStarHeight/2;
|
||||
int x_tilt;
|
||||
switch( m_TransitionState )
|
||||
{
|
||||
case opening_right:
|
||||
case opening_left:
|
||||
x_tilt = y - SCREEN_HEIGHT/2;
|
||||
break;
|
||||
case closing_right:
|
||||
case closing_left:
|
||||
x_tilt = abs( y - SCREEN_HEIGHT/2 );
|
||||
if( bIsAnEvenRow ) x_tilt *= -1;
|
||||
break;
|
||||
}
|
||||
|
||||
int x_offset = (int)(fPercentOpen*(SCREEN_WIDTH+SCREEN_HEIGHT+m_iStarWidth));
|
||||
|
||||
int x = bIsAnEvenRow ?
|
||||
-SCREEN_HEIGHT/2 + x_offset + x_tilt :
|
||||
SCREEN_WIDTH+SCREEN_HEIGHT/2 - x_offset + x_tilt;
|
||||
|
||||
|
||||
m_sprStar.SetRotation( bIsAnEvenRow ? D3DX_PI : 0.0f ); // flip the sprite
|
||||
m_sprStar.SetXY( bIsAnEvenRow?x-1:x, bIsAnEvenRow?y-1:y ); // fudge. The rotation makes it off center
|
||||
m_sprStar.Draw();
|
||||
|
||||
int x_rect_leading_edge = x + ( bIsAnEvenRow ? - m_iStarWidth/2 : m_iStarWidth/2 );
|
||||
int x_rect_trailing_edge = ( bIsAnEvenRow ? 0 : SCREEN_WIDTH );
|
||||
int y_top = y - m_iStarHeight/2;
|
||||
int y_bot = y + m_iStarHeight/2;
|
||||
SCREEN->DrawRect( CRect(x_rect_leading_edge, y_top,
|
||||
x_rect_trailing_edge, y_bot ),
|
||||
D3DCOLOR_ARGB(255,0,0,0)
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void TransitionStarWipe::OpenWipingRight( WindowMessage send_when_done )
|
||||
{
|
||||
Transition::OpenWipingRight( send_when_done );
|
||||
LoadNewStarSprite( TEXTURE_STAR_BLUE );
|
||||
}
|
||||
|
||||
void TransitionStarWipe::OpenWipingLeft( WindowMessage send_when_done )
|
||||
{
|
||||
Transition::OpenWipingLeft( send_when_done );
|
||||
LoadNewStarSprite( TEXTURE_STAR_BLUE );
|
||||
}
|
||||
|
||||
void TransitionStarWipe::CloseWipingRight(WindowMessage send_when_done )
|
||||
{
|
||||
Transition::CloseWipingRight( send_when_done );
|
||||
LoadNewStarSprite( TEXTURE_STAR_YELLOW );
|
||||
}
|
||||
|
||||
void TransitionStarWipe::CloseWipingLeft( WindowMessage send_when_done )
|
||||
{
|
||||
Transition::CloseWipingLeft( send_when_done );
|
||||
LoadNewStarSprite( TEXTURE_STAR_YELLOW );
|
||||
}
|
||||
|
||||
void TransitionStarWipe::LoadNewStarSprite( CString sFileName )
|
||||
{
|
||||
m_sprStar.LoadFromTexture( sFileName );
|
||||
m_iStarWidth = m_sprStar.GetZoomedWidth();
|
||||
m_iStarHeight = m_sprStar.GetZoomedHeight();
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: TransitionStarWipe.cpp
|
||||
//
|
||||
// Desc: "Window blinds"-type transition.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
#ifndef _TransitionStarWipe_H_
|
||||
#define _TransitionStarWipe_H_
|
||||
|
||||
|
||||
#include "Transition.h"
|
||||
#include "RageScreen.h"
|
||||
#include "RageSound.h"
|
||||
|
||||
|
||||
class TransitionStarWipe : public Transition
|
||||
{
|
||||
public:
|
||||
TransitionStarWipe();
|
||||
~TransitionStarWipe();
|
||||
|
||||
void Draw();
|
||||
|
||||
void OpenWipingRight( WindowMessage send_when_done );
|
||||
void OpenWipingLeft( WindowMessage send_when_done );
|
||||
void CloseWipingRight(WindowMessage send_when_done );
|
||||
void CloseWipingLeft( WindowMessage send_when_done );
|
||||
|
||||
protected:
|
||||
void LoadNewStarSprite( CString sFileName );
|
||||
|
||||
Sprite m_sprStar;
|
||||
int m_iStarWidth;
|
||||
int m_iStarHeight;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,22 @@
|
||||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by StepMania.RC
|
||||
//
|
||||
#define IDR_MAIN_ACCEL 1001
|
||||
#define IDM_TOGGLEFULLSCREEN 1002
|
||||
#define IDI_ICON 1003
|
||||
#define IDC_CURSOR 1004
|
||||
#define IDM_EXIT 40003
|
||||
#define IDM_WINDOWED 40008
|
||||
#define IDM_PADS 40011
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 108
|
||||
#define _APS_NEXT_COMMAND_VALUE 40009
|
||||
#define _APS_NEXT_CONTROL_VALUE 1006
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
||||
@@ -0,0 +1,113 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// File: Song.h
|
||||
//
|
||||
// Desc: Holds metadata for a song and the song's step data.
|
||||
//
|
||||
// Copyright (c) 2001 Chris Danford. All rights reserved.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef _SONG_H_
|
||||
#define _SONG_H_
|
||||
|
||||
|
||||
#include <afxtempl.h>
|
||||
#include "Steps.h"
|
||||
|
||||
|
||||
#define BEATS_IN_MEASURE 4
|
||||
|
||||
|
||||
class Song
|
||||
{
|
||||
public:
|
||||
Song() :
|
||||
m_fBPM(0.0),
|
||||
m_fBeatOffset(0.0)
|
||||
{
|
||||
};
|
||||
Song( Song &from )
|
||||
{
|
||||
Copy( from );
|
||||
};
|
||||
Song& operator=( const Song &from )
|
||||
{
|
||||
if (this != &from)
|
||||
{
|
||||
Copy( from );
|
||||
}
|
||||
return *this;
|
||||
};
|
||||
void Copy( const Song &from )
|
||||
{
|
||||
m_sSongFile = from.m_sSongFile;
|
||||
m_sSongDir = from.m_sSongDir;
|
||||
m_sTitle = from.m_sTitle;
|
||||
m_sArtist = from.m_sArtist;
|
||||
m_sCreator = from.m_sCreator;
|
||||
m_fBPM = from.m_fBPM;
|
||||
m_fBeatOffset = from.m_fBeatOffset;
|
||||
|
||||
m_sMusic = from.m_sMusic;
|
||||
m_sSample = from.m_sSample;
|
||||
m_sBanner = from.m_sBanner;
|
||||
m_sBackground = from.m_sBackground;
|
||||
|
||||
arraySteps.Copy( from.arraySteps );
|
||||
};
|
||||
|
||||
bool LoadFromSongDir( CString sDir );
|
||||
|
||||
bool IsUsingBitmapBG()
|
||||
{
|
||||
CString sBGFile = m_sBackground;
|
||||
sBGFile.MakeLower();
|
||||
return sBGFile.Right(3) == "bmp";
|
||||
};
|
||||
|
||||
private:
|
||||
BOOL LoadFromBMSFile( CString sPath );
|
||||
BOOL LoadFromMSDFile( CString sPath );
|
||||
|
||||
void FillEmptyValuesWithDefaults();
|
||||
|
||||
public:
|
||||
CString GetSongFilePath() {return m_sSongDir + m_sSongFile; };
|
||||
CString GetSongFileDir() {return m_sSongDir; };
|
||||
CString GetMusicPath() {return m_sSongDir + m_sMusic; };
|
||||
CString GetSamplePath() {return m_sSongDir + m_sSample; };
|
||||
CString GetBannerPath() {return m_sSongDir + m_sBanner; };
|
||||
CString GetBackgroundPath() {return m_sSongDir + m_sBackground; };
|
||||
// Steps& GetStepsAt( int iIndex ) {return arraySteps[iIndex]; };
|
||||
|
||||
CString GetTitle() {return m_sTitle; };
|
||||
CString GetArtist() {return m_sArtist; };
|
||||
CString GetCreator() {return m_sCreator; };
|
||||
FLOAT GetBeatOffset() {return m_fBeatOffset; };
|
||||
FLOAT GetBPM() {return m_fBPM; };
|
||||
FLOAT GetBeatsPerSecond() {return m_fBPM / 60.0f; };
|
||||
|
||||
public:
|
||||
|
||||
|
||||
private:
|
||||
CString m_sSongFile;
|
||||
CString m_sSongDir;
|
||||
|
||||
CString m_sTitle;
|
||||
CString m_sArtist;
|
||||
CString m_sCreator;
|
||||
FLOAT m_fBPM;
|
||||
FLOAT m_fBeatOffset;
|
||||
|
||||
CString m_sMusic;
|
||||
CString m_sSample;
|
||||
CString m_sBanner;
|
||||
CString m_sBackground;
|
||||
|
||||
public:
|
||||
CArray<Steps, Steps&> arraySteps;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user