`
wangshu3000
  • 浏览: 135393 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

PSP程序开发例子解析(十一)HGEParticles

阅读更多
HGEParticles这个例子很BT 模仿WindowsMediaPlayer的效果 跟随mp3的播放的波形来显示一些特效
暂时没怎么看明白 慢慢解析
GameApp.h
#ifndef _GAMEAPP_H_
#define _GAMEAPP_H_

#include <JApp.h>

class hgeParticleSystem;
class JTexture;
class JQuad;
class hgeFont;
class JMusic;

class GameApp: public JApp
{

public:
GameApp();
virtual ~GameApp();
virtual void Create();
virtual void Destroy();
virtual void Update();
virtual void Render();
virtual void Pause();
virtual void Resume();

void LoadNewParticleSys();

private:
float mAngle;
float mTimer;

hgeFont* mFont;//屏幕文字显示利用hge的字体类库 具体和TTF的类有什么区别不清楚

hgeParticleSystem* mMovingParticleSys;
hgeParticleSystem* mParticleSys;
JTexture *mTexture;
JQuad *mCircle;

JQuad *mParticles[16];

int mCurrParticleSys;
int mCurrParticle;

float x;
float y;
float dx;
float dy;

float mSpeed;
float mFriction;


JMusic* mMusic;
};

#endif

GameApp.cpp
#include <stdio.h>

#include <JAssert.h>
#include <JGE.h>
#include <JRenderer.h>
#include <JSoundSystem.h>
#include <JLBFont.h>

#include <hge\hgeparticle.h>
#include <hge\hgefont.h>

#include "GameApp.h"



//-------------------------------------------------------------------------------------
// Constructor. Variables can be initialized here.
//
//-------------------------------------------------------------------------------------
GameApp::GameApp()
{
mAngle = 0.0f;
mTimer = 0.0f;

for (int i=0;i<16;i++)
   mParticles[i] = NULL;

mMovingParticleSys = NULL;
mParticleSys = NULL;
mTexture = NULL;
mCircle = NULL;

x = 100.0f;
y = 100.0f;
dx = 0.0f;
dy = 0.0f;

mSpeed = 90;
mFriction = 0.98f;
}


//-------------------------------------------------------------------------------------
// Destructor.
//
//-------------------------------------------------------------------------------------
GameApp::~GameApp()
{

}


//-------------------------------------------------------------------------------------
// This is the init callback function. You should load and create your in-game 
// resources here.
// 
//-------------------------------------------------------------------------------------
void GameApp::Create()
{

mTexture = JRenderer::GetInstance()->LoadTexture("particles.png", TEX_TYPE_USE_VRAM);

// load all the particle images
int n = 0;
for (int i=0;i<4;i++)
{
   for (int j=0;j<4;j++)
   {
    mParticles[n] = new JQuad(mTexture, j*32, i*32, 32, 32);
    mParticles[n]->SetHotSpot(16,16);
    n++;
   }
}

mCircle =new JQuad(mTexture, 96, 64, 32, 32);
mCircle->SetColor(ARGB(0xFF,0xFF,0xA0,0x00));
mCircle->SetHotSpot(16,16);

// the particle system that move with the circle
mMovingParticleSys = new hgeParticleSystem("trail.psi", mParticles[5]);
mMovingParticleSys->Fire();

mCurrParticleSys = 0;
mCurrParticle = 0;

// Load a font
mFont = new hgeFont("font2.fnt");

LoadNewParticleSys();

JSoundSystem* sound = JSoundSystem::GetInstance();

if (sound)
    mMusic = sound->LoadMusic("12thWarrior.mp3"); // Load a background music.

   if (mMusic)
    JSoundSystem::GetInstance()->PlayMusic(mMusic, true);
}


void GameApp::LoadNewParticleSys()
{
if (mParticleSys)
{
   delete mParticleSys;
   mParticleSys = NULL;
}

char s[80];
sprintf(s, "particle%d.psi", (mCurrParticleSys+1));
mParticleSys = new hgeParticleSystem(s, mParticles[mCurrParticle]);
mParticleSys->MoveTo(SCREEN_WIDTH_F/2, SCREEN_HEIGHT_F/2);
mParticleSys->Fire();
}


//-------------------------------------------------------------------------------------
// This is the clean up callback function. You should delete all your in-game 
// resources, for example texture and quads, here.
// 
//-------------------------------------------------------------------------------------
void GameApp::Destroy()
{

SAFE_DELETE(mMovingParticleSys);

SAFE_DELETE(mCircle);

for (int i=0;i<16;i++)
   SAFE_DELETE(mParticles[i]);

SAFE_DELETE(mParticleSys);

SAFE_DELETE(mTexture);

SAFE_DELETE(mFont);

SAFE_DELETE(mMusic);
}


//-------------------------------------------------------------------------------------
// This is the update callback function and is called at each update frame
// before rendering. You should update the game logic here.
//
//-------------------------------------------------------------------------------------
void GameApp::Update()
{

JGE* engine = JGE::GetInstance();

// do a screen shot when the TRIANGLE button is pressed
if (engine->GetButtonClick(PSP_CTRL_TRIANGLE))  
{
   char s[80];

   // save screen shot to root of Memory Stick 
   sprintf(s, "ms0:/screenshot.png");    
   JRenderer::GetInstance()->ScreenShot(s);
}

// exit when the CROSS button is pressed
if (engine->GetButtonClick(PSP_CTRL_CROSS)) 
{
   engine->End();
   return;
}

int quadIdx[] =
{
   7, 15, 0, 5, 7, 0, 1, 15, 4
};

// change particle image if PSP_CTRL_LEFT or PSP_CTRL_RIGHT is down
if (engine->GetButtonClick(PSP_CTRL_LEFT))
{
   mCurrParticle--;
   if (mCurrParticle < 0)
    mCurrParticle = 15;

   mParticleSys->info.sprite = mParticles[mCurrParticle];
   mMovingParticleSys->info.sprite = mParticles[15-mCurrParticle];
}
if (engine->GetButtonClick(PSP_CTRL_RIGHT))
{
   mCurrParticle++;
   if (mCurrParticle > 15)
    mCurrParticle = 0;

   mParticleSys->info.sprite = mParticles[mCurrParticle];
   mMovingParticleSys->info.sprite = mParticles[15-mCurrParticle];
}

// change particle system if PSP_CTRL_DOWN or PSP_CTRL_UP is down
if (engine->GetButtonClick(PSP_CTRL_DOWN))
{
   mCurrParticleSys--;
   if (mCurrParticleSys < 0)
    mCurrParticleSys = 8;

   mCurrParticle = quadIdx[mCurrParticleSys];
   LoadNewParticleSys();
}
if (engine->GetButtonClick(PSP_CTRL_UP))
{
   mCurrParticleSys++;
   if (mCurrParticleSys > 8)
    mCurrParticleSys = 0;

   mCurrParticle = quadIdx[mCurrParticleSys];
   LoadNewParticleSys();
}

float dt = engine->GetDelta();   // Get time elapsed since last update.

mTimer += dt;


mAngle += 2.0f*dt;
if (mAngle >= M_PI*2)
   mAngle = 0;

if (mTimer > 0.01f)   // update the moving circle and particle at about 100fps
{
   if (engine->GetAnalogX()<64) 
    dx-=mSpeed*mTimer;
   if (engine->GetAnalogX()>192) 
    dx+=mSpeed*mTimer;
   if (engine->GetAnalogY()<64) 
    dy-=mSpeed*mTimer;
   if (engine->GetAnalogY()>192) 
    dy+=mSpeed*mTimer;

   // Do some movement calculations and collision detection 
   dx *= mFriction;
   dy *= mFriction;
   x += dx; 
   y += dy;

   if (x>470) 
   {
    x=470-(x-470);
    dx=-dx;
   }
   if (x<16) 
   {
    x=16+16-x;
    dx=-dx;
   }
   if (y>260)
   {
    y=260-(y-260);
    dy=-dy;
   }
   if (y<16)
   {
    y=16+16-y;
    dy=-dy;
   }

   // Update particle system
   mMovingParticleSys->info.nEmission=(int) (dx*dx+dy*dy)*2;
   mMovingParticleSys->MoveTo(x,y);

   mTimer = 0.0f;

}

mMovingParticleSys->Update(dt);
mParticleSys->Update(dt);

}


//-------------------------------------------------------------------------------------
// All rendering operations should be done in Render() only.
// 
//-------------------------------------------------------------------------------------
void GameApp::Render()
{

// get JRenderer instance
JRenderer* renderer = JRenderer::GetInstance();  

// clear screen to black
renderer->ClearScreen(ARGB(0,0,0,0));

// render circle
renderer->RenderQuad(mCircle, x, y);

// set additive blending
renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE);

mParticleSys->Render();
mMovingParticleSys->Render();

// set normal blending
renderer->SetTexBlend(BLEND_SRC_ALPHA, BLEND_ONE_MINUS_SRC_ALPHA);

// draw the current image used for the particle system shown in the middle
renderer->FillRect(SCREEN_WIDTH_F-37, 3, 34, 34, ARGB(255,0,0,128));
mParticles[mCurrParticle]->SetColor(ARGB(255,255,255,255));
renderer->RenderQuad(mParticles[mCurrParticle], SCREEN_WIDTH_F-20, 20);

// turn off bilinear filtering to render sharp text
renderer->EnableTextureFilter(false);

mFont->printf(5, 5, HGETEXT_LEFT, "[Left/Right] Change Particle Image");
char s[80];
mFont->printf(5, 20, HGETEXT_LEFT, "[Up/Down] Change Effect -> particle%d.psi", (mCurrParticleSys+1));
mFont->printf(5, 35, HGETEXT_LEFT, "[Analog] Move Circle");

renderer->EnableTextureFilter(true);
}


//-------------------------------------------------------------------------------------
// This function is called when the system wants to pause the game. You can set a flag
// here to stop the update loop and audio playback.
//
//-------------------------------------------------------------------------------------
void GameApp::Pause()
{

}


//-------------------------------------------------------------------------------------
// This function is called when the game returns from the pause state.
//
//-------------------------------------------------------------------------------------
void GameApp::Resume()
{

}

 

分享到:
评论

相关推荐

    PSP 程序设计基础

    综上所述,PSP程序设计基础不仅涵盖了PSP的历史发展脉络、硬件架构细节,还包括软件开发环境及调试方法等多个方面。对于初学者来说,了解这些基础知识将有助于更好地掌握PSP开发技能,为未来的项目开发打下坚实的...

    psp 游戏开发编程基础(英)

    PSPSDK 是 PSP 游戏开发的软件开发套件,提供了必要的头文件、库文件和示例程序等工具。toolchain 是 PSP 游戏开发的编译器和链接器,负责将源代码编译成 PSP 可执行文件。 二、CYGWIN 的安装 要安装 CYGWIN,只...

    PSP编程开发环境的建立

    【PSP编程开发环境的建立】涉及的主要知识点是PSP(PlayStation Portable)软件的开发流程,这包括在Visual Studio 2008(VS2008)和Eclipse集成开发环境中设置PSP的开发环境,以及编写和编译PSP程序的基本步骤。...

    PSP程序开发 pspdev

    pspdev,有需要的下。 很好的一个psp编程工具 psp编程必备。

    psp开发工具miro lua

    【PSP开发工具Miro Lua】是一款专为PSP(PlayStation Portable)平台设计的lua脚本开发环境,它为LUA爱好者提供了在PSP上编写、测试和运行lua程序的便利工具。LUA是一种轻量级的脚本语言,因其简洁的语法和强大的...

    psp 中文输入程序 源代码

    标题中的“psp 中文输入程序 源代码”指的是为PlayStation Portable(PSP)游戏掌机开发的中文输入法软件的原始编程代码。PSP是一款由索尼公司推出的便携式多媒体设备,它允许用户运行游戏、播放媒体以及进行其他...

    程序段前缀介绍与返回DOS

    ### 汇编语言返回DOS系统方法:程序段前缀(PSP)与返回机制 #### 一、程序段前缀(PSP)介绍 在早期的个人计算机操作系统中,特别是MS-DOS环境下,程序段前缀(Program Segment Prefix, PSP)扮演着极其重要的角色。PSP...

    psp5.50直接升级6.60程序

    标题中的“psp5.50直接升级6.60程序”指的是PlayStation Portable(PSP)游戏设备的固件升级过程。PSP是一款由索尼公司推出的掌上游戏机,其系统固件版本的更新旨在提供新功能、优化性能以及修复已知问题。在这个...

    PSP SDK,PSP 开发包,PSP 的好东东

    PSP SDK(Software Development Kit)则是为开发PSP游戏和应用程序提供的核心工具集,它包含了编译器、库文件、头文件、文档、示例代码以及调试工具等,使得开发者能够创建自己的PSP软件。 **PSP SDK中的关键组成...

    PSP降级工具

    6.XX Downgrader是一款给官方系统的PSP进行降级的程序,使用它能够将6.31/6.35/6.38/6.39/6.60官方系统的PSP降级至6.20/6.35系统。 现在6.60系统也终于能够通过降级来安装自制系统了! 使用方法: 1.把6.20...

    使用eclipse调试PSP程序.pdf

    ### 使用Eclipse调试PSP程序的关键知识点...通过上述步骤,开发者可以有效地使用Eclipse 对PSP 程序进行调试,提高开发效率并减少错误。这对于从事PSP 游戏开发或者其他基于PSP 平台的应用开发的人员来说是非常有用的。

    psp development with eclipse

    2. **Eclipse**:一个强大的C/C++集成开发环境(IDE),用于编写、编译及调试PSP程序。 3. **Blender3D**:一个开源的3D建模工具,用于创建游戏中的3D资产。 这些工具构成了一个完整的PSP游戏开发流程。 #### ...

    PSP HACKS PSP破解开发的书

    Develop for the PSP,看看国外同国内对PSP的距离,是一本学习PSP编程的书。

    软件开发过程psp课件

    《软件开发过程PSP:构建高效能的个人开发体系》 在软件开发领域,PSP(Personal Software Process,个人软件过程)是一种系统化的方法,旨在提高软件工程师的生产力和软件质量。PSP作为SEI(Software Engineering ...

    psp 6.60升级程序

    psp 6.60升级程序,适合从3.71m33 升级到6.60,把程序放到/psp/game/update文件夹内

    Hacking the PSP

    国外一个教授用psp做并行计算的书 Chapter 1: Introduction Chapter 2: Overview of the PSP Chapter 3: Quickies Chapter 4: Taking Apart Your PSP Chapter 5: Getting Online: Configuring Your PSP for ...

    PSP刷机.rar psp2000和psp3000都亲自试验过,没问题,

    标题中的"PSP刷机.rar"指的是为PlayStation Portable(PSP)掌上游戏机进行固件更新或系统修改的过程,通常是为了安装自制软件、增强功能或者运行未授权的游戏。这个压缩包文件可能包含了用于刷机的所有必要工具和...

    PSP自制软件开发利器,JGE 1.0 第3部分(由于太大分卷压缩)

    PSP自制软件开发利器,JGE 1.0 第3部分(由于太大分卷压缩)

    BFMLoaderV100_PSP_

    BFMLoaderV100_PSP_ 是一个专为PSP(PlayStation Portable)平台设计的软件加载器,由西方科学团队开发。这个加载器的主要功能是处理和加载BFM格式的文件,BFM全称可能是"Binary Format for Multimedia"或类似的...

    PSP USB驱动 Type B

    这个驱动程序处理了硬件层面上的数据传输,允许用户传输游戏、音乐、视频等文件到PSP,或者使用PSP作为存储设备。值得注意的是,系统默认支持的USB驱动可能是针对Type-C接口,但有些特定的应用,如PSPdisp,可能需要...

Global site tag (gtag.js) - Google Analytics