Hilfe (Bildschirm soll refreshen nicht jedes mal ...)

Kampfschaf

Newbie
Joined
Dec 12, 2008
Messages
13
Guten Abend!

In folgendem Code adde ich ein Bild durch Klick mit dem Stift an die gewünschte Position. Nunmöchte ich, wenn ich woanders inklicke (oder bewege) das dass Bild welches ich gerade geaddet habe mitkommt. Stattdessen fügt er ein weiteres hinzu und das alte bleibt an seiner Stelle. Das kann ich sicher 100 mal machen ^^ Ich brauche also nachdem 2. Klick einen refresh der Position des Bildes!

Danke schonmal!
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <SDL.h>
#include <SDL_image.h>

/* GP2X button mapping */
enum MAP_KEY
{
   VK_UP         , // 0
   VK_UP_LEFT    , // 1
   VK_LEFT       , // 2
   VK_DOWN_LEFT  , // 3
   VK_DOWN       , // 4
   VK_DOWN_RIGHT , // 5
   VK_RIGHT      , // 6
   VK_UP_RIGHT   , // 7
   VK_START      , // 8
   VK_SELECT     , // 9
   VK_FL         , // 10
   VK_FR         , // 11
   VK_FA         , // 12
   VK_FB         , // 13
   VK_FX         , // 14
   VK_FY         , // 15
   VK_VOL_UP     , // 16
   VK_VOL_DOWN   , // 17
   VK_TAT          // 18
};

/* The screen surface, joystick device */
SDL_Surface *screen = NULL;
SDL_Joystick *joy = NULL;
SDL_Event event;

SDL_Surface *image = IMG_Load("test.png");
SDL_Rect targetpos;

int done;
int MouseX;
int MouseY;
int picCount;

void Terminate(void)
{
   SDL_Quit();
#ifdef GP2X
   chdir("/usr/gp2x");
   execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL);
#endif
}

void showpic()
{
targetpos.x = targetpos.x;
targetpos.y = targetpos.y;
SDL_BlitSurface(image, NULL, screen, &targetpos);
SDL_Flip(screen);
}

int main (int argc, char *argv[])
{
   
   /* Initialize SDL */
   if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0) {
      fprintf (stderr, "Couldn't initialize SDL: %s\n", SDL_GetError ());
      exit (1);
   }
   atexit (Terminate);

   SDL_ShowCursor(SDL_DISABLE);
   
   /* Set 320x240 16-bits video mode */
   screen = SDL_SetVideoMode (320, 240, 16, SDL_SWSURFACE);
   if (screen == NULL) {
      fprintf (stderr, "Couldn't set 320x240x16 video mode: %s\n", SDL_GetError ());
      exit (2);
   }

   /* Check and open joystick device */
   if (SDL_NumJoysticks() > 0) {
      joy = SDL_JoystickOpen(0);
      if(!joy) {
         fprintf (stderr, "Couldn't open joystick 0: %s\n", SDL_GetError ());
      }
   }

#ifdef GP2X
   /* Only use GP2X code here */
#endif

#ifdef WIN32
   /* Only use Windows code here */
#endif
   int button, x=50, y=50;
   picCount = 0;
   done = 0;
   while (!done)
   {
      if (picCount >= 1) showpic();
       
      /* Check for events */
      while (SDL_PollEvent (&event))
      {

         switch (event.type)
         {
            case SDL_JOYBUTTONDOWN:
               /* if press Start button, terminate program */
               if ( event.jbutton.button == VK_START )
                  done = 1;
               break;
            case SDL_MOUSEBUTTONDOWN:
               MouseX = event.button.x;
               MouseY = event.button.y;
               targetpos.x = MouseX - 25;
               targetpos.y = MouseY - 25;
               picCount = picCount + 1;
               break;
            case SDL_JOYBUTTONUP:
               break;
            case SDL_QUIT:
               done = 1;
               break;
            default:
               break;
         }
      }

      /* Processing */
   }

   return 0;
}
 

purestrain

Still Fresh
Joined
Feb 28, 2007
Messages
171
Du muesstest schon den Bildschirm irgendwie loeschen... z.b. mit SDL_FilLRect. In deinem Fall wird der Buffer immer beibehalten und du hast noch veraltete grafiken drin.

Gruss
Michael
 

Kampfschaf

Newbie
Joined
Dec 12, 2008
Messages
13
Hmmm...

FillRect füllt doch nur den Bildschirm mit der gewünschten Farbe?
SDL_SWBuffer (oder so ^^) dann zeichnet er anscheinend nichts mehr und nichts funktioniert mehr!

In Visual Basic ist es auch möglich über eine Schleife den Monitor NEU zu rendern! In dem Fall nicht?
 

purestrain

Still Fresh
Joined
Feb 28, 2007
Messages
171
Wenn du ein Monitormodell hast, kannst den auch ueber eine Schleife rendern.... Nichtsdestotrotz musst du den Bildschirmbuffer wieder loeschen; oder nur bereiche davon.

Edit:
Das hat auch nichts mit VisualBasic oder C++ zu tun.
 
Top