[hge] distort.h distort.cpp

荡漾         --写在开头   

  在两个文件组合起来要实现的功能就是使得一个画片图水波般荡漾

  首先来看头文件中的东西

Chapter I: distort.h

Part Ⅰ:attributes

private:
    hgeDistortionMesh();  // 构造函数,话说放在 private 是为了屏蔽这个接口,使得初始化过程中必须有参数

    static HGE      *hge; // 引擎指针

    hgeVertex      *disp_array;   // 顶点数组
    int             nRows, nCols;   // 行数、列数
    float           cellw,cellh;    // 每个小格子的 w、h
    float           tx,ty,width,height; // 图片纹理的属性
    hgeQuad         quad;  // 装图片的那个矩形

Part Ⅱ:interface  这里不用functions是因为这里的函数都是要给用户使用的

public:   // 构造、析构函数
     hgeDistortionMesh(int cols, int rows);
     hgeDistortionMesh(const hgeDistortionMesh &dm);
     ~hgeDistortionMesh();
   // 等号重载
     hgeDistortionMesh&    operator= (const hgeDistortionMesh &dm);
    // 渲染与清理
     void        Render(float x, float y);
     void        Clear(DWORD col=0xFFFFFFFF, float z=0.5f);
   // 属性的 Getter 和 Setter
     void        SetTexture(HTEXTURE tex);
     void        SetTextureRect(float x, float y, float w, float h);
     void        SetBlendMode(int blend);
     void        SetZ(int col, int row, float z);
     void        SetColor(int col, int row, DWORD color);

   // 这个 Setter 是重点!!!
     void        SetDisplacement(int col, int row, float dx, float dy, int ref);

     HTEXTURE    GetTexture() const {return quad.tex;}
     void        GetTextureRect(float *x, float *y, float *w, float *h) const { *x=tx; *y=ty; *w=width; *h=height; }
     int        GetBlendMode() const { return quad.blend; }
     float        GetZ(int col, int row) const;
     DWORD        GetColor(int col, int row) const;
     void        GetDisplacement(int col, int row, float *dx, float *dy, int ref) const;

     int        GetRows() { return nRows; }
     int        GetCols() { return nCols; }


Chapter I: distort.cpp

hgeDistortionMesh(int cols, int rows)

  构造函数:

  • 基本参数舒适化
  • 最主要的是顶点数组的初始化

  在这个初始化的过程中,没有特定的纹理,只是建立的一个顶点数组

hgeDistortionMesh::hgeDistortionMesh(int cols, int rows)
{
    int i;

    hge=hgeCreate(HGE_VERSION);

    nRows=rows;
    nCols=cols;
    cellw=cellh=0;
    quad.tex=0;
    quad.blend=BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_ZWRITE;
    disp_array=new hgeVertex[rows*cols];

    for(i=0;i<rows*cols;i++)
    {
        disp_array[i].x=0.0f;
        disp_array[i].y=0.0f;
        disp_array[i].tx=0.0f;
        disp_array[i].ty=0.0f;

        disp_array[i].z=0.5f;
        disp_array[i].col=0xFFFFFFFF;
    }
}

hgeDistortionMesh(int cols, int rows)

hgeDistortionMesh(const hgeDistortionMesh &dm)

  构造函数

  • 用一个线程的来初始化当前的类
  • 采用深拷贝,将顶点数组完全复制过来

hgeDistortionMesh::hgeDistortionMesh(const hgeDistortionMesh &dm)
{
    hge=hgeCreate(HGE_VERSION);

    nRows=dm.nRows;
    nCols=dm.nCols;
    cellw=dm.cellw;
    cellh=dm.cellh;
    tx=dm.tx;
    ty=dm.ty;
    width=dm.width;
    height=dm.height;
    quad=dm.quad;

    disp_array=new hgeVertex[nRows*nCols];
    memcpy(disp_array, dm.disp_array, sizeof(hgeVertex)*nRows*nCols);
}

hgeDistortionMesh

hgeDistortionMesh& hgeDistortionMesh::operator= (const hgeDistortionMesh &dm)

  赋值符重载

  • 类似根据现有对象建立对象
  • 需要特别注意的是将现有的顶点数组释放,拷贝新的对象的顶点数组

hgeDistortionMesh& hgeDistortionMesh::operator= (const hgeDistortionMesh &dm)
{
    if(this!=&dm)
    {
        nRows=dm.nRows;
        nCols=dm.nCols;
        cellw=dm.cellw;
        cellh=dm.cellh;
        tx=dm.tx;
        ty=dm.ty;
        width=dm.width;
        height=dm.height;
        quad=dm.quad;

        delete[] disp_array;
        disp_array=new hgeVertex[nRows*nCols];
        memcpy(disp_array, dm.disp_array, sizeof(hgeVertex)*nRows*nCols);
    }

    return *this;

}

operator= (const hgeDistortionMesh &dm)

~hgeDistortionMesh()

  析构函数

  • 释放引擎指针;释放顶点数组

hgeDistortionMesh::~hgeDistortionMesh()
{
    delete[] disp_array;
    hge->Release();
}

~hgeDistortionMesh()

Clear(DWORD col, float z)

  • 对所有顶点设置深度z,颜色col

void hgeDistortionMesh::Clear(DWORD col, float z)
{
    int i,j;

    for(j=0; j<nRows; j++)
        for(i=0; i<nCols; i++)
        {
            disp_array[j*nCols+i].x=i*cellw;
            disp_array[j*nCols+i].y=j*cellh;
            disp_array[j*nCols+i].col=col;
            disp_array[j*nCols+i].z=z;
        }
}

Clear(DWORD col, float z)

Render(float x, float y)

  • 渲染函数,将一个整体切割成rows*cols来渲染

void hgeDistortionMesh::Render(float x, float y)
{
    int i,j,idx;

    for(j=0; j<nRows-1; j++)
        for(i=0; i<nCols-1; i++)
        {
            idx=j*nCols+i;

            quad.v[0].tx=disp_array[idx].tx;
            quad.v[0].ty=disp_array[idx].ty;
            quad.v[0].x=x+disp_array[idx].x;
            quad.v[0].y=y+disp_array[idx].y;
            quad.v[0].z=disp_array[idx].z;
            quad.v[0].col=disp_array[idx].col;

            quad.v[1].tx=disp_array[idx+1].tx;
            quad.v[1].ty=disp_array[idx+1].ty;
            quad.v[1].x=x+disp_array[idx+1].x;
            quad.v[1].y=y+disp_array[idx+1].y;
            quad.v[1].z=disp_array[idx+1].z;
            quad.v[1].col=disp_array[idx+1].col;

            quad.v[2].tx=disp_array[idx+nCols+1].tx;
            quad.v[2].ty=disp_array[idx+nCols+1].ty;
            quad.v[2].x=x+disp_array[idx+nCols+1].x;
            quad.v[2].y=y+disp_array[idx+nCols+1].y;
            quad.v[2].z=disp_array[idx+nCols+1].z;
            quad.v[2].col=disp_array[idx+nCols+1].col;

            quad.v[3].tx=disp_array[idx+nCols].tx;
            quad.v[3].ty=disp_array[idx+nCols].ty;
            quad.v[3].x=x+disp_array[idx+nCols].x;
            quad.v[3].y=y+disp_array[idx+nCols].y;
            quad.v[3].z=disp_array[idx+nCols].z;
            quad.v[3].col=disp_array[idx+nCols].col;

            hge->Gfx_RenderQuad(&quad);
        }
}

Render(float x, float y)

SetTextureRect(float x, float y, float w, float h)

  • 对顶点数组进行初始化

void hgeDistortionMesh::SetTextureRect(float x, float y, float w, float h)
{
    int i,j;
    float tw,th;

    tx=x; ty=y; width=w; height=h;

    if (quad.tex)
    {
        tw=(float)hge->Texture_GetWidth(quad.tex);
        th=(float)hge->Texture_GetHeight(quad.tex);
    }
    else
    {
        tw = w;
        th = h;
    }

    cellw=w/(nCols-1);
    cellh=h/(nRows-1);

    for(j=0; j<nRows; j++)
        for(i=0; i<nCols; i++)
        {
            disp_array[j*nCols+i].tx=(x+i*cellw)/tw;
            disp_array[j*nCols+i].ty=(y+j*cellh)/th;

            disp_array[j*nCols+i].x=i*cellw;
            disp_array[j*nCols+i].y=j*cellh;
        }
}

SetTextureRect(float x, float y, float w, float h)

SetDisplacement(int col, int row, float dx, float dy, int ref) 核心部分!

void hgeDistortionMesh::SetDisplacement(int col, int row, float dx, float dy, int ref)
{
    if(row<nRows && col<nCols)
    {
        switch(ref)
        {
            case HGEDISP_NODE:        dx+=col*cellw; dy+=row*cellh; break;
            case HGEDISP_CENTER:    dx+=cellw*(nCols-1)/2;dy+=cellh*(nRows-1)/2; break;
            case HGEDISP_TOPLEFT:    break;
        }

        disp_array[row*nCols+col].x=dx;
        disp_array[row*nCols+col].y=dy;
    }
}

SetDisplacement(int col, int row, float dx, float dy, int ref)

剩下的都是一些getter和setter

void hgeDistortionMesh::SetTexture(HTEXTURE tex)
{
    quad.tex=tex;
}

SetTexture(HTEXTURE tex)

void hgeDistortionMesh::SetBlendMode(int blend)
{
    quad.blend=blend;
}

SetBlendMode(int blend)

void hgeDistortionMesh::SetZ(int col, int row, float z)
{
    if(row<nRows && col<nCols) disp_array[row*nCols+col].z=z;
}

SetZ(int col, int row, float z)

void hgeDistortionMesh::SetColor(int col, int row, DWORD color)
{
    if(row<nRows && col<nCols) disp_array[row*nCols+col].col=color;
}

SetColor(int col, int row, DWORD color)

float hgeDistortionMesh::GetZ(int col, int row) const
{
    if(row<nRows && col<nCols) return disp_array[row*nCols+col].z;
    else return 0.0f;
}

GetZ(int col, int row) const

DWORD hgeDistortionMesh::GetColor(int col, int row) const
{
    if(row<nRows && col<nCols) return disp_array[row*nCols+col].col;
    else return 0;
}

GetColor(int col, int row)

void hgeDistortionMesh::GetDisplacement(int col, int row, float *dx, float *dy, int ref) const
{
    if(row<nRows && col<nCols)
    {
        switch(ref)
        {
            case HGEDISP_NODE:        *dx=disp_array[row*nCols+col].x-col*cellw;
                                    *dy=disp_array[row*nCols+col].y-row*cellh;
                                    break;

            case HGEDISP_CENTER:    *dx=disp_array[row*nCols+col].x-cellw*(nCols-1)/2;
                                    *dy=disp_array[row*nCols+col].x-cellh*(nRows-1)/2;
                                    break;

            case HGEDISP_TOPLEFT:    *dx=disp_array[row*nCols+col].x;
                                    *dy=disp_array[row*nCols+col].y;
                                    break;
        }
    }
}

GetDisplacement(int col, int row, float *dx, float *dy, int ref) const



SetDisplacement(int col, int row, float dx, float dy, int ref)

    

时间: 2024-10-15 02:33:53

[hge] distort.h distort.cpp的相关文章

C++的.h和.cpp根据java来理解

因为要学习cocos2dx所以要学习c++开发然后在学习中看到.h 和 .cpp文件. .h文件进行接口定义,没有具体的实现.很明显跟java的interface一样的作用. .cpp文件是具体的代码实现.跟java类比就是具体的类实现上面定义的interface的类. 这种.h 和.cpp的方式是Opp编程体现吧. 用.h 和 java 用interface都拥有的好处: 抽象逻辑,抽象出层次,方便理解和维护代码.如果做对外开放api,对外可以公布接口,保留代码.这样做比较迅速快捷. 用接口抽

C++编译与链接(0)-.h与.cpp中的定义与声明

C++中有的东西需要放在可以在.h文件中定义,有的东西则必须放在.cpp文件中定义,有的东西在不同的cpp文件中的名字可以一样,而有的则不能一样 那么究竟哪些东西可在头文件中定义,声明,哪些东西又必须在.cpp中定义,声明呢? *以下所有的讨论都是在全局命名空间中(即不定义自己的namespace)下进行的 函数 1.在.h中只能声明函数,在.cpp中可以声明与定义函数 如果在.h中声明并定义一个函数,则该函数只能被#include一次,否则则会出现重定义错误 比如 1.h #pragma on

include .h 以及.cpp的记录

VC include 路径解析要了解vc中使用#include命令包含头文件所搜寻的路径,必须先了解vc中的几种路径:1. 系统路径 系统路径在vc中是"Tools->Options->Directories"中"Include files"指定的路径. 打开此对话框会发现默认有这几条路径:C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE C:\Program Files\Microsoft Vi

c++ *.h和*.cpp在编译中的作用

首先,我们可以将所有东西都放在一个.cpp文件内.然后编译器就将这个.cpp编译成.obj,obj是什么东西?就是编译单元了. 一个程序,可以由一个编译单元组成,也可以有多个编译单元组成. 如果你不想让你的源代码变得很难阅读的话,就请使用多个编译单元吧.(一个函数不能放到两个编译单元里面,但两个以上就可以分别放在一个单元,也就是cpp里面)那么就是一个.cpp对应一个.obj,然后将所有的obj链接起来(通过一个叫链接器的程序),组成一个.exe,也就是程序了. 如果一个.cpp要用到另一个.c

VS 2010不显示头文件源文件和所有以前分类的文件夹,*.h 和*.cpp都显示在同一个文件

打开VS后不显示头文件源文件和所有以前分类的文件夹,*.h 和*.cpp都显示在同一个文件 点击右图红色指示显示所有文件夹按钮,就能恢复.

Qt Creator 中,如何更改h,cpp,ui的文件并不让ui失效

这个星期在使用qt,碰到一个很蛋疼的问题:创建对话框的时候,不小心输错了名字.而且是在很迟才发现的.这个时候对话框都已经布局差不多了,为了改名字,碰到更蛋疼的问题,改了名字后就无法使用转到槽的功能了.具体的错误显示如下: this application failed to start because - 经过一场大战,终于知道如何改名字,下面说下步骤: 1:更改h,cpp,ui的名字. 2:到ui文件中,把对象名字更改了.这里最好在右下角的属性框里改,更改后按下enter. 3:到cpp文件中

【C/C++学院】(5)面向对象编程练习--h和cpp分开编写

抽象一个点,一个圆,并判断点与圆的关系.(在圆内还是圆外) h文件进行类的声明: cpp文件为类的实现细节:主要注重的细节为: ================================================================================================================================= 工程代码如下: //MyCircle.h #pragma once #include"MyPoint.h&quo

61)普通类的.h和.cpp分离

1 //标头.h文件 2 3 //这个是在C中这样写 4 5 #ifndef HH_01//开始写小写 hh_01 然后选中这个 crtl+shift+u 就变成大写了 6 #define HH_01 7 8 9 #endif 10 11 12 13 //在C++这样写,防止文件被包含 14 #pragma once 15 #include<string> 16 #include<iostream> 17 using namespace std; 18 19 class perso

ClientSocket.h ClientSocket.cpp

ClientSocket.h 1 #pragma once 2 3 // CClientSocket 命令目标 4 #include "ClientProDlg.h" 5 #include "afxsock.h" 6 7 8 class CClientProDlg; 9 10 class CClientSocket : public CSocket //从CSocket类派生一个用于处理接收Socket的类 11 { 12 13 public: 14 CClient