آموزش حرکت در محیط گرافیکی
برای حرکت در محیط گرافیکی نیازمندیم که حرکت را مانند ساخت فیلم و انیمیشن به چند مرحله تبدیل کنیم...
برای رسم انیمیشن باید یک شکل را کشید و آن را پاک کرد و همان شکل را با تغییر در مختصات دوباره رسم کرد.
این مراحل به صورت زیر می باشند:
مرحله ی اول رسم شکل اولیه است
مرحله ی بعدی پاک کردن شکل اولیه است.
اما باید توجه داشت که اگر این دو مرحله بدون هیچ تاخیری صورت بگیرند تنها چیزی که کاربر مشاهده خواهد کرد صفحه ی خالی است که شکل در آن پاک شده..
پس برای جلوگیری از این اتفاق، پس از رسم شکل اولیه دستور تاخیر یا delay را قرار میدهیم و بعد از طی شدن زمان مذکور در دستور delay مرحله ی بعدی، که پاک کردن شکل اولیه می باشد، اجرا خواهد شد.
پس از این مرحله مختصات شکل که حتما باید به صورت پارامتری بیان شود را تغییر خواهیم داد.
پس مراحل حرکت به صورت کلی زیر خواهد بود:
1- رسم شکل اولیه
2- تاخیر
3- پاک کردن شکل اولیه
4- تغییر مختصات
چند نکته را نباید فراموش کرد!
× دستوری برای پاک کردن شکل در محیط گرافیکی زبان ++c وجود ندارد که تنها شکل ما را پاک کند. برای همین با تغییر رنگ قلم به رنگ سیاه که همان رنگ شماره ی صفر میباشد میتوانیم روی شکل اولیه،همان شکل را با رنگ سیاه رسم کنیم. در واقع با تغییر رنگ قلم به رنگ پشت زمینه میتوان شکل مذکور را حذف کرد.
×× مراحل فوق را اگر درون یک حلقه ی while قرار دهیم شکل تا برقراری شرط حلقه حرکت خواهد کرد.
برای یک تمرین ساده می توان از حرکت یک شکل ساده مثل دایره به سمت راست شروع کرد:
سوال 1- برنامه ی زیر یک دایره را به سمت راست حرکت میدهد:
main() { int x = 50, y = 400, r = 50; initwindow(600, 600); while(1) { setcolor(14); circle(x, y, r); delay(10); setcolor(0); circle(x, y, r); x++; } getch(); }
سوال 2- برنامه ی زیر یک دایره را به سمت راست حرکت میدهد و در انتها می ایستد:
main() { int x = 50, y = 400, r = 50; initwindow(600, 600); while(x<550) { setcolor(14); circle(x, y, r); delay(10); setcolor(0); circle(x, y, r); x++; } setcolor(14); circle(x, y, r); getch(); }
سوال 3- برنامه ی زیر یک مستطیل را به سمت راست حرکت میدهد:
main() { int x1 = 50, y1 = 400, x2 = 100, y2 = 480; initwindow(600, 600); while(1) { setcolor(14); rectangle(x1, y1, x2, y2); delay(10); setcolor(0); rectangle(x1, y1, x2, y2); x1++; x2++; } getch(); }
سوال 4- برنامه ی زیر یک مستطیل را به سمت راست حرکت میدهد و در انتها می ایستد:
main() { int x1 = 50, y1 = 400, x2 = 100, y2 = 480; initwindow(600, 600); while(x2<599) { setcolor(14); rectangle(x1, y1, x2, y2); delay(10); setcolor(0); rectangle(x1, y1, x2, y2); x1++; x2++; } setcolor(14); rectangle(x1, y1, x2, y2); getch(); }
سوال 5- برنامه ی زیر یک دایره را دائم به سمت راست و چپ حرکت میدهد:
main() { int x = 50, y = 400, r = 50, d = 1; initwindow(600, 600); while(1) { setcolor(14); circle(x, y, r); delay(10); setcolor(0); circle(x, y, r); if(x == 49 || x == 550) d = d * -1; x = x + d; } getch(); }
دقت کنید چرا در برنامه ی بالا در شرط درون حلقه گفته شده( if(x == 49 برای دریافت جواب، برنامه را امتحان کنید و سپس مقدار درون این شرط را به 50 تغییر دهید.
سوال 6 - برنامه ی زیر یک دایره را در مرکز صفحه بزرگ خواهد کرد:
main() { int x = 300, y = 300, r = 50; initwindow(600, 600); while(1) { setcolor(14); circle(x, y, r); delay(10); setcolor(0); circle(x, y, r); r++; } getch(); }
سوال 7 - برنامه ی زیر یک دایره را در مرکز صفحه بزرگ خواهد کرد و در انتها می ایستد:
main() { int x = 300, y = 300, r = 50; initwindow(600, 600); while(r<300) { setcolor(14); circle(x, y, r); delay(10); setcolor(0); circle(x, y, r); r++; } setcolor(14); circle(x, y, r); getch(); }
سوال 8- برنامه ی زیر یک دایره را دائم بزرگ و کوچک خواهد کرد:
main() { int x = 300, y = 300, r = 50, d = 1; initwindow(600, 600); while(1) { setcolor(14); circle(x, y, r); delay(10); setcolor(0); circle(x, y, r); if(r == 0 || r == 300) d = d * -1; r = r + d; } getch(); }
سوال 9- در برنامه ی زیر یک دایره دائم در صفحه به اطراف صفحه برخورد می کند:
main() { int x = 300, y = 300, r = 50, dx = 5, dy = 3; initwindow(600, 600); while(1) { setcolor(14); circle(x, y, r); delay(5); setcolor(0); circle(x, y, r); if(x < 49 || x > 550) dx = dx * -1; if(y < 49 || y > 550) dy = dy * -1; x = x + dx; y = y + dy; } getch(); }
#include <conio.h> #include <iostream> #include <graphics.h> #include <time.h> using namespace std; #define MAX_BARF 300 #define DELAY_MS 1 main() { initwindow(640, 480); int barfx[MAX_BARF]; int barfy[MAX_BARF]; srand(time(NULL)); for (int i = 0; i < MAX_BARF; i++) { barfx[i] = rand() % 640; barfy[i] = 0 - (rand() % 600); } while (true) { for (int i = 0; i < MAX_BARF; i++) { if (getpixel(barfx[i], barfy[i] + 1) != 0 || barfy[i] > 620) { barfx[i] = rand() % 640; barfy[i] = 0 - rand() % 600; continue; } putpixel(barfx[i], barfy[i], 0); } for (int i = 0; i < MAX_BARF; i++) { barfy[i]++; putpixel(barfx[i], barfy[i], 15); } delay(DELAY_MS); } getch(); }
چند سال برنامه نویسی می کنی