web-dev-qa-db-fra.com

Comment dessiner des pixels en SDL 2.0?

Comment dessiner avec des pixels dans SDL2.0?

J'essaie de me familiariser avec C++, mais c'est très difficile à faire sans de jolies images, donc j'essaie de faire fonctionner un affichage graphique très basique. Tout ce que je veux vraiment, c'est me donner une fenêtre, me laisser dessiner des pixels RVB dessus et accéder aux informations sur ces pixels. Il y a peut-être d'autres choses dont je ne suis pas au courant, mais c'est tout ce qui est sur ma liste en ce moment. Mes recherches à ce sujet m'ont amené à essayer d'utiliser SDL, la version actuelle étant 2.0.

Presque toute mon expérience graphique provient de l'utilisation de JavaScript sur un <canvas>. La plupart des autres bits proviennent de ma calculatrice, qui a cette commande vraiment impressionnante Pxl-On(), si facile.

J'utilise MinGW pour mon C++, si cela importe. De plus, s'il y a quelque chose de mieux ** que SDL2.0 pour ce dont j'ai besoin, des conseils bienvenus.


** "mieux" signifie "contient les fonctionnalités dont j'ai besoin, mais moins de fonctionnalités totales que SDL2.0, et/ou possède une API *** plus intuitive/moins complexe que SDL2.0."

*** Moins de lignes de code pour accomplir la même tâche.

16
Jordan

Je ne sais pas comment votre code est structuré. En supposant que vous avez un SDL_Window et un SDL_Renderer, il vous suffit d'appeler SDL_RenderDrawPoint(renderer, x, y).

Si vous n'avez pas de rendu ni de fenêtre, vous pouvez créer les deux avec SDL_CreateWindowAndRenderer (). Par exemple:

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

Cela devrait dessiner un pixel au milieu de l'écran. Lire un pixel est un peu plus compliqué. Vous pouvez utiliser SDL_RenderReadPixels(), il est fait pour lire une zone, mais vous pouvez toujours spécifier une zone de 1x1. Lisez la page wiki si vous en avez vraiment besoin.

Si vous rencontrez beaucoup de problèmes avec SDL2, nous vous recommandons de lire les tutoriels Lazy Foo . La section SDL2 est toujours en cours d'élaboration, mais il y a suffisamment de matériel pour commencer à apprendre.

12
TalesM

Exemple exécutable

Trace une ligne diagonale pixel par pixel sur l'écran à l'aide de SDL_RenderDrawPoint.

enter image description here

principal 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 en amont .

Compiler et exécuter:

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

Si vous souhaitez définir un grand rectangle de pixels à la fois, par exemple l'écran entier ou un Sprite, utilisez SDL_Texture + SDL_RenderCopy et éventuellement SDL_TEXTUREACCESS_STREAMING, car ce sera beaucoup plus rapide. Exemples à:

Testé sur libsdl 2.0.2, Ubuntu 15.10.

Je trouve Python + PySDL2 plus facile à prototyper avec. Le débogage est aussi drôle, car il est lent pour les graphiques en pixels. =) Voici le code complet:

"""
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
1
anatoly techtonik