⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graphicentity.cpp.svn-base

📁 坦克大战游戏完整全套源代码
💻 SVN-BASE
字号:
#include <hgeFont.h>
#include <hgeCurvedani.h>
#include <caRect.h>
#include "common/graphicEntity.h"

using cAni::Rectf;

Point2f RenderQueue::getViewerPos()
{
    if (viewer)
    {
        viewerPos = viewer->getViewerPos() - windowSize / 2;
    }
    return viewerPos;
}

Rectf RenderQueue::getWindowViewer()
{
    Rectf r;
    r.leftTop = getViewerPos();
    r.rightBottom = windowSize + r.leftTop;
    return r; 
}

void RenderQueue::flush()
{
    HGE *hge = hgeCreate(HGE_VERSION);
    const Point2f viewerPos = getViewerPos();
    const Rectf viewRange = getWindowViewer();
    const Rectf windowRange(0, getWindowSize().x, 0, getWindowSize().y);
    

    //Rect clip;
    //clip.leftTop = Point2s(100, 100);
    //clip.rightBottom = Point2s(200, 200);
    hge->Gfx_SetTransform();
    for (int i = MaxLayers - 1; i >= 0; --i)
    {
        vector<GfxObj> &go = gfxobjs[i];
        for (size_t j = 0; j < go.size(); ++j)
        {
            const GfxObj &obj = go[j];
            switch(obj.type)
            {
            case GfxObj::T_Anim:
                {
                    Point2f pos = obj.a;
                    if (!obj.screenPos)
                        pos -= viewerPos;
                    // FIXME: 100 is magic number, remove it by anim clip range
                    if (pos.x > windowRange.rightBottom.x + 100 || pos.x < windowRange.leftTop.x - 100 ||
                        pos.y < windowRange.leftTop.y - 100 || pos.y > windowRange.rightBottom.y + 100)
                        break;
                    //hge->Gfx_SetTransform();
                    hge->Gfx_SetTransform(0, 0, pos.x, pos.y, obj.direction/* - viewerOrientation*/, 1, 1);
                    obj.anim->render(obj.frame, 0);//&clip);
                    hge->Gfx_SetTransform();
                }
                break;
            case GfxObj::T_Line:
                {
                    Rectf objRange(
                        min(obj.a.x, obj.b.x + .1f),
                        max(obj.a.x, obj.b.x + .1f),
                        min(obj.a.y, obj.b.y + .1f),
                        max(obj.a.y, obj.b.y + .1f));
                    if (obj.screenPos)
                    {
                        Rectf x = objRange & windowRange;
                        if (x.Visible())
                        {
                            hge->Gfx_RenderLine(obj.a.x, obj.a.y,
                                obj.b.x, obj.b.y, obj.color);
                        }
                    }
                    else
                    {
                        Rectf x = objRange & viewRange;
                        if (x.Visible())
                        {
                            hge->Gfx_RenderLine(obj.a.x - viewerPos.x, obj.a.y - viewerPos.y,
                                obj.b.x - viewerPos.x, obj.b.y - viewerPos.y, obj.color);
                        }
                    }
                }
                break;
            case GfxObj::T_Text:
                if (obj.screenPos)
                    obj.font->Render(obj.a.x, obj.a.y, obj.align, obj.str.c_str());
                else
                    obj.font->Render(obj.a.x - viewerPos.x, obj.a.y - viewerPos.y, obj.align, obj.str.c_str());
                break;
            case GfxObj::T_Triple:
                if (obj.screenPos)
                    hge->Gfx_SetTransform(0, 0, obj.a.x, obj.a.y, 0, 1, 1);
                else
                    hge->Gfx_SetTransform(0, 0, obj.a.x - viewerPos.x, obj.a.y - viewerPos.y, 0, 1, 1);

                hge->Gfx_RenderTriple(&obj.triple);
                hge->Gfx_SetTransform();
                break;
            case GfxObj::T_Quad:
                hge->Gfx_RenderQuad(&obj.quad);
                break;
            }
        }
        go.clear();
    }
    hge->Gfx_SetTransform();
    hge->Release();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -