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.
Ciro Santilli OurBigBook.com
Lauffähiges Beispiel
Zeichnet mit Pixel für Pixel eine diagonale rote Linie auf dem Bildschirm SDL_RenderDrawPoint.
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;
}
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.
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.
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
13649200cookie-checkWie zeichnet man Pixel in SDL 2.0?yes