2013-12-14 8 views
7

Wie zeichnet man in SDL2.0 mit Pixeln?Wie zeichne Pixel in SDL 2.0?

Ich versuche mich mit C++ vertraut zu machen, aber das ist sehr schwierig ohne schöne Bilder, also versuche ich ein sehr einfaches Grafikdisplay zu bekommen. Alles, was ich wirklich will, ist, mir ein Fenster zu geben, lassen Sie mich rgbα-Pixel darauf zeichnen und auf Informationen über diese Pixel zugreifen. Es mag andere Dinge geben, von denen ich weiß, dass ich mir dessen nicht bewusst bin, aber das ist alles, was gerade auf meiner Liste steht. Meine Forschung dazu hat mich dazu gebracht, SDL zu verwenden, die aktuelle Version ist 2.0.

Fast alle meine Grafik-Erfahrung kommt aus der Verwendung von JavaScript auf einem <canvas>. Das meiste des anderen Bit kommt von meinem Rechner, der diese wirklich ehrfürchtige Pxl-On() Befehl hat, so einfach.

Ich benutze MinGW für mein C++, wenn es darauf ankommt. Auch, wenn es etwas besseres gibt als SDL2.0 für das, was ich brauche, ist der Rat willkommen.


** „besser“ bedeutet „enthält, was Funktionalität, die ich brauche, aber insgesamt weniger Funktionalität als SDL2.0 und/oder eine intuitivere/weniger komplex *** API als SDL2.0.“

*** Weniger Codezeilen, um die gleiche Aufgabe zu erfüllen.

Antwort

7

Ich weiß nicht, wie Ihr Code strukturiert ist. Angenommen, Sie haben einen SDL_Window und einen SDL_Renderer, müssen Sie nur SDL_RenderDrawPoint(renderer, x, y) aufrufen.

Wenn Sie weder einen Renderer noch ein Fenster haben, können Sie beide mit SDL_CreateWindowAndRenderer() erstellen. Zum Beispiel:

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

Dies sollte ein Pixel in der Mitte des Bildschirms zeichnen. Ein Pixel zu lesen ist etwas komplizierter. Sie können SDL_RenderReadPixels() verwenden, es ist zum Lesen eines Bereichs gedacht, aber Sie können immer einen Bereich von 1x1 angeben. Lesen Sie die wiki page, wenn Sie es wirklich brauchen.

Wenn Sie viele Probleme mit SDL2 haben, empfehlen wir Ihnen, die Lazy Foo tutorials zu lesen. Die SDL2-Sektion ist noch in Arbeit, aber es gibt genug Material, um mit dem Lernen zu beginnen.

+0

Dank! Prolly sollte diese gesehen haben; war dumm. Es tut uns leid. – Jordan

2

Ich finde Python + PySDL2 einfacher zu prototypieren mit. Debuggen ist auch lustig, weil es für Pixeldarstellungen sehr langweilig ist. =) Ist die komplette Code:

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

Runnable Beispiel

Zeichnet eine diagonale Linie rote Pixel für Pixel auf dem Bildschirm unter Verwendung 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; 
} 

Compile mit:

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

auf libsdl 2.0.2, 15.10 Ubuntu getestet.

Wenn Sie ein großes Rechteck von Pixeln auf einmal einstellen möchten, z.den gesamten Bildschirm oder ein Sprite, verwenden Sie SDL_Texture + SDL_RenderCopy und möglicherweise SDL_TEXTUREACCESS_STREAMING, da das viel schneller sein wird. Beispiele an: