目次 - API(機能別) - 2Dレンダリング - SDL_RenderCopy

# SDL_RenderCopy

テクスチャの一部を現在のレンダーターゲットにコピーする

## 構文

`int SDL_RenderCopy(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* srcrect, const SDL_Rect* dstrect)`

## 引数

renderer | レンダリングコンテキスト
texture | コピー元テクスチャ (詳細を参照すること)
srcrect | コピー元のSDL_Rect. NULLのとき全体
dstrect | コピー先のSDL_Rect. NULLのとき全体. テクスチャはこの領域に合うように拡大縮小される.

## 戻り値

成功のとき0, 失敗のとき負の数のエラーコードを戻す. SDL_GetError()で詳細を知ることができる.

## サンプルコード

``

    #include "SDL.h"
    #define SHAPE_SIZE 16

    int main(int argc, char *argv[])
    {
      SDL_Window* Main_Window;
      SDL_Renderer* Main_Renderer;
      SDL_Surface* Loading_Surf;
      SDL_Texture* Background_Tx;
      SDL_Texture* BlueShapes;

      /* レンダリングする(テクスチャ内の)コピー元と(画面の)コピー先の領域 */
      SDL_Rect SrcR;
      SDL_Rect DestR;

      SrcR.x = 0;
      SrcR.y = 0;
      SrcR.w = SHAPE_SIZE;
      SrcR.h = SHAPE_SIZE;

      DestR.x = 640 / 2 - SHAPE_SIZE / 2;
      DestR.y = 580 / 2 - SHAPE_SIZE / 2;
      DestR.w = SHAPE_SIZE;
      DestR.h = SHAPE_SIZE;

      /* レンダリングの前にウィンドウとレンダラーを生成する */
      Main_Window = SDL_CreateWindow("SDL_RenderCopy Example",
      SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 580, 0);
      Main_Renderer = SDL_CreateRenderer(Main_Window, -1, SDL_RENDERER_ACCELERATED);

      /* 背景画像を読み込む. SDL_LoadBMP()はサーフェイスを戻すので,
      それを高速にコピーできるテクスチャに変換する */
      Loading_Surf = SDL_LoadBMP("Background.bmp");
      Background_Tx = SDL_CreateTextureFromSurface(Main_Renderer, Loading_Surf);
      SDL_FreeSurface(Loading_Surf);  /* テクスチャは得られた -> サーフェイスを解放する */

      /* 追加のテクスチャを読み込む */
      Loading_Surf = SDL_LoadBMP("Blueshapes.bmp");
      BlueShapes = SDL_CreateTextureFromSurface(Main_Renderer, Loading_Surf);
      SDL_FreeSurface(Loading_Surf);

      /* ここが最も関心のある部分である.
      Blueshapes.bmpの選択された部分を画面の中央にレンダリングする */
      int i;
      int n;
      for(i=0;i<2;i++)
      {
        for(n=0;n<4;n++)
        {
          SrcR.x = SHAPE_SIZE * (n % 2);
          if(n > 1)
          {
            SrcR.y = SHAPE_SIZE;
          }
          else
          {
            SrcR.y = 0;
          }

          /* 背景をレンダリングする. NULLはコピー元とコピー先がデフォルトであることを意味する */
          SDL_RenderCopy(Main_Renderer, Background_Tx, NULL, NULL);

          /* 図形をレンダリングしてアニメーションにする */
          SDL_RenderCopy(Main_Renderer, BlueShapes, &SrcR, &DestR);
          SDL_RenderPresent(Main_Renderer);
          SDL_Delay(500);
        }
      }

      /* このレンダラーは大きなキャンバスのようなものである:
      RenderCopy()で画像を加えると, その度に上書きされる.
      新しいデータがどのようにブレンドされるかは変更できる.
      あなたの「絵」が完成すれば, それをSDL_RenderPresent()を使って見せることができる */

      /* SDL 1.2ユーザへのヒント: レンダラーが理解しづらいならば, 1.2のサーフェイスとコピーに置き換えて,
      レンダラーはメインサーフェイス, SDL_RenderCopy()はメインサーフェイスへのコピー,
      SDL_RenderPresent()は旧バージョンのSDL_Flip()関数と考えればよいかもしれない */

      SDL_DestroyTexture(BlueShapes);
      SDL_DestroyTexture(Background_Tx);
      SDL_DestroyRenderer(Main_Renderer);
      SDL_DestroyWindow(Main_Window);
      SDL_Quit();

      return 0;
    }

## 詳細

テクスチャはSDL_SetTextureBlendMode()で設定したブレンドモードでコピー先のテクスチャとブレンドされる.

テクスチャの色はSDL_SetTextureColorMod()で設定した色の影響を受ける.

テクスチャのα値はSDL_SetTextureAlphaMod()で設定したα値の影響を受ける.

## 関連項目(関数)

SDL_RenderCopyEx
SDL_SetTextureAlphaMod
SDL_SetTextureBlendMode
SDL_SetTextureColorMod

## SDL Wikiへのリンク

SDL_RenderCopy - SDL Wiki