Wie zeichnet man Pixel in SDL 2.0?

Lesezeit: 3 Minuten

Benutzer-Avatar
Jordanien

Wie zeichnet man mit Pixeln in SDL2.0?

Ich versuche, mich mit C++ vertraut zu machen, aber das ist ohne schöne Bilder sehr schwierig, also versuche ich, eine sehr einfache Grafikanzeige zum Laufen zu bringen. Alles, was ich wirklich möchte, ist, dass es mir ein Fenster gibt, rgbα-Pixel darauf zeichnen und auf Informationen über diese Pixel zugreifen kann. Es gibt vielleicht andere Dinge, die ich will, von denen ich mir nicht bewusst bin, aber das ist alles, was im Moment auf meiner Liste steht. Meine diesbezüglichen Recherchen haben mich dazu veranlasst, SDL zu verwenden, die aktuelle Version ist 2.0.

Fast meine gesamte Grafikerfahrung stammt aus der Verwendung von JavaScript auf a <canvas>. Das meiste andere Bit kommt von meinem Taschenrechner, der das hat Ja wirklich fantastisch Pxl-On() Befehl, so einfach.

Ich verwende MinGW für mein C++, falls es darauf ankommt. Wenn es etwas Besseres** als SDL2.0 für das gibt, was ich benötige, sind Ratschläge willkommen.


** „besser“ bedeutet „enthält die von mir benötigte Funktionalität, aber weniger Gesamtfunktionalität als SDL2.0 und/oder hat eine intuitivere/weniger komplexe*** API als SDL2.0.“

*** Weniger Codezeilen für dieselbe Aufgabe.

Benutzer-Avatar
Ciro Santilli OurBigBook.com

Lauffähiges Beispiel

Zeichnet mit Pixel für Pixel eine diagonale rote Linie auf dem Bildschirm SDL_RenderDrawPoint.

Geben Sie hier die Bildbeschreibung ein

Haupt 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-Upstream.

Kompilieren und ausführen:

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

Wenn Sie ein großes Rechteck aus Pixeln auf einmal setzen möchten, zB den gesamten Bildschirm oder ein Sprite, verwenden Sie SDL_Texture + SDL_RenderCopy und möglicherweise SDL_TEXTUREACCESS_STREAMING, da das viel schneller geht. Beispiele unter:

  • Was ist ein Blit in SDL?
  • Pixel aus einem Array von RGB-Werten in SDL 1.2 rendern?

Getestet auf libsdl 2.0.2, Ubuntu 15.10.

Benutzer-Avatar
GeschichtenM

Ich weiß nicht, wie dein Code aufgebaut ist. Angenommen, Sie haben ein SDL_Window und einen SDL_Renderer, müssen Sie nur anrufen SDL_RenderDrawPoint(renderer, x, y).

Wenn Sie weder einen Renderer noch ein Fenster haben, können Sie beides 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 verwenden SDL_RenderReadPixels(), es ist zum Lesen eines Bereichs gedacht, aber Sie können immer einen Bereich von 1×1 angeben. Lies das Wiki-Seite wenn du es wirklich brauchst.

Wenn Sie große Probleme mit SDL2 haben, empfehlen wir Ihnen, die zu lesen Lazy Foo-Tutorials. Der SDL2-Abschnitt ist noch in Arbeit, aber es gibt genug Material, um mit dem Lernen zu beginnen.

Benutzer-Avatar
anatoly techtonik

Ich finde Python+ PySDL2 leichter zu prototypisieren. Debug ist auch lustig, weil es für Pixelgrafiken seeeehr langsam ist. =) Hier ist der vollständige 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

1364920cookie-checkWie zeichnet man Pixel in SDL 2.0?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy