Newsgroup: it.comp.lang.c
Titolo: Pixel....che spariscono...

Ciao a tutti e grazie in anticipo per l'attenzione.
Il mio problema è con il seguente listato, che dovrebbe scrollare una
immagine sullo schermo in modalita 13h.
Solo che le dimensioni dei pixel sembrano alterate. Infatti se provate il
programma con una immagine di dimensioni 1024x768, e scrollate l'immagine
fino al limite destro, il valore di currentx e currenty (le coordinate del
primo punto in alto a sx dello schermo) non sono pari a 1024-320 . Come mai?
e soprattutto: come risolvere questo problema?
Grazie,
Tdx
/* inizio */
#include <conio.h>
#include "graph.h"
#include "input.h"
#define MAXSPEED 50
#define PATH "c:\\djgpp\\myfiles\\sfondo2.pcx"
typedef struct{
        char *data;
        unsigned short int x,y;
        unsigned short int dim_orizz,dim_vert;
} Window __attribute__ ((packed));
void getscreen(char *sfondo, char *dest, int x1, int y1, int
larghezzasfondo);
void getwindow(char *sfondo, Window *win, int x1, int y1, int
larghezzasfondo);
void putwindow(Window win, char *where);
void putflippedwindow(Window win, char *where);
void putmirrorwindow(Window win, char *where);
int createwindow(Window *win, int dim_orizz, int dim_vert);
int main()
{
 Pcx sfondo;
 int currentx,currenty,pixels;
 Window up,down,center;
 __djgpp_nearptr_enable();
 video_buffer += __djgpp_conventional_base;
currentx = currenty = 0;
 pixels = 1;
 up.x = 220; up.y = 0;
 down.x = 220; down.y = 100;
 center.x = 0; center.y = 0;
setvideomode(GRAPHICS);
 strcpy(sfondo.path, PATH);
 if(loadpcx(&sfondo)==-1)
 {
  printf("Errore!\n");
  __djgpp_nearptr_disable();
  return 1;
 }
 if(createwindow(&up, 100, 100)==1)
 {
  printf("Errore nella creazione della finestra superiore\n");
  __djgpp_nearptr_disable();
  return 1;
 }
 if(createwindow(&down, 100, 100)==1)
 {
  printf("Errore nella creazione della finestra inferiore\n");
  __djgpp_nearptr_disable();
  return 1;
 }
 if(createwindow(&center, 220, 200)==1)
 {
  printf("Errore nella creazione della finestra centrale\n");
  __djgpp_nearptr_disable();
  return 1;
 }
 getscreen(sfondo.pcx,video_buffer,currentx,currenty,sfondo.dim_orizz);
 key_init();
 while (!key_table[MAKE_ESC])
 {
    if(key_table[MAKE_UP] && currenty > 0)
    {
     currenty -=pixels;
     getwindow(sfondo.pcx, &center, currentx, currenty, sfondo.dim_orizz);
     getwindow(sfondo.pcx, &up, currentx, currenty, sfondo.dim_orizz);
     getwindow(sfondo.pcx, &down, currentx, currenty, sfondo.dim_orizz);
     //waitr();
     putwindow(center, video_buffer);
     putflippedwindow(up, video_buffer);
     putmirrorwindow(down, video_buffer);
    }
    if(key_table[MAKE_DOWN] && currenty < 282)
    {
     currenty +=pixels;
     getwindow(sfondo.pcx, &center, currentx, currenty, sfondo.dim_orizz);
     getwindow(sfondo.pcx, &up, currentx, currenty, sfondo.dim_orizz);
     getwindow(sfondo.pcx, &down, currentx, currenty, sfondo.dim_orizz);
     //waitr();
     putwindow(center, video_buffer);
     putflippedwindow(up, video_buffer);
     putmirrorwindow(down, video_buffer);
    }
    if(key_table[MAKE_RIGHT] && currentx < 403)
    {
     currentx +=pixels;
     getwindow(sfondo.pcx, &center, currentx, currenty, sfondo.dim_orizz);
     getwindow(sfondo.pcx, &up, currentx, currenty, sfondo.dim_orizz);
     getwindow(sfondo.pcx, &down, currentx, currenty, sfondo.dim_orizz);
     //waitr();
     putwindow(center, video_buffer);
     putflippedwindow(up, video_buffer);
     putmirrorwindow(down, video_buffer);
    }
    if(key_table[MAKE_LEFT] && currentx > 0)
    {
     currentx -=pixels;
     getwindow(sfondo.pcx, &center, currentx, currenty, sfondo.dim_orizz);
     getwindow(sfondo.pcx, &up, currentx, currenty, sfondo.dim_orizz);
     getwindow(sfondo.pcx, &down, currentx, currenty, sfondo.dim_orizz);
     //waitr();
     putwindow(center, video_buffer);
     putflippedwindow(up, video_buffer);
     putmirrorwindow(down, video_buffer);
    }
    //diagonali
    if(key_table[MAKE_Q] && currentx > 0 && currenty > 0)
    {
     currentx -=pixels;
     currenty -=pixels;
     getwindow(sfondo.pcx, &center, currentx, currenty, sfondo.dim_orizz);
     getwindow(sfondo.pcx, &up, currentx, currenty, sfondo.dim_orizz);
     getwindow(sfondo.pcx, &down, currentx, currenty, sfondo.dim_orizz);
     //waitr();
     putwindow(center, video_buffer);
     putflippedwindow(up, video_buffer);
     putmirrorwindow(down, video_buffer);
    }
    if(key_table[MAKE_W] && currentx < 403 && currenty > 0)
    {
     currentx +=pixels;
     currenty -=pixels;
     getwindow(sfondo.pcx, &center, currentx, currenty, sfondo.dim_orizz);
     getwindow(sfondo.pcx, &up, currentx, currenty, sfondo.dim_orizz);
     getwindow(sfondo.pcx, &down, currentx, currenty, sfondo.dim_orizz);
     //waitr();
     putwindow(center, video_buffer);
     putflippedwindow(up, video_buffer);
     putmirrorwindow(down, video_buffer);
    }
    if(key_table[MAKE_A] && currentx > 0 && currenty < 282)
    {
     currentx -=pixels;
     currenty +=pixels;
     getwindow(sfondo.pcx, &center, currentx, currenty, sfondo.dim_orizz);
     getwindow(sfondo.pcx, &up, currentx, currenty, sfondo.dim_orizz);
     getwindow(sfondo.pcx, &down, currentx, currenty, sfondo.dim_orizz);
     //waitr();
     putwindow(center, video_buffer);
     putflippedwindow(up, video_buffer);
     putmirrorwindow(down, video_buffer);
    }
    if(key_table[MAKE_S] && currentx < 403 && currenty < 282)
    {
     currentx +=pixels;
     currenty +=pixels;
     getwindow(sfondo.pcx, &center, currentx, currenty, sfondo.dim_orizz);
     getwindow(sfondo.pcx, &up, currentx, currenty, sfondo.dim_orizz);
     getwindow(sfondo.pcx, &down, currentx, currenty, sfondo.dim_orizz);
     //waitr();
     putwindow(center, video_buffer);
     putflippedwindow(up, video_buffer);
     putmirrorwindow(down, video_buffer);
    }
    if(key_table[MAKE_KEYPAD_PLUS] && pixels < MAXSPEED) pixels++;
    if(key_table[MAKE_KEYPAD_MINUS] && pixels > 1) pixels--;
    waitr();
    gotoxy(3,3);
    printf("CURRENTX: %d\n",currentx);
    gotoxy(3,4);
    printf("CURRENTY: %d\n",currenty);
    gotoxy(3,5);
    printf("SPEED: %d(pix/s)\n",pixels);
  }
 key_delete();
 setvideomode(TEXT);
 destroy(&sfondo);
 return (0);
}
void getscreen(char *sfondo, char *dest, int x1, int y1, int
larghezzasfondo)
{
 register i,j, oldx, oldy;
 int x2, y2;
 x2 = x1+320;
 y2 = y1+200;
 for(i=x1, oldx=0; i<x2 ; i++, oldx++)
  for(j=y1, oldy=0; j<y2 ; j++, oldy++)
   dest[oldx+oldy*320] = sfondo[(i+x1)+(j+y1)*larghezzasfondo];
 return;
}
void getwindow(char *sfondo, Window *win, int x1, int y1, int
larghezzasfondo)
{
 register i,j, oldx, oldy;
 int x2, y2;
 x2 = x1+win->dim_orizz;
 y2 = y1+win->dim_vert;
 for(i=x1, oldx=0; i<x2 ; i++, oldx++)
  for(j=y1, oldy=0; j<y2 ; j++, oldy++)
   win->data[oldx+oldy*win->dim_orizz] =
sfondo[(i+x1)+(j+y1)*larghezzasfondo];
 return;
}
void putwindow(Window win, char *where)
{
 register i,j, newx, newy;
 for(i=0, newx=win.x; i<win.dim_orizz ;i++, newx++)
  for(j=0, newy=win.y; j<win.dim_vert ;j++, newy++)
   where[newx+newy*320]=win.data[i+j*win.dim_orizz];
 return;
}
void putflippedwindow(Window win, char *where)
{
 register i,j, newx, newy;
 for(i=win.dim_orizz, newx=win.x; i>0 ;i--, newx++)
  for(j=0, newy=win.y; j<win.dim_vert ;j++, newy++)
   where[newx+newy*320]=win.data[i+j*win.dim_orizz];
 return;
}
void putmirrorwindow(Window win, char *where)
{
 register i,j, newx, newy;
 for(i=0, newx=win.x; i<win.dim_orizz ;i++, newx++)
  for(j=win.dim_vert, newy=win.y; j>0 ;j--, newy++)
   where[newx+newy*320]=win.data[i+j*win.dim_orizz];
 return;
}
int createwindow(Window *win, int dim_orizz, int dim_vert)
{
 win->dim_orizz = dim_orizz;
 win->dim_vert  = dim_vert;
 if( (win->data = (char*)malloc(win->dim_orizz*win->dim_vert)) == NULL )
return 1;
 return 0;
}
/* fine listato */

 ha scritto nel messaggio
news:fh7x5.34835$XZ4.4...@news.infostrada.it...
