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

HGEDistortionMesh例子应用了HGE包中的内容 用来对图片进行扭曲变形处理
#include <stdio.h>

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

#include <hge/hgedistort.h>
#include <hge/hgefont.h>

#include "GameApp.h"


//-------------------------------------------------------------------------------------
// Constructor. Variables can be initialized here.
//
//-------------------------------------------------------------------------------------
GameApp::GameApp()
{
mTex = NULL;//人物图片Tex
mDistortionMesh = NULL;//扭曲工具类
mFont = NULL;//字体

   mRows=8;//扭曲参数
   mCols=8;//应该是粒度或强度
   mCellw=(float)(TEXTURE_WIDTH/(mCols-1));//均匀区分图片为N个Cell cell宽度
   mCellh=(float)(TEXTURE_HEIGHT/(mRows-1));//Cell高度
   mMeshx=(SCREEN_WIDTH_F-TEXTURE_WIDTH)/2;//扭曲后的图片位置
   mMeshy=(SCREEN_HEIGHT_F-TEXTURE_HEIGHT)/2;//在屏幕中央
}


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

}


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

JRenderer* renderer = JRenderer::GetInstance();  
mTex=renderer->LoadTexture("texture.jpg");//加载人物图片

// Create a distortion mesh
mDistortionMesh=new hgeDistortionMesh(mCols, mRows);//设置扭曲的分块8*8的分块
mDistortionMesh->SetTexture(mTex);//用图片来扭曲
mDistortionMesh->SetTextureRect(0,0,TEXTURE_WIDTH,TEXTURE_HEIGHT);//设置要扭曲的大小
mDistortionMesh->Clear(ARGB(0xFF,0xFF,0xFF,0xFF));//清楚扭曲区

// Load a font
mFont=new hgeFont("font1.fnt");//加载显示文字的字体
}


//-------------------------------------------------------------------------------------
// 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(mTex);

SAFE_DELETE(mDistortionMesh);

SAFE_DELETE(mFont);

}


//-------------------------------------------------------------------------------------
// 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;
}

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

static float t=0.0f;//函数中的静态变量 第一次进入的时候初始化 再进入的时候就沿用原来的值了
static int trans=2;//这点和Java有点不一样

int i, j, col;
float r, a, dx, dy;

t+=dt;//当前时间 越加越多阿= =????
//按圆按钮 每次改变一个扭曲效果并清屏
if (engine->GetButtonClick(PSP_CTRL_CIRCLE)) 
{
   if(++trans > 2) 
    trans=0;
   mDistortionMesh->Clear(ARGB(0xFF,0xFF,0xFF,0xFF));

}

// Calculate new displacements and coloring for one of the three effects
//trans3种不同的扭曲效果
switch(trans)
{
   case 0: 
    //将整个图片划分成各个Cell 并单独扭曲
    for(i=1;i<mRows-1;i++)
    {
     for(j=1;j<mCols-1;j++)
     {
      //参数分别为(列,行,Cell中的x坐标,Cell中的y坐标,扭曲效果,根据Cell中心扭曲即HGEDISP_NODE)
      mDistortionMesh->SetDisplacement(j,i,cosf(t*10+(i+j)/2)*5,sinf(t*10+(i+j)/2)*5,HGEDISP_NODE);
      //cosf(t*10+(i+j)/2)*5算式根据时间t与Cos余弦函数的乘积 动态改变扭曲的X方向粒度 在一个0~5中变化
      //sinf(t*10+(i+j)/2)*5根据sin函数 改变扭曲y方向的粒度 在0~5之间变化
      //每个Cell是32*32的大小 整个扭曲的图片时256*256的 分为8*8个Cell
     }
    }
    //mDistortionMesh->SetDisplacement(2,2,cosf(t*10+(2+2)/2)*8,sinf(t*10+(2+2)/2)*8,HGEDISP_NODE);
    //mDistortionMesh->SetDisplacement(1,1,cosf(t*10+(1+1)/2)*3,sinf(t*10+(1+1)/2)*3,HGEDISP_NODE);
    break;

   case 1: 
    for(i=0;i<mRows;i++)
    {
     for(j=1;j<mCols-1;j++)
     {
      //变形只在x方向上扭曲 并且只根据j值变化 y方向上为0 所以x方向上是0~15的扭曲粒度 变形很严重
      //依然是从左上角的cell到右下角的cell 效果类似波浪 如果再加上i的值 变形会在上下方向上不一致
      mDistortionMesh->SetDisplacement(j,i,cosf(t*5+(j+i)/2)*15,0,HGEDISP_NODE);
      col=int((cosf(t*5+(i+j)/2)+1)*35);

      // colour doesn't work the same as the original HGE version so the following line is commented out.
      // dis->SetColor(j,i,ARGB(0xFF,col,col,col));
     }
    }
    break;
   //这个变形函数没看明白
   case 2: 
    for(i=0;i<mRows;i++)
    {
     for(j=0;j<mCols;j++)
     {
      r=sqrtf(powf(j-(float)mCols/2,2)+powf(i-(float)mRows/2,2));
      a=r*cosf(t*2)*0.1f;
      dx=sinf(a)*(i*mCellh-TEXTURE_HEIGHT/2)+cosf(a)*(j*mCellw-TEXTURE_WIDTH/2);
      dy=cosf(a)*(i*mCellh-TEXTURE_HEIGHT/2)-sinf(a)*(j*mCellw-TEXTURE_WIDTH/2);
      mDistortionMesh->SetDisplacement(j,i,dx,dy,HGEDISP_CENTER);
      col=int((cos(r+t*4)+1)*40);

      // colour doesn't work the same as the original HGE version so the following line is commented out.
      // dis->SetColor(j,i,ARGB(0xFF, col,(col/2), 0));
     }
    }
    break;
}


}


//-------------------------------------------------------------------------------------
// 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 the mesh
   mDistortionMesh->Render(mMeshx, mMeshy);//绘制扭曲的图片 

   mFont->printf(5, 5, HGETEXT_LEFT, "Press\nCIRCLE!");//显示文字

}


//-------------------------------------------------------------------------------------
// 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()
{

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! Java基于安卓系统开发的时间管理软件APP源码+设计报告+apk安装包.zipJava基于安卓系统开发的时间管理软件APP源码+设计报告+apk安装包.zipJava基于安卓系统开发的时间管理软件APP源码+设计报告+apk安装包.zipJava基于安卓系统开发的时间管理软件APP源码+设计报告+apk安装包.zipJava基于安卓系统开发的时间管理软件APP源码+设计报告+apk安装包.zipJava基于安卓系统开发的时间管理软件APP源码+设计报告+apk安装包.zipJava基于安卓系统开发的时间管理软件APP源码+设计报告+apk安装包.zipJava基于安卓系统开发的时间管理软件APP源码+设计报告+apk安装包.zipJava基于安卓系统开发的时间管理软件APP源码+设计报告+apk安装包.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值