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

📄 sdlgraphics.cpp

📁 Linux系统下的《红色警戒》游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            SDL_UnlockSurface(mTarget);        }    void SDLGraphics::drawVLine(int x, int y1, int y2)    {        ClipRectangle top = mClipStack.top();        x += top.xOffset;        y1 += top.yOffset;        y2 += top.yOffset;        if (x < top.x || x >= top.x + top.width)            return;            if (y1 > y2)        {            y1 ^= y2;            y2 ^= y1;            y1 ^= y2;        }        if (top.y > y1)        {            if (top.y > y2)            {                return;            }            y1 = top.y;        }        if (top.y + top.height <= y2)        {            if (top.y + top.height <= y1)            {                return;            }                  y2 = top.y + top.height - 1;        }            int bpp = mTarget->format->BytesPerPixel;            SDL_LockSurface(mTarget);            Uint8 *p = (Uint8 *)mTarget->pixels + y1 * mTarget->pitch + x * bpp;            Uint32 pixel = SDL_MapRGB(mTarget->format, mColor.r, mColor.g, mColor.b);            switch(bpp) {          case 1:          {              for (;y1 <= y2; ++y1)              {                   *p = pixel;                  p += mTarget->pitch;              }          } break;                case 2:          {              for (;y1 <= y2; ++y1)              {                  *(Uint16*)p = pixel;                  p += mTarget->pitch;              }          } break;                  case 3:            {              if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {                  for (;y1 <= y2; ++y1)                  {                      p[0] = (pixel >> 16) & 0xff;                      p[1] = (pixel >> 8) & 0xff;                      p[2] = pixel & 0xff;                      p += mTarget->pitch;                  }              }              else              {                  for (;y1 <= y2; ++y1)                  {                      p[0] = pixel & 0xff;                      p[1] = (pixel >> 8) & 0xff;                      p[2] = (pixel >> 16) & 0xff;                      p += mTarget->pitch;                  }              }           } break;            case 4:          {              for (;y1 <= y2; ++y1)              {                  if (mAlpha)                  {                      *(Uint32*)p = SDLAlpha32(pixel,*(Uint32*)p,mColor.a);                  }                  else                  {                      *(Uint32*)p = pixel;                  }                  p += mTarget->pitch;              }          } break;        } // end switch            SDL_UnlockSurface(mTarget);    }    void SDLGraphics::drawRectangle(const Rectangle& rectangle)    {        int x1 = rectangle.x;        int x2 = rectangle.x + rectangle.width - 1;        int y1 = rectangle.y;        int y2 = rectangle.y + rectangle.height - 1;        drawHLine(x1, y1, x2);        drawHLine(x1, y2, x2);        drawVLine(x1, y1, y2);        drawVLine(x2, y1, y2);        }    void SDLGraphics::drawLine(int x1, int y1, int x2, int y2)    {        if (x1 == x2)        {            drawVLine(x1, y1, y2);            return;        }        if (y1 == y2)        {            drawHLine(x1, y1, x2);            return;        }        ClipRectangle top = mClipStack.top();        x1 += top.xOffset;        y1 += top.yOffset;        x2 += top.xOffset;        y2 += top.yOffset;        // Draw a line with Bresenham                int dx = ABS(x2 - x1);        int dy = ABS(y2 - y1);        if (dx > dy)        {            if (x1 > x2)            {                // swap x1, x2                x1 ^= x2;                x2 ^= x1;                x1 ^= x2;                // swap y1, y2                y1 ^= y2;                y2 ^= y1;                y1 ^= y2;               }            if (y1 < y2)            {                int y = y1;                int p = 0;                            for (int x = x1; x <= x2; x++)                {                                if (top.isPointInRect(x, y))                    {                        if (mAlpha)                        {                            SDLputPixelAlpha(mTarget, x, y, mColor);                        }                        else                        {                                        SDLputPixel(mTarget, x, y, mColor);                        }                    }                                    p += dy;                                    if (p * 2 >= dx)                    {                        y++;                        p -= dx;                    }                }            }            else            {                int y = y1;                int p = 0;                            for (int x = x1; x <= x2; x++)                {                                if (top.isPointInRect(x, y))                    {                        if (mAlpha)                        {                            SDLputPixelAlpha(mTarget, x, y, mColor);                        }                        else                        {                                        SDLputPixel(mTarget, x, y, mColor);                        }                    }                                    p += dy;                                    if (p * 2 >= dx)                    {                        y--;                        p -= dx;                    }                }                        }        }        else        {            if (y1 > y2)            {                // swap y1, y2                y1 ^= y2;                y2 ^= y1;                y1 ^= y2;                // swap x1, x2                x1 ^= x2;                x2 ^= x1;                x1 ^= x2;               }            if (x1 < x2)            {                int x = x1;                int p = 0;                            for (int y = y1; y <= y2; y++)                {                                if (top.isPointInRect(x, y))                    {                        if (mAlpha)                        {                            SDLputPixelAlpha(mTarget, x, y, mColor);                        }                        else                        {                                        SDLputPixel(mTarget, x, y, mColor);                        }                    }                                    p += dx;                                    if (p * 2 >= dy)                    {                        x++;                        p -= dy;                    }                }            }            else            {                int x = x1;                int p = 0;                            for (int y = y1; y <= y2; y++)                {                                if (top.isPointInRect(x, y))                    {                        if (mAlpha)                        {                            SDLputPixelAlpha(mTarget, x, y, mColor);                        }                        else                        {                                        SDLputPixel(mTarget, x, y, mColor);                        }                    }                                    p += dx;                                    if (p * 2 >= dy)                    {                        x--;                        p -= dy;                    }                }                        }        }        }        void SDLGraphics::setColor(const Color& color)    {        mColor = color;            mAlpha = color.a != 255;            }    const Color& SDLGraphics::getColor()    {        return mColor;        }    void SDLGraphics::drawSDLSurface(SDL_Surface* surface, SDL_Rect source,                                     SDL_Rect destination)    {        ClipRectangle top = mClipStack.top();        destination.x += top.xOffset;        destination.y += top.yOffset;            SDL_BlitSurface(surface, &source, mTarget, &destination);            }}

⌨️ 快捷键说明

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