Files
wagic/JGE/src/JSprite.cpp
wagic.the.homebrew 8ff6839c8d Some preparation work for new platform support.
- Added a "PSP" compile-time define to clean up some compile time checks (replaced !WIN32 && !LINUX && !IOS with PSP) 
-- Wil, I am aware that this is redundant with the PSPENV variable you introduced recently, I think we can clean that up easily
-- This looks like lots of changes, but most of the time I just moved some blocks here and there
-- tested on VC 2010, PSP, and a bit of NDK
-- I might have broken maemo, iOS, or Linux compilation, can you guys check?
- Fixed some warnings reported by NDK
- NDK still does not compile because recent boost additions (mutex, etc...) are apparently not supported
2011-04-21 13:16:11 +00:00

512 lines
9.9 KiB
C++

//-------------------------------------------------------------------------------------
//
// JGE++ is a hardware accelerated 2D game SDK for PSP/Windows.
//
// Licensed under the BSD license, see LICENSE in JGE root for details.
//
// Copyright (c) 2007 James Hui (a.k.a. Dr.Watson) <jhkhui@gmail.com>
//
//-------------------------------------------------------------------------------------
#include "../include/JSprite.h"
JRenderer* JSprite::mRenderer = NULL;
//------------------------------------------------------------------------------------------------
JSprite::JSprite(JTexture *tex, float x, float y, float width, float height, bool flipped)
{
mRenderer = JRenderer::GetInstance();
//mQuad = new JQuad(tex, x, y, width, height);
//Rect *rect = new Rect((int)x, (int)y, (int)width, (int)height);
//mFrames[0] = rect;
mFrameCount = 0;
mCurrentFrame = 0;
mX = 0.0f;
mY = 0.0f;
mTimer = 0;
mAnimationType = ANIMATION_TYPE_LOOPING;
mDelta = 1;
mAnimating = false;
mDuration = 100.0f;
mAlpha = 255.0f;
mHScale = 1.0f;
mVScale = 1.0f;
mRotation = 0.0f;
mDirection = 0.0f;
mSpeed = 0.0f;
mColor = ARGB(0,255,255,255);
mFrames.clear();
mFrames.reserve(8);
mTex = tex;
if (mTex != NULL)
{
mActive = true;
AddFrame(x, y, width, height, flipped);
}
else
mActive = false;
}
//------------------------------------------------------------------------------------------------
JSprite::~JSprite()
{
// for (int i=0;i<mFrameCount;i++)
// {
// if (mFrames[i])
// delete mFrames[i];
// }
while (mFrames.size()>0)
{
JQuad* quad = mFrames.back();
mFrames.pop_back();
if (quad != NULL)
delete quad;
}
}
//------------------------------------------------------------------------------------------------
void JSprite::Update(float dt)
{
if (!mAnimating) return;
mTimer += dt;
if (mTimer > mDuration)
{
mTimer = 0;
mCurrentFrame+=mDelta;
if (mCurrentFrame >= mFrameCount)
{
if (mAnimationType == ANIMATION_TYPE_LOOPING)
mCurrentFrame = 0;
else if (mAnimationType == ANIMATION_TYPE_ONCE_AND_GONE)
mActive = false;
else if (mAnimationType == ANIMATION_TYPE_ONCE_AND_STAY)
{
mCurrentFrame = mFrameCount-1;
mAnimating = false;
}
else if (mAnimationType == ANIMATION_TYPE_ONCE_AND_BACK)
{
mCurrentFrame = 0;
mAnimating = false;
}
else // ping pong
{
mDelta *= -1;
mCurrentFrame += mDelta;
}
}
else if (mCurrentFrame < 0)
{
if (mAnimationType == ANIMATION_TYPE_PINGPONG)
{
mDelta *= -1;
mCurrentFrame += mDelta;
}
}
}
}
//------------------------------------------------------------------------------------------------
void JSprite::SetAnimationType(int type)
{
mAnimationType = type;
}
//------------------------------------------------------------------------------------------------
void JSprite::Render()
{
if (mActive)
{
//mQuad->SetTextureRect((float)mFrames[mCurrentFrame]->x, (float)mFrames[mCurrentFrame]->y,
// (float)mFrames[mCurrentFrame]->width, (float)mFrames[mCurrentFrame]->height);
//if (mDoAlpha)
// {
int alpha = (int)mAlpha;
// //mQuad->SetColor(ARGB(alpha,255,255,255));
#if defined (PSP)
mFrames[mCurrentFrame]->SetColor(MAKE_COLOR(alpha, mColor));
#else
mFrames[mCurrentFrame]->SetColor(alpha<<24 | mColor);
// mQuad->SetFlip(mFlipped[mCurrentFrame], false);
#endif
// mQuad->SetHFlip(mFlipped[mCurrentFrame]);
// }
//if (mDoRotation != 0.0f || mHScale != 1.0f || mVScale != 1.0f)
mRenderer->RenderQuad(mFrames[mCurrentFrame], mX, mY, mRotation, mHScale, mVScale);
//else
// mRenderer->RenderQuad(mFrames[mCurrentFrame], mX, mY);
}
}
//------------------------------------------------------------------------------------------------
void JSprite::AddFrame(float x, float y, float width, float height, bool flipped)
{
//mFlipped[mFrameCount] = flipped;
//mFrames[mFrameCount++] = new JQuad(mTex, x, y, width, height);
JQuad* quad = new JQuad(mTex, x, y, width, height);
if (quad != NULL)
{
quad->SetHFlip(flipped);
mFrames.push_back(quad);
mFrameCount = mFrames.size();
}
}
//-------------------------------------------------------------------------------
void JSprite::AddFrame(JTexture* tex, float x, float y, float width, float height, bool flipped)
{
mTex = tex;
AddFrame(x, y, width, height, flipped);
}
//------------------------------------------------------------------------------------------------
void JSprite::SetDuration(float duration)
{
mDuration = duration;
}
//------------------------------------------------------------------------------------------------
void JSprite::SetPosition(float x, float y)
{
mX = x;
mY = y;
}
void JSprite::RestartAnimation()
{
mAlpha = 255.0f;
mHScale = 1.0f;
mVScale = 1.0f;
mRotation = 0.0f;
mCurrentFrame = 0;
StartAnimation();
}
void JSprite::SetDirection(float x, float y)
{
float dx = x - mX;
float dy = y - mY;
//from atan2:
// -pi/2
// |
// |
// pi ----+---- 0
// |
// |
// pi/2
SetDirection(atan2f(dy, dx));
}
void JSprite::SetFlip(bool flip, int index)
{
int size = (int)mFrames.size();
if (index == -1)
{
for (int i=0;i<size;i++)
if (mFrames[i] != NULL)
mFrames[i]->SetHFlip(flip);
}
else
{
if (index >= 0 && index < size)
mFrames[index]->SetHFlip(flip);
}
}
// void JSprite::SetBBox(int x, int y, int width, int height)
// {
// mBBoxX = x;
// mBBoxY = y;
// mBBoxWidth = width;
// mBBoxHeight = height;
// }
void JSprite::StartAnimation()
{
mActive = true;
mAnimating = true;
mCurrentFrame = 0;
}
void JSprite::StopAnimation() { mAnimating = false; }
bool JSprite::IsAnimating() { return mAnimating; }
void JSprite::SetAlpha(float alpha) { mAlpha = alpha; }
void JSprite::SetScale(float hscale, float vscale) { mHScale = hscale; mVScale = vscale; }
void JSprite::SetScale(float scale) { mHScale = scale; mVScale = scale; }
float JSprite::GetScale() { return mHScale; }
void JSprite::SetRotation(float rot) { mRotation = rot; }
//JQuad* JSprite::GetQuad() { return mQuad; }
float JSprite::GetXVelocity() { return cosf(mDirection)*mSpeed; }
float JSprite::GetYVelocity() { return sinf(mDirection)*mSpeed; }
void JSprite::SetSpeed(float speed) { mSpeed = speed; }
float JSprite::GetSpeed() { return mSpeed; }
void JSprite::SetDirection(float angle) { mDirection = angle; }
void JSprite::SetHotSpot(float x, float y, int index)
{
int size = (int)mFrames.size();
if (index == -1)
{
for (int i=0;i<size;i++)
if (mFrames[i] != NULL)
mFrames[i]->SetHotSpot(x, y);
}
else
{
if (index >= 0 && index < size)
mFrames[index]->SetHotSpot(x, y);
}
}
#if defined (PSP)
void JSprite::SetColor(PIXEL_TYPE color) { mColor = (color&~MASK_ALPHA); }
#else
void JSprite::SetColor(PIXEL_TYPE color) { mColor = (color&0x00ffffff); }
#endif
// void JSprite::SetBlendMode(int blend, int index)
// {
// if (index == -1)
// {
// for (int i=0;i<MAX_FRAMES;i++)
// if (mFrames[i] != NULL)
// mFrames[i]->mBlend = blend;
// }
// else
// {
// if (index >= 0 && index < MAX_FRAMES)
// mFrames[index]->mBlend = blend;
// }
//
// }
float JSprite::GetAlpha() { return mAlpha; }
float JSprite::GetDirection() { return mDirection; }
float JSprite::GetRotation() { return mRotation; }
void JSprite::SetId(int id) { mId = id; }
int JSprite::GetId() { return mId; }
int JSprite::GetCurrentFrameIndex() { return mCurrentFrame; }
void JSprite::SetCurrentFrameIndex(int frame)
{
if (frame < (int)mFrames.size())
mCurrentFrame = frame;
}
JQuad* JSprite::GetCurrentFrame()
{
if (mCurrentFrame < (signed int)mFrames.size())
return mFrames[mCurrentFrame];
else
return NULL;
}
int JSprite::GetFrameCount()
{
return (int) mFrames.size();
}
JQuad* JSprite::GetFrame(int index)
{
if (index < (signed int)mFrames.size())
return mFrames[index];
else
return NULL;
}
float JSprite::GetX() { return mX; }
float JSprite::GetY() { return mY; }
void JSprite::SetX(float x) { mX = x; }
void JSprite::SetY(float y) { mY = y; }
void JSprite::SetActive(bool f)
{
mActive = f;
if (mActive)
{
if (mFrames.size()==0)
mActive = false;
}
}
bool JSprite::IsActive() { return mActive; }
void JSprite::Move(float dx, float dy)
{
mX += dx;
mY += dy;
}
// ------------------------------------------------------------------------------------------------
JSpriteList::JSpriteList(int count)
{
mCount = count;
mList = new JSprite*[count];
//mVictims = new JSpriteList*[count];
for (int i=0;i<mCount;i++)
{
mList[i] = NULL;
//mVictims[i] = NULL;
}
}
JSpriteList::~JSpriteList()
{
for (int i=0;i<mCount;i++)
if (mList[i])
delete mList[i];
delete[] mList;
//delete[] mVictims;
}
void JSpriteList::Update(float dt)
{
for (int i=0;i<mCount;i++)
{
if (mList[i] && mList[i]->IsActive())
{
mList[i]->Update(dt);
// if (mVictims[i]!= NULL)
// mVictims[i]->CheckCollision(mList[i]);
}
}
}
void JSpriteList::Render()
{
for (int i=0;i<mCount;i++)
if (mList[i] && mList[i]->IsActive())
mList[i]->Render();
}
void JSpriteList::AddSprite(JSprite *sprite)//, JSpriteList* victim)
{
for (int i=0;i<mCount;i++)
{
if (mList[i] == NULL)
{
mList[i] = sprite;
//mVictims[i] = victim;
return;
}
}
}
JSprite* JSpriteList::Activate(float x, float y)
{
for (int i=0;i<mCount;i++)
{
if (mList[i] != NULL && !mList[i]->IsActive())
{
mList[i]->SetActive(true);
mList[i]->SetPosition(x, y);
mList[i]->RestartAnimation();
return mList[i];
}
}
return NULL;
}
void JSpriteList::Activate(float x, float y, int index)
{
if (index < mCount)
{
if (mList[index] != NULL)
{
mList[index]->SetActive(true);
mList[index]->SetPosition(x, y);
mList[index]->RestartAnimation();
}
}
}
JSprite* JSpriteList::GetSprite(int index)
{
if (index < mCount)
{
return mList[index];
}
return NULL;
}
void JSpriteList::EnableAll(bool flag)
{
for (int i=0;i<mCount;i++)
{
if (mList[i] != NULL)
{
mList[i]->SetActive(flag);
mList[i]->RestartAnimation();
}
}
}