¿Cómo dibujar píxeles en SDL 2.0?

4 minutos de lectura

avatar de usuario
Jordán

¿Cómo se dibuja con píxeles en SDL2.0?

Estoy tratando de familiarizarme con C ++, pero esto es muy difícil de hacer sin imágenes bonitas, por lo que estoy tratando de hacer funcionar una visualización de gráficos muy básica. Todo lo que realmente quiero que haga es darme una ventana, permitirme dibujar píxeles rgbα en ella y acceder a información sobre esos píxeles. Puede haber otras cosas que quiero de las que no estoy al tanto, pero eso es todo lo que está en mi lista en este momento. Mi investigación sobre esto me ha llevado a intentar usar SDL, siendo la versión actual 2.0.

Casi toda mi experiencia gráfica proviene del uso de JavaScript en un <canvas>. La mayor parte del otro bit proviene de mi calculadora, que tiene este De Verdad increíble Pxl-On() comando, tan fácil.

Estoy usando MinGW para mi C++, si importa. Además, si hay algo mejor** que SDL2.0 para lo que necesito, se agradecen los consejos.


** “mejor” significa “contiene la funcionalidad que necesito, pero menos funcionalidad total que SDL2.0 y/o tiene una API más intuitiva/menos compleja*** que SDL2.0”.

*** Menos líneas de código para realizar la misma tarea.

avatar de usuario
Ciro Santilli Путлер Капут 六四事

ejemplo ejecutable

Dibuja una línea diagonal roja píxel por píxel en la pantalla usando SDL_RenderDrawPoint.

ingrese la descripción de la imagen aquí

C Principal

#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 ascendente.

Compilar y ejecutar:

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

Si desea configurar un gran rectángulo de píxeles a la vez, por ejemplo, la pantalla completa o un sprite, use SDL_Texture + SDL_RenderCopy y posiblemente SDL_TEXTUREACCESS_STREAMING, ya que será mucho más rápido. Ejemplos en:

  • ¿Qué es un Blit en SDL?
  • ¿Representación de píxeles de una matriz de valores RGB en SDL 1.2?

Probado en libsdl 2.0.2, Ubuntu 15.10.

avatar de usuario
TalesM

No sé cómo está estructurado tu código. Suponiendo que tiene un SDL_Window y un SDL_Renderer, solo tiene que llamar SDL_RenderDrawPoint(renderer, x, y).

Si no tiene un renderizador ni una ventana, puede crear ambos con SDL_CreateWindowAndRenderer(). Por ejemplo:

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

Esto debería dibujar un píxel en el medio de la pantalla. Leer un píxel es un poco más complicado. Puedes usar SDL_RenderReadPixels(), está hecho para leer un área, pero siempre puede especificar un área de 1×1. Leer el pagina wiki si realmente lo necesitas.

Si tiene muchos problemas con SDL2, le recomendamos que lea el Tutoriales de Lazy Foo. La sección SDL2 todavía es un trabajo en progreso, pero hay suficiente material para comenzar a aprender.

  • ¡Gracias! Prolly debería haberlos visto; estaba siendo estúpido. Lo siento.

    – Jordania

    21 de diciembre de 2013 a las 16:58

avatar de usuario
anatoly techtonik

encuentro python + PySDL2 más fácil de prototipo con. La depuración también es divertida, porque es muy lenta para los gráficos de píxeles. =) Aquí está el código completo:

"""
The code is placed into public domain
by anatoly techtonik <techtonik@gmail.com>
"""

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad