براي برنامه نويسي در محيط گرافيكي نياز به مقدماتي براي ورود به محيط گرافيك است . اولين خط هر برنامه گرافيكي بعد از دستور Program ، فرمان زير است : Uses graph ; با استفاده از دستور uses برنامه شما مي تواند از پيمانه ها و ثوابت توربو پاسكال استفاده كند . اين ثوابت و پيمانه ها در فايلي كه يك unit ناميده مي شود جاي مي گيرند . كدي كه در حالت گرافيكي توسط كامپيوتر توليد مي شود ، به نوع كامپيوتر بستگي دارد . بنابراين نوع سخت افزار گرافيكي كه در اختيار سيستم است بايد به توربو پاسكال اعلام شود . براي اين كار از دو متغير Driver و Mode بصورت زير استفاده مي شود : Var Driver , Mode : Integer ; محتواي اين دو متغير نوع سخت افزارهاي گرافيكي سيستم را مشخص مي كند . براي تعيين حالت گرافيكي از دستور زير استفاده مي شود : InitGraph (Driver, Mode, ‘…….’) ; رويه InitGraph سيستم گرافيكي شما را بررسي كرده و سپس در متغيرهاي Driver و Mode مقادير مناسب را قرار مي دهد . پارامتر رشته اي ‘……’ شاخه اي را مشخص مي كند كه در آن نرم افزار كنترل سيستم گرافيكي شما وجود دارد . رشته اي كه بدون كاراكتر است ‘ ‘ به اين معناست كه اين نرم افزار در شاخه جاري قرار دارد . اين نرم افزار همواره در شاخه BGI قرار دارد و معمولا" در محلي است كه برنامه توربو پاسكال نصب شده است . بنابراين بايد آدرس شاخه BGI را بجاي اين رشته بنويسيم . براي انعطاف پذير شدن برنامه و قابليت اجراي آن روي سيستم هاي مختلف معمولا" يك نسخه از شاخه BGI را در شاخه اي كه برنامه در آن قرار دارد ، كپي مي كنيم . صفحه نمايشي كه مانند يك صفحه مختصات است : در برنامه نويسي گرافيكي موقعيت هر خط يا هر شكلي را كه روي صفحه نمايش رسم مي كنيد ، بايد كنترل كنيد . صفحه نمايش را در محيط گرافيكي بصورت مختصات X-Y تعدادي نقطه مي توان در نظر گرفت . در اكثر نمايشگرها ابعاد متداول عبارتند از : 200×320 ، 350×640 ، 480×640 . كه معمولا" تعداد نقاط در محور X ها بيشتر است . توابع GetMaxX و GetMaxY در توربو پاسكال، به ترتيب حداكثر تعداد نقاط در Xها و Yها را برمي گردانند . بنابراين براي بدست آوردن ابعاد واقعي نمايشگر خود مي توانيد از اين توابع بصورت زير استفاده كنيد : MaxX := GetMaxX ; MaxY := GetMaxY ; مختصات گوشه های صفحه نمایش به صورت زیر است. براي برگرداندن برنامه به حالت متني از دستور زيراستفاده مي كنيم . CloseGraph ; رنگ زمينه و متن : بطور پيش فرض براي رنگ هاي زمينه و متن ، به ترتيب از سياه و سفيد استفاده مي شود . دستورات زير امكان تغيير رنگ زمينه و متن را فراهم مي كنند . SetBkColor (….) ; تعيين رنگ زمينه SetColor (….) ; تعيين رنگ متن براي انتخاب رنگها از ثوابت رنگي يا معادل عددي رنگها طبق جدول زير استفاده مي شود : [TABLE="class: cms_table, align: right"] [TR] [TD]ثابت[/TD] [TD]مقدار[/TD] [TD]ثابت[/TD] [TD]مقدار[/TD] [/TR] [TR] [TD]Black[/TD] [TD]0[/TD] [TD]DarkGray[/TD] [TD]8[/TD] [/TR] [TR] [TD]Blue[/TD] [TD]1[/TD] [TD]LightBlue[/TD] [TD]9[/TD] [/TR] [TR] [TD]Green[/TD] [TD]2[/TD] [TD]LightGreen[/TD] [TD]10[/TD] [/TR] [TR] [TD]Cyan[/TD] [TD]3[/TD] [TD]LightCyan[/TD] [TD]11[/TD] [/TR] [TR] [TD]Red[/TD] [TD]4[/TD] [TD]LightRed[/TD] [TD]12[/TD] [/TR] [TR] [TD]Magenta[/TD] [TD]5[/TD] [TD]LightMagenta[/TD] [TD]13[/TD] [/TR] [TR] [TD]Brown[/TD] [TD]6[/TD] [TD]Yellow[/TD] [TD]14[/TD] [/TR] [TR] [TD]LightGray[/TD] [TD]7[/TD] [TD]White[/TD] [TD]15[/TD] [/TR] [/TABLE] خلاصه اي از توابع و رويه هاي گرافيكي : · Line (X1, Y1, X2, Y2) ; بين نقاط (X1,Y1) و (X2,Y2) خطي رسم مي شود . · Rectangle (X1, Y1, X2, Y2) ; مستطيلي كه قطر آن بين نقاط (X1,Y1) و (X2,Y2) است مي كشد . · Circle (X, Y, R) ; دايره به مركز (X,Y) و شعاع R رسم مي كند . · Arc (X, Y, Angle1, Angle2, R) ; كماني از زاويه Angle1 تا Angle2 و به مركز (X,Y) و شعاع R رسم مي كند . · SetFillStyle (FilPat, FilCol ) ; براي رنگ آميزي قسمتهايي از صفحه نمايش با رنگهاي مختلف از اين رويه استفاده مي شود تا نوع رنگ و نحوه رنگ آميزي مشخص شود . الگوهاي رنگ آميزي و رنگها با توجه به جدول زير انتخاب مي شوند ، در اين رويه هم از نام ثابت و هم از معادل عددي مي توانيد استفاده كنيد . تا زمانيكه بار ديگر اين رويه را فراخواني نكنيد ، اين حالت فعال خواهد بود . [TABLE="class: cms_table, align: right"] [TR] [TD]ثابت[/TD] [TD]معادل عددي[/TD] [TD]الگوي رنگ آميزي[/TD] [TD]ثابت[/TD] [TD]معادل عددي[/TD] [TD]الگوي رنگ آميزي[/TD] [/TR] [TR] [TD]EmptyFill2[/TD] [TD]0[/TD] [TD]رنگ زمينه[/TD] [TD]LtBkSlashFill[/TD] [TD]6[/TD] [TD]\ \ \ \ (بافاصله)[/TD] [/TR] [TR] [TD]SolidFill[/TD] [TD]1[/TD] [TD]بصورت توپر[/TD] [TD]HatchFill[/TD] [TD]7[/TD] [TD]هاشور[/TD] [/TR] [TR] [TD]LineFill[/TD] [TD]2[/TD] [TD]- - - -[/TD] [TD]XhatchFill[/TD] [TD]8[/TD] [TD]متقاطع[/TD] [/TR] [TR] [TD]ItSlashFill[/TD] [TD]3[/TD] [TD]/ / / / (بافاصله)[/TD] [TD]InterLeaveFill[/TD] [TD]9[/TD] [TD]خط در ميان[/TD] [/TR] [TR] [TD]SlashFill[/TD] [TD]4[/TD] [TD]//// (بدون فاصله)[/TD] [TD]WidDotFill[/TD] [TD]10[/TD] [TD]نفطه اي (بافاصله)[/TD] [/TR] [TR] [TD]BslashFill[/TD] [TD]5[/TD] [TD]\\\\ (بدون فاصله)[/TD] [TD]CloseDotFill[/TD] [TD]11[/TD] [TD]نقطه اي(بدون فاصله)[/TD] [/TR] [/TABLE] FloodFill (X, Y, Border) ; محدوده اي را كه حاوي نقطه (X,Y) است و با خطوطي به رنگ Border محصور شده است ، با · الگوي جاري رنگ آميزي مي كند . · Bar (X1, Y1, X2, Y2) ; مستطيلي توپر مي كشد كه قطر آن بين نقاط (X1,Y1) و (X2,Y2) است . · PieSlice (X, Y, Angle1, Angle2, R) ; يك برش دايره توپر مي كشد كه از زاويه Angle1 شروع شده و به Angle2 ختم مي شود و داراي مركز (X,Y) و شعاع R مي باشد . · OutTextXY (X, Y, TextString) ; در نقطه (X,Y) كاراكترهاي رشته TextString را چاپ مي كند . v برنامه زير يك نمونه از برنامه نويسي ساده گرافيكي را نشان مي دهد . uses graph; procedure HappyFace(MidX,MidY:integer); var HeadRadius:integer; begin HeadRadius:=GetMaxY div 4; Circle (MidX, MidY, HeadRadius); end; var Driver,Mode,MidX,MidY:integer; begin InitGraph (Driver, Mode, ' '); MidX:=GetMaxX div 2; MidY:=GetMaxY div 2; HappyFace(MidX,MidY); OutTextXY(230, 400, '!!! Press Any Key !!!'); readln; CloseGraph; end. نقاشي متحرك گرافيكي : اگر يك رويه گرافيكي داراي پارامتر باشد ، مي توان موقعيت يك شكل را تغيير داد و يا آن شكل را در چند نقطه از صفحه نمايش رسم كرد . علاوه بر اين مي توان يك شكل را متحرك ساخت . اين كار به اين صورت انجام مي شود كه ابتدا شكلي در نقطه خاصي از صفحه نمايش رسم مي شود ، سپس از آن نقطه پاك شده و در محل ديگري رسم مي شود . با تكرار اين عمل شكل مورد نظر متحرك به نظر مي رسد . براي تعيين سرعت حركت از يك تأخير زماني بين دفعات رسم شكل استفاده مي كنيم . براي ايجاد اين تأخير مي توان از رويه Delay (DelayTime) استفاده كرد . عدد DelayTime بر اساس ميلي ثانيه بيان مي شود و البته براي استفاده از اين تابع بايد واحد Crt را با فرمان uses Crt در ابتداي برنامه فراخواني كنيد . v در مثال بعد با استفاده از روش گفته شده ، شكل رسم شده در مثال قبل را متحرك مي كنيم. var Driver,Mode,MidX,MidY:integer; begin InitGraph (Driver, Mode, ' '); MidX:=0; MidY:=0; while ((MidX<GetMaxX) and (MidY<GetMaxY)) do begin HappyFace(MidX,MidY); MidX:=MidX+50; MidY:=MidY+50; Delay(50); SetFillStyle(3,4); Bar(0,0,639,479); end; OutTextXY(230, 400, '!!! Press Any Key !!!'); readln; CloseGraph; end. دستور كار (1 ) در محيط گرافيك توربو پاسكال برنامه اي بنويسيد كه اشكال زير را در خروجي رسم كند . سعي كنيد توابع را طوري بنويسيد كه با دريافت مختصات يك نقطه از شكل مثلا" مركز آن ، تمام شكل را رسم كند . (مانند مثال مطرح شده در جزوه) سعي كنيد تمام مختصات لازم براي رسم اشكال را با فرمول بدست آوريد و تا حد امكان از استفاده مستقيم از اعداد خودداري كنيد . دستور كار (2 ) در محيط گرافيك توربو پاسكال برنامه اي بنويسيد تا اشكال زير را به ترتيب و بصورت متحرك نمايش دهد. سرعت حركت آدمك بايد به گونه اي باشد كه بين مرحله اول تا آخر 2 ثانيه طول بكشد. نيازي به جابجايي خانه ها وجود ندارد ، برنامه را طوري بنويسيد كه آدمك از يك خانه بيرون بيايد و دوباره در همان خانه فرو برود . تابع رسم آدمك بايد به گونه اي باشد كه با دريافت مختصات يك نقطه مشخص (مركز خانه) آدمك را رسم كند و هر بار با كم يا زياد كردن مختصات اين نقطه آدمك را در محل جديدي رسم كند . دستور كار (3 ) برنامه اي بنويسيد كه پنجره زير را رسم كند . براي طرح پنجره ها و رنگها به دلخواه تصميم بگيريد. دستور كار (4 ) با استفاده از تابعي كه در دستور كار (2) نوشته ايد ، برنامه اي بنويسيد كه آدمك را به طور تصادفي در خانه هاي پنجره شماره يك ظاهر كند . به اين ترتيب كه با يك تابع شماره خانه اي را كه آدمك بايد در آن ظاهر شود ، به طور تصادفي توليد كنيد و سپس مختصات مركز آن خانه را به تابع رسم آدمك بدهيد . اين كار بايد تا زماني ادامه پيدا كند كه 10 بار آدمك در خانه هاي مختلف ظاهر و سپس ناپديد شود . تابع حركت آدمك را بدون استفاده از Delay بنويسيد . براي ايجاد حالت متحرك بعد از هر بار رسم آدمك پنجره شماره 1 بايد مجددا" رسم شود . دستور كار (5 ) برنامه اي بنويسيد كه ماوس را در پنجره شماره 2 فعال كند و محل كليك كردن ماوس را مشخص كند . بطوريكه اگر كاربر در هر محلي از يك خانه كليك كند برنامه شماره آن خانه را بعنوان خروجي برگرداند . مثلا" اگر كاربر در هر نقطه اي از خانه شماره 1 كليك كند برنامه عدد يك را بعنوان خروجي برگرداند . دستور كار (6 ) برنامه اي را كه در دستور كار (4) نوشته ايد طوري تغيير دهيد كه اگر در زمان حركت آدمك ، كاربر ماوس را در هر كدام از خانه هاي پنجره شماره 2 كليك كند ، آدمك بعدي ظاهر شود . يعني با هر بار كليك ماوس بازي به مرحله بعدي برود . دستور كار (7 ) برنامه دستور كار (6) را به گونه اي تغيير دهيد كه تشخيص دهد آيا شماره خانه اي كه ماوس در آن كليك شده ، با شماره خانه اي كه آدمك در آن حركت مي كرده يكسان است يا نه ؟ در صورت يكسان بودن شماره ها يك امتياز مثبت و در صورت يكسان نبودن يك امتياز منفي به كاربر بدهيد . پروژه نهايي : بازي كامپيوتري طراحي شده در طول ترم را تكميل كنيد به نحوي كه بعد از هر بازي امتياز كاربر را نمايش دهد . امكانات اضافي : 1- استفاده از طرحها و رنگهاي متنوع در طراحي پنجره ها ، خانه ها و آدمكهاي بازي . 2- ايجاد پنجره اي مخصوص نمايش امتياز كاربر در هر مرحله و در انتهاي بازي . 3- استفاده از امكانات صوتي در مراحل مختلف بازي مثل شروع بازي ، پايان بازي ، انتخاب خانه صحيح ، انتخاب خانه غلط ، ظاهر شدن آدمك جديد ، ناپديد شدن آدمك متحرك . 4- طراحي صفحه متحرك براي شروع و پايان بازي . 5- ...
پاسخ : آموزش محیط گرافیکی در توربو پاسکال 7 استفاده از Mouse در محيط گرافيك : براي استفاده از Mouse در محيط گرافيكي بايد وقفه مربوط به فعالسازي Mouse را فراخواني كنيم . اين وقفه 33Hex (هگزادسيمال) نام دارد و شامل يكسري توابع است كه هر تابع با يك شماره مشخص شده و كاربرد خاصي دارد . هركدام از توابع مذكور داراي ثباتهاي ورودي و خروجي هستند . ثباتهاي ورودي بايد قبل از فراخواني وقفه مقدار دهي شوند تا وقفه عمل مورد نظر ما را انجام دهد و ثباتهاي خروجي نتايج اجراي وقفه را برمي گردانند . تابع 00Hex از وقفه 33Hex : اين تابع اعمال زير را انجام مي دهد : 1- پارامترهاي Mouse را با مقادير پيش فرض Set مي كند . 2- اشاره گر Mouse را به مركز صفحه منتقل مي كند . ثبات ورودي : Ax := 0 ; ثبات خروجي : درايور Mouse نصب شده است . Ax = ffff Hex درايور Mouse نصب نشده است . Ax = 0000 Hex تعداد كليد هاي Mouse را مشخص مي كند . Bx = 3 function mreset:integer; var i:integer; begin asm;{ اين دستور براي نوشتن دستورات اسمبلي بكار مي رود . } mov ax,0; int 33h; {فراخواني وقفه } mov i,ax; end; end; نكته : اين تابع فقط Mouse را فعاي مي كند ولي اشاره گر Mouse را آشكار نمي كند . براي نمايان شدن اشاره گر Mouse بايد از تابع بعدي استفاده كنيم . تابع 01Hex از وقفه 33Hex : اين تابع اشاره گر Mouse را در صفحه نشان مي دهد . قبل از اجراي اين تابع بايد تابع Mreset اجرا شده باشد . ثبات ورودي : Ax := 01 ; ثبات خروجي : ندارد . procedure mshow; begin asm; mov ax,01h; int 33h; end; end; تابع 02Hex از وقفه 33Hex : اين تابع اشاره گر Mouse را پنهان مي كند . ثبات ورودي : Ax := 02 ; ثبات خروجي : ندارد . procedure mhide; begin asm; mov ax,02h; int 33h; end; end; تابع 03Hex از وقفه 33Hex : اين تابع براي تشخيص مكان اشاره گر Mouse در هر لحظه و تعيين كليد فشره شده بكار مي رود . ثبات ورودي : Ax := 03 ; ثبات خروجي : مختصات اشاره گر Mouse روي محور Xها :Cx مختصات اشاره گر Mouse روي محور Yها x تعيين كليد فشرده شده : Bx کلید چپ : 0 کلید راست : 1 کلید وسط : 2 ساختار ثبات Bx بصورت شكل بالا است پس به ازاي فشرده شدن هر كليد مقادير زير را خواهيم داشت . كليد چپ Bx = 1 : كليد راست Bx = 2 : كليد وسط Bx = 4 : procedure mbutton(var x1:integer;var y1:integer;var k1:integer); var x,y,k:integer; begin asm mov ax,03; int 33h; mov x,cx; mov y,dx; mov k,bx; end; x1:=x; y1:=y; k1:=k; end; تابع 04Hex از وقفه 33Hex : با استفاده از اين تابع مي توانيد اشاره گر Mouse را بصورت نرم افزاري در مكان دلخواه قرار دهيد . ثبات ورودي : Ax := 04 ; مختصات اشاره گر Mouse روي محور Xها : Cx مختصات اشاره گر Mouse روي محور Yها : Dx ثبات خروجي : ندارد . procedure move(x,y:integer); begin asm mov ax,04; mov cx,x; mov dx,y; int 33h; end; end; تابع 10Hex از وقفه 33Hex : اين تابع ناحيه حركت Mouse را مشخص مي كند . هنگام استفاده از اين تابع Mouse در محدوده اي كه اين تابع تعيين مي كند ، غير فعال است و فقط در بقيه مناطق حركت مي كند . [TABLE="class: cms_table, align: center"] [TR] [TD][/TD] [TD]Ax := 10 ; Cx := x1; Dx := y1; Si := x2; Di := y2; [/TD] [/TR] [/TABLE] ثبات خروجي : ندارد . procedure mexclusion(x1,y1,x2,y2:integer); begin asm mov ax,10h; mov cx,x1; mov dx,y1; mov si,x2; mov di,y2; int 33h; end; end; تابع 0f Hex از وقفه 33Hex : اين تابع براي تغيير سرعت حركت Mouse استفاده مي شود . هرچه مقدار وردي اين تابع بزرگتر باشد سرعن Mouse كمتر مي شود . در يك برنامه معمولي با مقادير (10,10) سرعتي مناسب براي Mouse تعيين مي شود . ثبات ورودي : Ax := 0f ; سرعت Mouse روي محور Xها : Cx سرعت Mouse روي محور Yها : Dx ثبات خروجي : ندارد . procedure mspeed(x,y:integer); begin asm mov ax,0fh; mov cx,x; mov dx,y; int 33h; end; end;