2013-12-14 19 views
7

Come si disegna con i pixel in SDL2.0?Come disegnare pixel in SDL 2.0?

Sto cercando di familiarizzare con C++, ma è molto difficile fare a meno delle belle immagini, quindi sto cercando di far funzionare una visualizzazione grafica di base. Tutto quello che voglio davvero fare è darmi una finestra, lasciami disegnare pixel rgbα su di esso e accedere alle informazioni su quei pixel. Potrebbero esserci altre cose di cui non sono a conoscenza, ma questo è tutto ciò che è nella mia lista in questo momento. La mia ricerca su questo mi ha portato a provare a utilizzare SDL, la versione corrente è 2.0.

Quasi tutta la mia esperienza grafica deriva dall'uso di JavaScript su un <canvas>. La maggior parte dell'altro bit proviene dalla mia calcolatrice, che ha questo veramente comando impressionante Pxl-On(), così facile.

Sto usando MinGW per il mio C++, se è importante. Inoltre, se c'è qualcosa di meglio ** là fuori di SDL2.0 per ciò di cui ho bisogno, consiglio benvenuto.


** "meglio" significa "contiene quali funzionalità ho bisogno, ma la funzionalità meno totale di SDL2.0, e/o ha un/meno complesso *** API più intuitiva che SDL2.0".

*** Meno righe di codice per eseguire lo stesso compito.

risposta

7

Non so come sia strutturato il tuo codice. Supponendo che tu abbia un SDL_Window e un SDL_Renderer, devi solo chiamare SDL_RenderDrawPoint(renderer, x, y).

Se non si dispone di un renderer o di una finestra, è possibile creare entrambi con SDL_CreateWindowAndRenderer(). Ad esempio:

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); 

Questo dovrebbe disegnare un pixel al centro dello schermo. Leggere un pixel è un po 'più complicato. È possibile utilizzare SDL_RenderReadPixels(), è stato creato per leggere un'area, ma è possibile specificare un'area di 1x1. Leggi lo wiki page se ne hai davvero bisogno.

Se si riscontrano problemi con SDL2, si consiglia di leggere lo Lazy Foo tutorials. La sezione SDL2 è ancora in fase di sviluppo, ma c'è abbastanza materiale per iniziare l'apprendimento.

+0

Grazie! Il prulino avrebbe dovuto vederli; era stupido. Scusate. – Jordan

2

Trovo Python + PySDL2 più facile da prototipare con. Anche il debug è divertente, perché è una specie di slooow per la grafica pixel. =) Ecco il codice completo:

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

esempio Runnable

Traccia una linea trasversale rossa pixel per pixel sullo schermo utilizzando 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; 
} 

Compilare con:

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

provata su libsdl 2.0.2, Ubuntu 15.10.

Se si desidera impostare un grande rettangolo di pixel contemporaneamente, ad es.l'intero schermo o uno sprite, utilizzare SDL_Texture + SDL_RenderCopy e possibilmente SDL_TEXTUREACCESS_STREAMING, poiché sarà molto più veloce. Esempi a: