web-dev-qa-db-ja.com

SDL 2.0でピクセルを描画する方法

SDL2.0でどのようにピクセルで描画しますか?

私はC++に慣れるようにしていますが、これをきれいな写真なしで行うのは非常に難しいので、非常に基本的なグラフィックディスプレイを実行しようとしています。私が本当にやりたいことは、ウィンドウを表示し、その上にrgbαピクセルを描画し、それらのピクセルに関する情報にアクセスさせることだけです。気づいていないことが他にもあるかもしれませんが、それが現在私のリストにあるすべてです。これに関する私の研究により、SDLを使用するようになりました。現在のバージョンは2.0です。

ほとんどすべてのグラフィックスエクスペリエンスは、_<canvas>_でJavaScriptを使用することから得られます。他のほとんどのビットは私の計算機からのものです。これにはreally awesome Pxl-On()コマンドが含まれているので、とても簡単です。

必要に応じて、C++にMinGWを使用しています。また、SDL2.0よりも優れた機能**が必要な場合は、アドバイスを歓迎します。


**「より良い」とは、「必要な機能が含まれているが、SDL2.0よりも総機能が少ない、またはSDL2.0よりも直感的で複雑でない*** APIがある」という意味です。

***同じタスクを実行するための少ないコード行。

16
Jordan

コードの構造がわかりません。 SDL_WindowとSDL_Rendererがあるとすると、SDL_RenderDrawPoint(renderer, x, y)を呼び出すだけです。

レンダラーもウィンドウもない場合は、SDL_CreateWindowAndRenderer()で両方を作成できます。例えば:

_SDL_Window *window;
SDL_Renderer *renderer;
SDL_CreateWindowAndRenderer(800, 600, 0, &window, &renderer);

//Probably on a loop
  SDL_RenderDrawPoint(renderer, 400, 300); //Renders on middle of screen.
  SDL_RenderPresent(renderer);
_

これにより、画面の中央にピクセルが描画されます。ピクセルを読み取ることはもう少し複雑です。 SDL_RenderReadPixels()を使用できます。これは領域を読み取るために作成されていますが、アウェイは1x1の領域を指定できます。本当に必要な場合は wiki page を読んでください。

SDL2で多くの問題を抱えている場合は、 Lazy Fooチュートリアル を読むことをお勧めします。 SDL2セクションはまだ作業中ですが、学習を始めるのに十分な資料があります。

12
TalesM

実行可能な例

SDL_RenderDrawPointを使用して、斜めの赤い線をピクセル単位で画面に描画します。

enter image description here

main.c

#include <stdlib.h>

#include <SDL2/SDL.h>

#define WINDOW_WIDTH 600

int main(void) {
    SDL_Event event;
    SDL_Renderer *renderer;
    SDL_Window *window;
    int i;

    SDL_Init(SDL_INIT_VIDEO);
    SDL_CreateWindowAndRenderer(WINDOW_WIDTH, WINDOW_WIDTH, 0, &window, &renderer);
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
    SDL_RenderClear(renderer);
    SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
    for (i = 0; i < WINDOW_WIDTH; ++i)
        SDL_RenderDrawPoint(renderer, i, i);
    SDL_RenderPresent(renderer);
    while (1) {
        if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
            break;
    }
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_Quit();
    return EXIT_SUCCESS;
}

GitHubアップストリーム

コンパイルして実行:

gcc -std=c89 -Wextra -pedantic-errors -o main.out main.c -lSDL2
./main.out

大きなピクセルの長方形を一度に設定したい場合は、画面全体またはスプライトの場合、SDL_Texture + SDL_RenderCopyを使用し、場合によってはSDL_TEXTUREACCESS_STREAMINGを使用します。例:

Libsdl 2.0.2、Ubuntu 15.10でテスト済み。

Python + PySDL2 でプロトタイプを作成する方が簡単です。ピクセルグラフィックスのveeeeryが遅いため、デバッグもおもしろいです。)=)これが完全なコードです。

"""
The code is placed into public domain
by anatoly techtonik <[email protected]>
"""

import sdl2
import sdl2.ext

sdl2.ext.init()

window = sdl2.ext.Window('', size=(300, 100))
window.show()

renderer = sdl2.ext.Renderer(window)
renderer.draw_point([10,10], sdl2.ext.Color(255,255,255))
renderer.present()

running = True
while running:
  for e in sdl2.ext.get_events():
    if e.type == sdl2.SDL_QUIT:
      running = False
      break
    if e.type == sdl2.SDL_KEYDOWN:
      if e.key.keysym.sym == sdl2.SDLK_ESCAPE:
        running = False
        break
1