void Camera::OnUpdate(float fDeltaTime, const DJVector2 &vTargetPos, const DJVector2 &vYRestriction) { DJVector2 vCalculatedTargetPos(vTargetPos); if (vCalculatedTargetPos[1] - (RUNNER_PADDING.e[1] * (float)g_nScreenHeight) < vYRestriction[0]) vCalculatedTargetPos[1] = vYRestriction[0] + (RUNNER_PADDING.e[1] * (float)g_nScreenHeight); if (vCalculatedTargetPos[1] + ((1.0f - RUNNER_PADDING.e[1]) * (float)g_nScreenHeight) > vYRestriction[1]) vCalculatedTargetPos[1] = vYRestriction[1] - ((1.0f - RUNNER_PADDING.e[1]) * (float)g_nScreenHeight); DJVector2 vVel = (vCalculatedTargetPos - m_vPrevTargetPos) / fDeltaTime; DJVector2 vVelDiff = vVel - m_vSpanVel; vVelDiff = vVelDiff & DJVector2(1.0f, 1.0f); m_vSpanVel[0] += vVelDiff[0] * (fDeltaTime / CAMERA_VELOCITY_CATCHUP_TIME.e[0]); m_vSpanVel[1] += vVelDiff[1] * (fDeltaTime / CAMERA_VELOCITY_CATCHUP_TIME.e[1]); DJVector2 vDist = (vCalculatedTargetPos - m_vPos); vDist = vDist & DJVector2(1.0f, 0.3f); m_vPos += m_vSpanVel * fDeltaTime; m_vPos[0] += vDist[0] * (fDeltaTime / CAMERA_POSITION_CATCHUP_TIME[0]); m_vPos[1] += vDist[1] * (fDeltaTime / CAMERA_POSITION_CATCHUP_TIME[1]); //m_vPos += vDist * (fDeltaTime / CAMERA_CATCHUP_TIME); m_vPrevTargetPos = vCalculatedTargetPos; m_fShakingTime += fDeltaTime; if(m_fShakingTime < 1.0f) { float fTran = m_fShakingTime * 20.0f; DJVector2 vTran(5.0f * g_vScaleScreen[0] * djSin(fTran * DJ_PIf), 5.0f * g_vScaleScreen[1] * djSin(fTran * DJ_PIf)); vTran = vTran & m_vDir; if (fTran > 1.0f) { fTran = 1.0f; vTran = DJVector2(0.0f); } DJMatrix2D tmmm; tmmm = theSpriteEngine.GetGlobalTransform(); tmmm.SetTranslation(vTran); theSpriteEngine.SetGlobalTransform(tmmm); } // Padding m_fPaddingOffsetX += djStepToDesiredValue(m_fPaddingOffsetX, m_fPaddingDesiredOffsetX, fDeltaTime * m_fPaddingSpeedXFactor); if(m_vPos[1] < vYRestriction[1] / 1.5f) m_fPaddingOffsetY += djStepToDesiredValue(m_fPaddingOffsetY, 0.075f, fDeltaTime * 0.01f); else m_fPaddingOffsetY += djStepToDesiredValue(m_fPaddingOffsetY, 0.0f, fDeltaTime * 0.01f); //m_fPaddingOffsetY = 0.075f; }
djbool DJDynamicEffect::AddParticle(const DJVector3 &vPos) { DJEffectParticle *pPart; DJColor start,end; float yaw,pitch,speed; if (m_nActiveCount < m_pEffectDesc->m_nMaxParticles) { pPart = GetParticle(); // THE CURRENT PARTICLE if (!pPart) return DJFALSE; pPart->pNext = m_pActiveParticles; // SET ITS NEXT POINTER m_pActiveParticles = pPart; // SET IT IN THE EMITTER pPart->vPos = vPos; pPart->vPrevPos = pPart->vPos; // USED FOR ANTI ALIAS // CALCULATE THE STARTING DIRECTION VECTOR yaw = m_pEffectDesc->m_fYaw + (m_pEffectDesc->m_fYawVar * djRandomGetFloat2()); pitch = m_pEffectDesc->m_fPitch + (m_pEffectDesc->m_fPitchVar * djRandomGetFloat2()); // CONVERT THE ROTATIONS TO A VECTOR //RotationToDirection(pitch,yaw,&pPart->vDir); //pPart->vDir = DJVector3(0,0,1); pPart->vDir[0] = (float)(-djSin(yaw) * djCos(pitch)); pPart->vDir[1] = (float)djSin(pitch); pPart->vDir[2] = (float)(djCos(pitch) * djCos(yaw)); // CALCULATE THE LIFE SPAN pPart->nLife = m_pEffectDesc->m_nLife + (djint32)((float)m_pEffectDesc->m_nLifeVar * djRandomGetFloat2()); float fStartSize = m_pEffectDesc->m_fStartSize + (m_pEffectDesc->m_fStartSizeVar * djRandomGetFloat2()); float fEndSize = m_pEffectDesc->m_fEndSize + (m_pEffectDesc->m_fEndSizeVar * djRandomGetFloat2()); if (fStartSize < 0.0f) fStartSize = 0.0f; if (fEndSize < 0.0f) fEndSize = 0.0f; pPart->fSize = fStartSize; pPart->fDeltaSize = (fEndSize - fStartSize) / (float)pPart->nLife; // MULTIPLY IN THE SPEED FACTOR speed = m_pEffectDesc->m_fSpeed + (m_pEffectDesc->m_fSpeedVar * djRandomGetFloat2()); pPart->vDir *= speed; // CALCULATE THE COLORS start = m_pEffectDesc->m_cStartColor + m_pEffectDesc->m_cStartColorVar * djRandomGetFloat2(); end = m_pEffectDesc->m_cEndColor + (m_pEffectDesc->m_cEndColorVar * djRandomGetFloat2()); start.ClampZero(); start.ClampOne(); end.ClampZero(); end.ClampOne(); pPart->cCol = start; // ROTATION pPart->fRot = m_pEffectDesc->m_fRot + m_pEffectDesc->m_fRotVar * djRandomGetFloat2(); pPart->fDeltaRot = m_pEffectDesc->m_fRotSpeed + m_pEffectDesc->m_fRotSpeedVar * djRandomGetFloat2(); // CREATE THE COLOR DELTA pPart->cDeltaCol = (end - start) / (float)pPart->nLife; m_nActiveCount++; // A NEW PARTICLE IS BORN return DJTRUE; } return DJFALSE; }