PDA

View Full Version : حرکت یک شکل در صفحه نمایش



micheal-tnt
سه شنبه 10 آذر 1388, 10:12 صبح
چطوری می تونم یه شکل رو تو صفحه نمایش حرکت بدم . کمک کنید

tdkhakpur
سه شنبه 10 آذر 1388, 12:36 عصر
اساس کار این هست که قبل از ظاهر شدن شکل باید زمینه را داخل بافر ذخیره کرد و سپس شکل را در محل ظاهر نمود و اگر قصد جابجایی دارید باید زمینه را از داخل بافر به محل قبلی برگردانید و به همین ترتیب برای محل دیگر که شکل میخواهد به آنجا برود این کار را انجام بدید

micheal-tnt
سه شنبه 10 آذر 1388, 12:44 عصر
شرمنده من تازه کارم اگه امکانش هست ساده توضیح بده.
من میخوام شکل از گوشه سمت چپ (بالا) بیاد به گوشه سمت راست (پایین) ، وقتی به انتها رسید منعکس بشه

tdkhakpur
سه شنبه 10 آذر 1388, 12:51 عصر
مگه ساده نبود.
خب شما شکل را داخل صفحه نمایش می آرید و برای اینکه این شکل به مکان بعدی برود و در حقیقت حرکت شکل ایجاد شود باید مختصات ظاهر شدن شکل را تغییر بدید(x,y).
ولی قبل از تغییر مکان شما باید شکل قبلی را که ظاهر شده است را پاک کنید برای این منظور باید قبل از ظاهر شدن شکل در صفحه نمایش محل یا زمینه را ذخیره کنید تا به هنگام تغیر مکان شکل این محل ذخیره شده را برگردانید تا اثری از شکل قبلی نماند.و به همین ترتیب..

micheal-tnt
سه شنبه 10 آذر 1388, 12:56 عصر
خیلی شرمنده ام
امکانش هست یه کد (برای مثال ) بنویسی ؟

tdkhakpur
سه شنبه 10 آذر 1388, 13:07 عصر
خوب وقت میبره من الگوریتم را ارسال میکنم شما کد را بنویسید.


long buff[size];
void CopyScreen(....)
{
// ذخیره محلی که شکل ظاهر میشود
}
void PasteScreen(....)
{
// برگرداندن محل ذخیره شده.
}
void PutObject(int x, int y)
{
// این تابع باید شکل را در محل مورد نظر رسم کند
}
void main(void)
{
int x=100, y=100;
for( int i=0; i< 100; i++)
{
CopyScreen(); // قبل از ظاهر شدن شکل محل را ذخیره کند
PutObject( x+i, y); // شکل را رسم کند
PasteScreen();// قبل از شروع به حرکت بعدی محل ذخیره شده را بر میگرداند یا به اصطلاح شکل را ناپدید کند
delay(1000);// ایجاد فاصله زمانی
}

}

shadoow
پنج شنبه 19 آذر 1388, 09:24 صبح
اشتباه شده

micheal-tnt
پنج شنبه 19 آذر 1388, 09:28 صبح
من کد گرافیکش رو نوشتم اگه لازم دارید میتونم براتون بنویسم .

shadoow
پنج شنبه 19 آذر 1388, 09:31 صبح
اشتباه شده

tdkhakpur
پنج شنبه 19 آذر 1388, 12:25 عصر
شرمنده ام برنامه ای هست که خیلی وقت پیش روش کار کرده بودم نتونستم برم داس و براتون اصلاح کنم ولی الگوی خوبیه که متن را حرکت میده شما میتونین تغییرش بدید.


#include<stdio.h>
#include<dos.h>
#include<conio.h>
#include<math.h>
#include<graphics.h>
#include<stdlib.h>
#include<string.h>
void main( void )
{
int R = 0, G = 0, B = 0, d=3,a=0,b=0,c=10,m=0,n=0;
float z= 0, i = 2, k = 0, l = 0, x1 = 0, y1 = 0,X[6],Y[6];
char ch = 0;
initgraph(&a,&b,"e:\\borlandc\\bgi");
a=b=0;
setcolor(11);
settextstyle(2,0,7);
outtextxy(1,1,"Esc=Exit SpaceBar=Style Enter=H/V (+,-)=Size");
while ( 1 )
{
if ( kbhit() )
{
ch = getch();
if ( ch == 27 ) break;
if (ch == 32 )
c++;
if ( c > 10 ) c=0;
if ( ch == '+')
d++;
if ( d > 10 ) d --;
if ( ch == '-')
d--;
if ( d == 0 ) d++;
if ( ch == 13 ) a++;
if ( a > 1 ) a = 0;
}
settextstyle(c,a,d);
setcolor(14);
if(l >= 10 ) l=-l;
l+=.01;
if( n >= 300 ) n = -n;
n++;
b+=.3;
if ( b >= 5 ) b = -b;
setcolor(9);
outtextxy(( 2*cos(n/l))+10+(abs(n)),230+((abs(b)+60)*sin(l)),"A");
setcolor(10);
outtextxy((12*cos(l))+50+(abs(n)),260+((abs(b)+10) *sin(l)),"R");
setcolor(11);
outtextxy((22*cos(l))+90+(abs(n)),230+((abs(b)+30) *sin(l)),"A");
setcolor(12);
outtextxy((32*cos(l))+140+(abs(n)),260+((abs(b)+50 )*sin(l)),"B");
setcolor(13);
delay(2);
setcolor(0);
outtextxy(( 2*cos(n/l))+10+(abs(n)),230+((abs(b)+60)*sin(l)),"A");
outtextxy((12*cos(l))+50+(abs(n)),260+((abs(b)+10) *sin(l)),"R");
outtextxy((22*cos(l))+90+(abs(n)),230+((abs(b)+30) *sin(l)),"A");
outtextxy((32*cos(l))+140+(abs(n)),260+((abs(b)+50 )*sin(l)),"B");
}
closegraph();
}

shadoow
پنج شنبه 19 آذر 1388, 12:53 عصر
اشتباه شده

tdkhakpur
پنج شنبه 19 آذر 1388, 13:05 عصر
خوب شما مگه گرافیکش را نخواسته بودید نمونه زیر متن را حرکت میده .


#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <dos.h>
int main()
{
char *text={"hi my friend, how are you today."}, ch;
int len;
len = strlen(text);
while( !(kbhit() && getch()==27) )
{
gotoxy(10, 10);
cout<<text;
ch = text[0];
for( int i=0; i<len-1; i++)
text[i] = text[i+1];
text[len-1] = ch;
delay(1);
}
return 0;
}

shadoow
پنج شنبه 19 آذر 1388, 14:02 عصر
اشتباه شده

tdkhakpur
پنج شنبه 19 آذر 1388, 14:15 عصر
خب مکان نما رو عوض کنید
این هم ابتدائی ترین کد


#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <dos.h>
int main()
{
char *text={"hi my friend, how are you today."}, ch;
int len;
len = strlen(text);
while( !(kbhit() && getch()==27) )
{
clrscr();
gotoxy(random(80), random(25));
cout<<text;
delay(1000);
}
return 0;
}

kaveh22
پنج شنبه 19 آذر 1388, 23:10 عصر
سلام دوست عزیز این برنامه ها رو در borland که کامپایل میکنم همش خطا میگیره اینه ؟
call to undefined function 'delay
در tc هم که اجرا میکنم با پیغام های not portage و .. مواجه میشم واسه run کردن البته اما موقع کامپایل error نمیده و warning میده

tdkhakpur
پنج شنبه 19 آذر 1388, 23:15 عصر
فایل Dos.h را باز include کنید و اگر هم نداشتید این فقط کار وقفه زمانی را انجام میده مشابهش را پیدا کنید.

kaveh22
پنج شنبه 19 آذر 1388, 23:27 عصر
من خیلی مبتدیم منظورتونو نفهمیدم شرمنده خوب خوش که dos.h داره
در ضمن اصلا کلا هیچ سورس گرافیکی رو تا به الان نتونستم اجرا کنم
در borland که خطا میده که bgi not work under windows و در turbo c هم که بازم همون not prtrage رو میده همش موندم چیکار کنم

tdkhakpur
پنج شنبه 19 آذر 1388, 23:34 عصر
شرمنده خوب خوش که dos.h داره


خوب پیداش کن کجاست مسیر بهش بده مانند.


#include <c:\\borlandc\\include\\dos.h>

shadoow
جمعه 20 آذر 1388, 17:25 عصر
اشتباه شده

tdkhakpur
جمعه 20 آذر 1388, 19:31 عصر
این قسمت را هم اضافه کنید(البته با مسیر کامپایلر شما به شکل دیگر باید باشد)


#include <c:\\borlandc\\include\\stdlib.h>

p.reza
شنبه 21 آذر 1388, 01:41 صبح
دستت درد نکنه
این تابع kbhit() خیلی کارمو راه انداخت:تشویق:

سارا کوچولو
یک شنبه 22 آذر 1388, 09:42 صبح
می تونید این برنامه رو با دو تا تابع خیلی راحت بنویسید .
دو تا تابع اول برنامه تعریف می کنید یکی برای ترسیم شکل اون یکی برای حرکتش .بعدم تو برنامه فراخوانیش میکنید .تمام

shadoow
دوشنبه 23 آذر 1388, 11:36 صبح
اشتباه شده

shadoow
چهارشنبه 25 آذر 1388, 11:47 صبح
اشتباه شده

سارا کوچولو
دوشنبه 14 دی 1388, 11:59 صبح
من این برنامه رو نوشتم


#include<iostream.h>




#include<stdio.h>

#include<conio.h>

#include<dos.h>
#include<stdlib.h>
void paint(int x,int y,int l,int r){
int i,j;
textmode(3);
gotoxy(x,y);
for(i=1;i<=l;i++)
cout<<" * ";
gotoxy(x,y+1);
for(i=1;i<=(r-2);i++){
cout<<" * ";
for(j=1;j<=(l-2);j++){
cout<<" * ";
}
cout<<" * ";
gotoxy(x,y+i+1);
}
for(i=1;i<=l;i++)
cout<<" * ";
}
void main(void){
clrscr();
cout<<"(l,r): ";
randomize();
int l,r,x,dx=1,dy=1,y;
scanf("%d%d",&l,&r);
x=random(80-l);
y=random(25-r);
do{
clrscr();
x=x+dx;
if(x+(2*l)==80 || x==1) dx=dx*(-1);
y=y+dy;
if(y+r==25 || y==1) dy=dy*(-1);
paint(x,y,l,r);
delay(100);
}while(!kbhit());
}







حالا کسی میتونه اینو به سه تا شکل(مربع ،دایره،مستطیل)تبدیل کنه که با زدن یک دکمه حرکت کنه . مختصات رو از کاربر بگیره و اگر اشکال با هم تداخل داشتن مختصات جدید رو بخاد. با خوردن به دیواره ها تغییر جهت بده .

ممنون