335 lines
5.9 KiB
C++
335 lines
5.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/JGE.h"
|
|
#include "../include/JApp.h"
|
|
|
|
#include "../include/JGameObject.h"
|
|
|
|
|
|
//JRenderer* JGameObject::mRenderer = NULL;
|
|
|
|
|
|
|
|
JGameObject::JGameObject(JTexture *tex, float x, float y, float width, float height)
|
|
:JSprite(tex, x, y, width, height)
|
|
{
|
|
//mRenderer = JRenderer::GetInstance();
|
|
|
|
//mX = 0.0f;
|
|
//mY = 0.0f;
|
|
|
|
mRenderFlags = 0;
|
|
//mSize = 1.0f;
|
|
//mAngle = 0.0f;
|
|
|
|
mOriginalBlood = 1;
|
|
mBlood = 1;
|
|
mHitPoint = 1;
|
|
|
|
mCollided = false;
|
|
mCollisionTarget = NULL;
|
|
mFlashing = false;
|
|
|
|
//mActive = false;
|
|
|
|
mRotationDelta = 0.0f;
|
|
mDoRotation = false;
|
|
|
|
mAlphaDelta = 0.0f;
|
|
mDoAlpha = false;
|
|
|
|
mDoScaling = false;
|
|
mScaleDelta = 0.0f;
|
|
|
|
SetBBox(x, y, width, height);
|
|
|
|
}
|
|
|
|
|
|
JGameObject::~JGameObject()
|
|
{
|
|
// JGERelease();
|
|
}
|
|
|
|
|
|
void JGameObject::Update(float dt)
|
|
{
|
|
JSprite::Update(dt);
|
|
|
|
if (mFlashing)
|
|
{
|
|
mFlashTimer += dt;
|
|
if (mFlashTimer > FLASH_TIME)
|
|
{
|
|
mFlashTimer = 0;
|
|
mFlashCounter++;
|
|
if (mFlashCounter > FLASHING_COUNT)
|
|
mFlashing = false;
|
|
}
|
|
}
|
|
|
|
if (mDoAlpha)
|
|
{
|
|
mAlpha += mAlphaDelta*dt;
|
|
if (mAlpha < 0.0f)
|
|
{
|
|
mAlpha = 0.0f;
|
|
if (mAnimationType == ANIMATION_TYPE_ONCE_AND_GONE)
|
|
mActive = false;
|
|
}
|
|
else if (mAlpha > 255.0f)
|
|
{
|
|
mAlpha = 255.0f;
|
|
}
|
|
|
|
}
|
|
|
|
if (mDoRotation || mDoScaling)
|
|
{
|
|
mRotation += mRotationDelta*dt;
|
|
mHScale += mScaleDelta*dt;
|
|
mVScale += mScaleDelta*dt;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void JGameObject::Render()
|
|
{
|
|
/*
|
|
if (mQuad != NULL)
|
|
{
|
|
//mEngine->RenderQuad(mQuad, mX, mY);
|
|
if (mFlashing && (mFlashCounter&1)==0)
|
|
{
|
|
mRenderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE);
|
|
}
|
|
|
|
float angle = 0.0f;
|
|
if ((mRenderFlags & RENDER_FLAG_ANGLE)==RENDER_FLAG_ANGLE)
|
|
angle = mAngle;
|
|
if ((mRenderFlags & RENDER_FLAG_ROTATION)==RENDER_FLAG_ROTATION)
|
|
angle = mRotation;
|
|
float scale = 1.0f;
|
|
if ((mRenderFlags & RENDER_FLAG_SIZE)==RENDER_FLAG_SIZE)
|
|
scale = mSize;
|
|
|
|
mRenderer->RenderQuad(mQuad, mX, mY, angle, scale, scale);
|
|
|
|
mRenderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA);
|
|
}
|
|
*/
|
|
|
|
if (!mActive) return;
|
|
|
|
if ((mRenderFlags & RENDER_FLAG_ANGLE)==RENDER_FLAG_ANGLE)
|
|
mRotation = mDirection;
|
|
|
|
if (mFlashing && (mFlashCounter&1)==0)
|
|
mRenderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE);
|
|
|
|
// if ((mRenderFlags & RENDER_FLAG_SIZE)==RENDER_FLAG_SIZE)
|
|
// {
|
|
// mHScale = mSize;
|
|
// mVScale = mSize;
|
|
// }
|
|
// else
|
|
// {
|
|
// mHScale = 1.0f;
|
|
// mVScale = 1.0f;
|
|
// }
|
|
|
|
JSprite::Render();
|
|
|
|
if (mFlashing)
|
|
mRenderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA);
|
|
|
|
}
|
|
|
|
|
|
// void JGameObject::SetPosition(float x, float y)
|
|
// {
|
|
// // mPos = Vector2D(x, y);
|
|
// mX = x;
|
|
// mY = y;
|
|
// }
|
|
|
|
|
|
//void JGameObject::SetQuad(JQuad *quad) { mQuad = quad; }
|
|
|
|
|
|
|
|
|
|
//void JParticle::ResetVelocity()
|
|
//{
|
|
// float xx = mSpeed * cosf(mAngle);
|
|
// float yy = mSpeed * sinf(mAngle);
|
|
// mVelocity = Vector2D(xx, yy);
|
|
//}
|
|
|
|
|
|
void JGameObject::SetBBox(float x, float y, float width, float height)
|
|
{
|
|
mUseBoundingBox = true;
|
|
|
|
mBBoxX = x;
|
|
mBBoxY = y;
|
|
mBBoxWidth = width;
|
|
mBBoxHeight = height;
|
|
}
|
|
|
|
void JGameObject::GetBBox(float x, float y, float* xNow, float* yNow, float* width, float *height)
|
|
{
|
|
*xNow = x + mBBoxX;
|
|
*yNow = y + mBBoxY;
|
|
*width = mBBoxWidth;
|
|
*height = mBBoxHeight;
|
|
}
|
|
|
|
|
|
bool JGameObject::Collide(JGameObject *target)
|
|
{
|
|
if (mUseBoundingBox)
|
|
{
|
|
// bounding box collision detection
|
|
if ((target->mX+target->mBBoxX)-(mX+mBBoxX) < -target->mBBoxWidth) return false;
|
|
if ((target->mX+target->mBBoxX)-(mX+mBBoxX) > mBBoxWidth) return false;
|
|
if ((target->mY+target->mBBoxY)-(mY+mBBoxY) < -target->mBBoxHeight) return false;
|
|
if ((target->mY+target->mBBoxY)-(mY+mBBoxY) > mBBoxHeight) return false;
|
|
|
|
}
|
|
else
|
|
{
|
|
// Circle-Circle collision detection
|
|
float dx = (mX+mCenterX)-(target->mX+target->mCenterX);
|
|
float dy = (mY+mCenterY)-(target->mY+target->mCenterY);
|
|
float dr = mRadius+target->mRadius;
|
|
if (dx*dx + dy*dy > dr*dr)
|
|
return false;
|
|
}
|
|
|
|
//mCollided = true;
|
|
//mCollisionTarget = target;
|
|
SetCollisionTarget(target);
|
|
target->SetCollisionTarget(this);
|
|
|
|
return true; // collision!!!
|
|
}
|
|
|
|
|
|
void JGameObject::SetCollisionTarget(JGameObject *target)
|
|
{
|
|
mBlood -= target->GetHitPoint();
|
|
if (mBlood < 0)
|
|
{
|
|
// mActive = false;
|
|
mBlood = 0;
|
|
}
|
|
|
|
mCollided = true;
|
|
mCollisionTarget = target;
|
|
}
|
|
|
|
|
|
|
|
int JGameObject::GetHitPoint()
|
|
{
|
|
return mHitPoint;
|
|
}
|
|
|
|
|
|
void JGameObject::SetHitPoint(int pt)
|
|
{
|
|
mHitPoint = pt;
|
|
}
|
|
|
|
|
|
void JGameObject::SetBlood(int pt)
|
|
{
|
|
mOriginalBlood = pt;
|
|
mBlood = pt;
|
|
}
|
|
|
|
int JGameObject::GetBlood()
|
|
{
|
|
return mBlood;
|
|
}
|
|
|
|
|
|
void JGameObject::OnCollide()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
void JGameObject::StartFlashing()
|
|
{
|
|
mFlashing = true;
|
|
mFlashTimer = 0.0f;
|
|
mFlashCounter = 0;
|
|
}
|
|
|
|
|
|
void JGameObject::StopFlashing()
|
|
{
|
|
mFlashing = false;
|
|
}
|
|
|
|
|
|
bool JGameObject::IsFlashing()
|
|
{
|
|
return mFlashing;
|
|
}
|
|
|
|
void JGameObject::SetRenderFlags(int flags)
|
|
{
|
|
mRenderFlags = flags;
|
|
}
|
|
|
|
// void JGameObject::SetSize(float size)
|
|
// {
|
|
// mSize = size;
|
|
// }
|
|
//
|
|
//
|
|
// void JGameObject::SetAngle(float angle)
|
|
// {
|
|
// mAngle = angle;
|
|
// }
|
|
|
|
void JGameObject::EnableAlpha(bool flag, float delta) { mDoAlpha = flag; mAlphaDelta = delta; }
|
|
void JGameObject::EnableScaling(bool flag, float delta) { mDoScaling = flag; mScaleDelta = delta; }
|
|
void JGameObject::EnableRotation(bool flag, float delta) { mDoRotation = flag; mRotationDelta = delta; }
|
|
|
|
|
|
|
|
void JGameObject::SetCollisionCircle(float cx, float cy, float radius)
|
|
{
|
|
mUseBoundingBox = false;
|
|
|
|
mCenterX = cx;
|
|
mCenterY = cy;
|
|
mRadius = radius;
|
|
}
|
|
|
|
JGameObject *JGameObject::GetCollisionTarget()
|
|
{
|
|
return mCollisionTarget;
|
|
}
|
|
|
|
// void JGameObject::SetSize(float size)
|
|
// {
|
|
// mSize = size;
|
|
// //mHScale = size;
|
|
// //mVScale = size;
|
|
// }
|