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

PSP程序开发例子解析(九)3DPrimer

UP 
阅读更多
3D例子显示一个Cube和一个人物 不断旋转 具体底部底层API没有列出 只注视了每个语句的含义 显示了3D的大概逻辑流程
#include <stdio.h>


#include <JGE.h>
#include <JRenderer.h>
#include <JLBFont.h>
#include <JSprite.h>
#include <JOBJModel.h>

#include "GameApp.h"

#include <JMD2Model.h>


GameApp::GameApp()
{
mTexture = NULL;
mBgTex = NULL;
mBg = NULL;

mPlayer = NULL;
mGun = NULL;
}


GameApp::~GameApp()
{
}


void GameApp::Create()
{
mAngle = 0.0f;//角度?
mState = STATE_IDLE;//2D动画状态

JRenderer* renderer = JRenderer::GetInstance();
mTexture = renderer->LoadTexture("box.png");//方块图片 单面
mBgTex = renderer->LoadTexture("bg.png");//背景
mBg = new JQuad(mBgTex, 0, 0, 480, 272);//背景

mPlayer = new JMD2Model();
mPlayer->Load("tris.md2", "abarlith.png");   // load a MD2 character加载人物3D模型

mGun = new JMD2Model();
mGun->Load("weapon.md2", "weapon.png");    // load the character's weapon加载武器3D模型

if (mPlayer != NULL && mGun != NULL)
{
   mPlayer->SetState(mState);//设置状态
   mGun->SetState(mState);
}

renderer->SetFOV(60.0f);//设置视场

}


void GameApp::Destroy()
{

SAFE_DELETE(mTexture);
SAFE_DELETE(mBgTex);
SAFE_DELETE(mBg);
SAFE_DELETE(mPlayer);
SAFE_DELETE(mGun);

}


void GameApp::Update()
{

JGE* engine = JGE::GetInstance();

if (engine->GetButtonClick(PSP_CTRL_TRIANGLE))   // do a screen shot when the TRIANGLE button is pressed
{
   char s[80];
   sprintf(s, "ms0:/screenshot.png");
   JRenderer::GetInstance()->ScreenShot(s);
}

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


int mNewState = mState;//改变状态上和左键 状态-1
if (engine->GetButtonClick(PSP_CTRL_UP) || engine->GetButtonClick(PSP_CTRL_LEFT))
{
   mNewState--;
   if (mNewState < STATE_IDLE)
    mNewState = STATE_FALING_FORWARD_DYING;

}
//改变状态下和右键状态+1
else if (engine->GetButtonClick(PSP_CTRL_DOWN) || engine->GetButtonClick(PSP_CTRL_RIGHT))
{
   mNewState++;
   if (mNewState > STATE_FALING_FORWARD_DYING)
    mNewState = STATE_IDLE;

}

if (mNewState != mState && mPlayer != NULL && mGun != NULL)
{
   mState = mNewState;
   mPlayer->SetState(mState);//设置人物的状态
   mGun->SetState(mState);//设置枪的状态
   /* 人物的状态枚举 每个状态对应一个人物动作 比如跑步 走动 跳跃 下蹲 应该在如3DMax软件中定义 生成md2模型文件和切片图片
    STATE_IDLE,
    STATE_RUNNING,
    STATE_SHOT_NOT_FALLING_DOWN,
    STATE_SHOT_IN_SHOULDER,
    STATE_JUMP,
    STATE_IDLE2,
    STATE_SHOT_FALLING_DOWN,
    STATE_IDLE3,
    STATE_IDLE4,
    STATE_CROUCHING,
    STATE_CROUCHING_CRAWL,
    STATE_IDLE_CROUCHING,
    STATE_KNEELING_DYING,
    STATE_FALLING_BACK_DYING,
    STATE_FALING_FORWARD_DYING,
    STATE_FALLING_BACK_SLOWLY_DYING
   */
}

float dt = engine->GetDelta(); // get number of milliseconds passed since last frame

mAngle += 1.0f*dt;     // the frame rate is not fixed by default, so we use dt to do adjustments
if (mAngle > M_PI*2.0f)    // angles are in radian, so 2 PI is one full circle
   mAngle = 0.0f;
//angles是弧度 这个定义不明确 2Pi是一圈??数学基础= =!
mPlayer->Update(dt);    // update model animation
mGun->Update(dt);//更新人物的图片和枪的图片动画

}


void GameApp::Render()
{

JRenderer* renderer = JRenderer::GetInstance();

renderer->Enable2D();//开启2D功能
renderer->RenderQuad(mBg, 0, 0);//画背景

renderer->Enable3D();//开启3D模型功能

renderer->PushMatrix();//矩阵?
renderer->Translate(30.0f, 5.0f, -60.0f);//视角? 参数分别是 X,Y,Z坐标 从x,y,z点看模型的视角 z越大model越小x,y是横向的偏移
renderer->RotateX(-M_PI_2);//X轴旋转-Pi/2 应该是90度 默认的人物头朝向屏幕 90度后人物站起来了 adjust the model to the right orientation
renderer->RotateZ(mAngle);//Z轴旋转运行时的角度 让人物循环旋转

mPlayer->Render();//画人物和枪 render the model 内部实现略
mGun->Render();

   renderer->PopMatrix();//Pop矩阵?


Vertex3D tris[] =// define a 3D cube 定义3D方块的顶点Vertex矩阵 
{
   // float u, v; float x, y, z;
   //u?v? x,y,x后三个是矩阵的坐标
   // top
   { 0.0f, 0.0f, -5.0f, 5.0f, 5.0f },  
   { 1.0f, 0.0f, 5.0f, 5.0f, 5.0f },
   { 1.0f, 1.0f, 5.0f, 5.0f, -5.0f },

   { 1.0f, 1.0f, 5.0f, 5.0f, -5.0f },
   { 0.0f, 1.0f, -5.0f, 5.0f, -5.0f },
   { 0.0f, 0.0f, -5.0f, 5.0f, 5.0f },

   // front
   { 0.0f, 0.0f, 5.0f, -5.0f, 5.0f },  
   { 1.0f, 0.0f, 5.0f, 5.0f, 5.0f },
   { 1.0f, 1.0f, -5.0f, 5.0f, 5.0f },

   { 1.0f, 1.0f, -5.0f, 5.0f, 5.0f },
   { 0.0f, 1.0f, -5.0f, -5.0f, 5.0f },
   { 0.0f, 0.0f, 5.0f, -5.0f, 5.0f },

   // right
   { 0.0f, 0.0f, 5.0f, 5.0f, -5.0f },
   { 1.0f, 0.0f, 5.0f, 5.0f, 5.0f },
   { 1.0f, 1.0f, 5.0f, -5.0f, 5.0f },
  
   { 1.0f, 1.0f, 5.0f, -5.0f, 5.0f },
   { 0.0f, 1.0f, 5.0f, -5.0f, -5.0f },
   { 0.0f, 0.0f, 5.0f, 5.0f, -5.0f },

   // left
   { 0.0f, 0.0f, -5.0f, -5.0f, 5.0f },
   { 1.0f, 0.0f, -5.0f, 5.0f, 5.0f },
   { 1.0f, 1.0f, -5.0f, 5.0f, -5.0f },

   { 1.0f, 1.0f, -5.0f, 5.0f, -5.0f },
   { 0.0f, 1.0f, -5.0f, -5.0f, -5.0f },
   { 0.0f, 0.0f, -5.0f, -5.0f, 5.0f },

   // bottom
   { 0.0f, 0.0f, 5.0f, -5.0f, 5.0f },
   { 1.0f, 0.0f, -5.0f, -5.0f, 5.0f },
   { 1.0f, 1.0f, -5.0f, -5.0f, -5.0f },

   { 1.0f, 1.0f, -5.0f, -5.0f, -5.0f },
   { 0.0f, 1.0f, 5.0f, -5.0f, -5.0f },
   { 0.0f, 0.0f, 5.0f, -5.0f, 5.0f },
  
   // back
   { 0.0f, 0.0f, 5.0f, 5.0f, -5.0f },
   { 1.0f, 0.0f, 5.0f, -5.0f, -5.0f },
   { 1.0f, 1.0f, -5.0f, -5.0f, -5.0f },

   { 1.0f, 1.0f, -5.0f, -5.0f, -5.0f },
   { 0.0f, 1.0f, -5.0f, 5.0f, -5.0f },
   { 0.0f, 0.0f, 5.0f, 5.0f, -5.0f }
};

renderer->PushMatrix();//又矩阵?没找到API的说明 调用的win的底层函数= =!
renderer->Translate(-15.0f, 0.0f, -30.0f);
renderer->RotateX(mAngle);//跟随程序运行着的角度旋转XYZ轴
renderer->RotateY(-mAngle);
renderer->RotateZ(mAngle);
renderer->RenderTriangles(mTexture, tris, 0, 12);//绘制cube 第一个参数是单面图片 第二个参数各个点坐标 0?12? render the 3D cube
renderer->PopMatrix();//又Pop 干什么用的?

}


void GameApp::Pause()
{

}


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是一种轻量级的脚本语言,因其简洁的语法和强大的...

    LightMP3 PSP 音乐播放器

    LightMP3 PSP音乐播放器是一款专为PlayStation ...总的来说,LightMP3 PSP音乐播放器的开发涵盖了音频处理、用户界面设计、系统资源管理等多个领域的技术知识,体现了软件工程师在开发嵌入式系统应用时的专业技能。

    psp5.50直接升级6.60程序

    3. **兼容性**:不同的PSP型号可能需要不同的升级程序,确保使用的升级包是为您的设备型号定制的。 4. **风险与好处**:虽然直接升级简化了流程,但每次固件升级都可能带来一些不可预知的问题,比如某些自制软件...

    psp development with eclipse

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

    psp 中文输入程序 源代码

    标题中的“psp 中文输入程序 源代码”指的是为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...

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

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

    程序段前缀介绍与返回DOS

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

    使用eclipse调试PSP程序.pdf

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

    psp 6.60升级程序

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

    PSP专用660PRO-B9

    2. **sdk**:SDK(Software Development Kit)是软件开发工具包,这里可能是用于开发PSP游戏或应用程序的工具和库,对于编程人员来说非常有用。 3. **FastRecovery**:快速恢复功能可能是指一种能够在设备出现问题...

    PSP官方系统6.61

    《PSP官方系统6.61详解:兼容性与功能解析》 PSP(PlayStation Portable)是由日本索尼公司推出的便携式游戏机,自2004年首次发布以来,凭借其强大的游戏性能和多媒体功能,赢得了全球众多玩家的喜爱。在PSP的发展...

    ④「PSP 6.60 PRO-C 刷机程序」(仅适用6.60系统)

    ④「PSP 6.60 PRO-C 刷机程序」(仅适用6.60系统)

    PSP HACKS PSP破解开发的书

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

    软件开发过程psp课件

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

Global site tag (gtag.js) - Google Analytics