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.
Ciro Santilli Путлер Капут 六四事
ejemplo ejecutable
Dibuja una línea diagonal roja píxel por píxel en la pantalla usando SDL_RenderDrawPoint.
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;
}
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.
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
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?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
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