2013-12-14 115 views
7

SDL2.0中的像素是如何繪製的?我試圖熟悉C++,但這是非常困難的沒有漂亮的圖片,所以我試圖得到一個非常基本的圖形顯示的東西運行。我真正想要它做的就是給我一個窗口,讓我畫上rgbα像素,並獲取有關這些像素的信息。我可能還有其他一些我不知道的事情,但現在就在我的列表中。我對此的研究使我嘗試使用SDL,當前版本爲2.0。如何在SDL 2.0中繪製像素?

幾乎我所有的圖形體驗都來自使用JavaScript的<canvas>。其他大部分位都來自我的計算器,它有這個真的真棒Pxl-On()命令,很容易。

我使用MinGW爲我的C++,如果它很重要。另外,如果我需要的東西比SDL2.0更好,建議歡迎。


**「好」是指「包含什麼功能,我需要,但比SDL2.0更少的總功能,和/或具有比SDL2.0更直觀的/不那麼複雜*** API。」

***完成相同任務的代碼行數少。

回答

7

我不知道你的代碼是如何構造的。假設你有一個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 tutorials。 SDL2部分仍在進行中,但有足夠的材料可以開始學習。

+0

感謝:在例子! Prolly應該看到那些;是愚蠢的。抱歉。 – Jordan

2

我覺得Python + PySDL2更容易原型。調試也很有趣,因爲它對於像素圖形來說非常適合。 =)這裏是完整的代碼:

""" 
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 
3

可運行例如

通過像素使用SDL_RenderDrawPoint在屏幕上繪製一個對角線紅線像素。

enter image description here

#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; 
} 

編譯:

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

測試上libsdl 2.0.2,Ubuntu的15.10。

如果您想一次設置一個大的矩形像素,例如整個屏幕或精靈,使用SDL_Texture + SDL_RenderCopy和可能的SDL_TEXTUREACCESS_STREAMING,因爲這將更快。