es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

C y SDL cómo mover un punto en la pantalla

Estoy usando SDL junto con c para construir un juego simple donde el puntito se mueve en la pantalla. Intenté usar un bucle for pero no ayudó ya que se crea una estela, ¿cómo puedo mover un punto en la pantalla? Aquí está mi código:

#include <stdio.h>
#include <unistd.h>
#include <stdbool.h>
#include <time.h>
#include <malloc.h>
#include <math.h>
#include "SDL/include/SDL.h"
#include "SDL/include/SDL_render.h"

#define WIDTH 800.0f
#define HEIGHT 600.0f

int main()
{
  bool quit = false;
  SDL_Event event;

  // inicializar SDL
  SDL_Init(SDL_INIT_VIDEO);
  SDL_Window * window = SDL_CreateWindow("Dibujo de líneas con SDL2",
      SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, 0);

  SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, 0);

  // manejar eventos
  while (!quit)
  {
      SDL_Delay(10);
      SDL_PollEvent(&event);

      switch (event.type)
      {
          case SDL_QUIT:
              quit = true;
              break;
      }

      SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
      SDL_RenderClear(renderer);

      SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);

      SDL_RenderDrawLine(renderer, 100, 100, 500, 500);

      /*for (int i = 0; i < 100; i++) {*/
        /*SDL_RenderDrawPoint(renderer, 150 + i, 150);*/
        /*sleep(1);*/
        /*SDL_RenderPresent(renderer);*/
      /*}*/

      // renderizar ventana
      SDL_RenderPresent(renderer);
  }

  // limpiar
  SDL_DestroyRenderer(renderer);
  SDL_DestroyWindow(window);
  SDL_Quit();

  return 0;
}

Lo que quiero que suceda es que un punto cambie de posición en la pantalla. ¿Cómo se puede hacer para eliminar el punto y volver a pintarlo en otro lugar de la pantalla?</math.h></malloc.h></time.h></stdbool.h></unistd.h></stdio.h>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para mover un punto en la pantalla, puedes utilizar la función SDL_RenderDrawPoint() en un bucle con diferentes coordenadas cada vez para simular el movimiento. Antes de renderizar un nuevo punto, necesitarás borrar el punto anterior dibujando encima de él con el color de fondo. Aquí tienes un ejemplo de modificación del código para lograr esto:

    #include <stdio.h>
    #include <stdbool.h>
    #include "SDL/include/SDL.h"
    #include "SDL/include/SDL_render.h"
    
    #define WIDTH 800
    #define HEIGHT 600
    
    int main()
    {
      bool quit = false;
      int posX = 0, posY = 0; // posición inicial del punto
    
      SDL_Event event;
      SDL_Init(SDL_INIT_VIDEO);
      SDL_Window * window = SDL_CreateWindow("Punto en Movimiento", SDL_WINDOWPOS_UNDEFINED, 
                                             SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, 0);
      SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, 0);
    
      while (!quit)
      {
        SDL_Delay(10);
        SDL_PollEvent(&event);
    
        switch (event.type)
        {
          case SDL_QUIT:
            quit = true;
            break;
        }
    
        // Limpiar el renderizador con color negro
        SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
        SDL_RenderClear(renderer);
    
        // Dibujar el punto en la nueva posición
        SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
        SDL_RenderDrawPoint(renderer, posX, posY);
    
        // Actualizar las coordenadas para el siguiente fotograma
        posX = (posX + 1) % WIDTH; // mover a la derecha, envolver en el borde de la pantalla
        posY = (posY + 1) % HEIGHT; // mover hacia abajo, envolver en el borde de la pantalla
    
        SDL_RenderPresent(renderer);
      }
    
      // Limpiar
      SDL_DestroyRenderer(renderer);
      SDL_DestroyWindow(window);
      SDL_Quit();
    
      return 0;
    }
    

    En este ejemplo, utilizamos las variables posX y posY para mantener el seguimiento de la posición del punto. Las actualizamos en cada iteración del bucle para mover el punto en diagonal por la pantalla. También envolvemos la posición alrededor de los bordes de la pantalla para mantener el punto dentro de los límites. Finalmente, borramos el renderizador con el color negro utilizando SDL_RenderClear() para borrar el punto anterior antes de dibujar el nuevo con SDL_RenderDrawPoint().</stdbool.h></stdio.h>

Comments are closed.