-
مشکل گرافیکی در c
با سلام.
من یک برنامه در c دارم که با استفاده از حافظه نمایشی کار می کنه. به این صورت که ابتدا قسمتی از صفحه رو در حافظه ذخیره می کنه وسپس در آن قسمت از صفحه پنجره ای چاپ می شوه .الان من چه جوری می تونم اون پنجره ای که چاپ شده رو بصورت random (پیکسل به پیکسل) پاک بکنم طوری که طرح زیرین پنجره ظاهر بشه؟
من برنامش رو پایین گذاشتم .اگه برنامه رو به شکلی که گفتم تغییر بدین از شما خیلی ممنون میشم.
کد:
#include <conio.h>
#include <stdio.h>
#include <dos.h>
#include <math.h>
#include <iostream.h>
#include <string.h>
#include <graphics.h>
#include <alloc.h>
#include <process.h>
//--------------------------------------------------
void tarh(char ch,int attr);
void Writchr(int x,int y, int character, int attr);
void wind(int x, int y, int x0, int y0, int color_m, int color_sh);
void save_video(int startx,int endx,int starty,int endy, unsigned char *buf_p);
void restore_video (int startx,int endx,int starty,int endy, unsigned char *buf_p);
char far *vid_mem = (char far *)0xb8000000;
unsigned char *buf_ptr;
//-------------------------------------
int main()
{
tarh(179,0x17);
wind(10, 5, 13, 60, 0x30, 0x0f);
return(0);
}
/*------------------------------------------------------*/
void save_video(int startx,int endx,int starty,int endy,unsigned char *buf_p)
{
register int i, j;
char far *v, far *t;
v = vid_mem;
for(j = startx; j < endx; j++)
for(i = starty; i < endy; i++)
{
t = v + (j * 160) + i * 2;
*buf_p++ = *t++;
*buf_p++ = *t;
*(t - 1) = ' ';
}
for(j = startx; j < endx; j++)
for(i = starty; i < endy; i++)
{
*buf_p--;
*buf_p--;
}
for(j = startx; j < endx; j++)
for(i = starty; i < endy; i++)
{
t = v + (j * 160) + i * 2;
*t++ = *buf_p++;
*t = *buf_p++;
}
}
/*---------------------------------------------------------------------*/
void restore_video (int startx,int endx,int starty,int endy, unsigned char *buf_p)
{
register int i, j;
char far *v, far *t;
v = vid_mem;
for(j = startx; j < endx; j++)
for(i = starty; i < endy; i++)
{
t=(v + (j * 160) +i * 2);
*t++ =*buf_p++;
*t =*buf_p++;
}
}
/*-------------------------------------------------------*/
void wind(int x, int y, int x0, int y0, int color_m, int color_sh)
{
char far *crt;
int i, j, vw, vs;
unsigned char *p;
crt=(char far *)vid_mem;
buf_ptr = (unsigned char *)malloc(2 * (x0 - x + 2) * (y0 - y + 3));
if(!buf_ptr) exit(1);
memset(buf_ptr,0,sizeof(buf_ptr));
save_video(x,x0+2,y,y0+3,buf_ptr);
for (i=x+1; i < x0+2; i++)
{
for (j=y+1; j < y0+2; j++)
{
*(crt+j*2+i*160+1)=color_sh;
}
*(crt+j*2+i*160+1)=color_sh;
}
for (i=x; i < x0+1; i++)
{
for (j=y; j < y0; j++)
{
*(crt+j*2+i*160+1)=color_m;
*(crt+j*2+i*160)=' ';
}
*(crt+j*2+i*160+1)=color_m;
*(crt+j*2+i*160)=' ';
}
getch();
restore_video(x,x0+2,y,y0+3,buf_ptr);
free(buf_ptr);
buf_ptr=NULL;
getch();
}
//---------------------------------------------
void Writchr(int x,int y, int character, int attr)
{
gotoxy(y,x);
char far *v;
v = vid_mem;
v+=(x*160) + y * 2;
*v++=character;
*v = attr;
}
//-------------------- Func 4 ---------------------------
void tarh(char ch,int attr)
{
int a,b;
for (a=0;a<25;a++)
for (b=0;b<80;b++)
Writchr(a,b,ch,attr);
}
-
واقعا از اینکه این همه از این سوال من استقبال می شه من نمیدونم چیکار کنم :ohno: :tongue:
-
بابا یکی یه چیزی بگه لا اقل مردیم از تهنایی.
-
[QUOTE=mahdi.nikoo;795749]با سلام.
من یک برنامه در c دارم که با استفاده از حافظه نمایشی کار می کنه. به این صورت که ابتدا قسمتی از صفحه رو در حافظه ذخیره می کنه وسپس در آن قسمت از صفحه پنجره ای چاپ می شوه .الان من چه جوری می تونم اون پنجره ای که چاپ شده رو بصورت random (پیکسل به پیکسل) پاک بکنم طوری که طرح زیرین پنجره ظاهر بشه؟
من برنامش رو پایین گذاشتم .اگه برنامه رو به شکلی که گفتم تغییر بدین از شما خیلی ممنون میشم.
باید همان قسمتی را که می خواهی جایگزین کنی از قبل (مثلا در یک فایل یا متغییر فار) ذخیره کنی و سپس با
تصویر فعلی (AND & OR & XOR & NOT) کنی آن هم رندوم.
(کتاب جعفر ن÷اد قمی بد نیست).