1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

آموزش محیط گرافیکی در توربو پاسکال 7

شروع موضوع توسط minaaa ‏21/10/11 در انجمن Pascal

  1. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,773
    تشکر شده:
    6,457
    امتیاز دستاورد:
    113
    براي برنامه نويسي در محيط گرافيكي نياز به مقدماتي براي ورود به محيط گرافيك است . اولين خط هر برنامه گرافيكي بعد از دستور 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 ;
    مختصات گوشه های صفحه نمایش به صورت زیر است.
    [​IMG]

    براي برگرداندن برنامه به حالت متني از دستور زيراستفاده مي كنيم .
    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 )
    در محيط گرافيك توربو پاسكال برنامه اي بنويسيد كه اشكال زير را در خروجي رسم كند . سعي كنيد توابع را طوري بنويسيد كه با دريافت مختصات يك نقطه از شكل مثلا" مركز آن ، تمام شكل را رسم كند . (مانند مثال مطرح شده در جزوه) سعي كنيد تمام مختصات لازم براي رسم اشكال را با فرمول بدست آوريد و تا حد امكان از استفاده مستقيم از اعداد خودداري كنيد .
    [​IMG]

    دستور كار (2 )
    در محيط گرافيك توربو پاسكال برنامه اي بنويسيد تا اشكال زير را به ترتيب و بصورت متحرك نمايش دهد. سرعت حركت آدمك بايد به گونه اي باشد كه بين مرحله اول تا آخر 2 ثانيه طول بكشد. نيازي به جابجايي خانه ها وجود ندارد ، برنامه را طوري بنويسيد كه آدمك از يك خانه بيرون بيايد و دوباره در همان خانه فرو برود . تابع رسم آدمك بايد به گونه اي باشد كه با دريافت مختصات يك نقطه مشخص (مركز خانه) آدمك را رسم كند و هر بار با كم يا زياد كردن مختصات اين نقطه آدمك را در محل جديدي رسم كند .
    [​IMG]


    دستور كار (3 )
    برنامه اي بنويسيد كه پنجره زير را رسم كند . براي طرح پنجره ها و رنگها به دلخواه تصميم بگيريد.
    [​IMG]

    دستور كار (4 )
    با استفاده از تابعي كه در دستور كار (2) نوشته ايد ، برنامه اي بنويسيد كه آدمك را به طور تصادفي در خانه هاي پنجره شماره يك ظاهر كند . به اين ترتيب كه با يك تابع شماره خانه اي را كه آدمك بايد در آن ظاهر شود ، به طور تصادفي توليد كنيد و سپس مختصات مركز آن خانه را به تابع رسم آدمك بدهيد . اين كار بايد تا زماني ادامه پيدا كند كه 10 بار آدمك در خانه هاي مختلف ظاهر و سپس ناپديد شود . تابع حركت آدمك را بدون استفاده از Delay بنويسيد . براي ايجاد حالت متحرك بعد از هر بار رسم آدمك پنجره شماره 1 بايد مجددا" رسم شود .

    دستور كار (5 )
    برنامه اي بنويسيد كه ماوس را در پنجره شماره 2 فعال كند و محل كليك كردن ماوس را مشخص كند . بطوريكه اگر كاربر در هر محلي از يك خانه كليك كند برنامه شماره آن خانه را بعنوان خروجي برگرداند . مثلا" اگر كاربر در هر نقطه اي از خانه شماره 1 كليك كند برنامه عدد يك را بعنوان خروجي برگرداند .

    دستور كار (6 )
    برنامه اي را كه در دستور كار (4) نوشته ايد طوري تغيير دهيد كه اگر در زمان حركت آدمك ، كاربر ماوس را در هر كدام از خانه هاي پنجره شماره 2 كليك كند ، آدمك بعدي ظاهر شود . يعني با هر بار كليك ماوس بازي به مرحله بعدي برود .

    دستور كار (7 )
    برنامه دستور كار (6) را به گونه اي تغيير دهيد كه تشخيص دهد آيا شماره خانه اي كه ماوس در آن كليك شده ، با شماره خانه اي كه آدمك در آن حركت مي كرده يكسان است يا نه ؟ در صورت يكسان بودن شماره ها يك امتياز مثبت و در صورت يكسان نبودن يك امتياز منفي به كاربر بدهيد .
    پروژه نهايي :
    بازي كامپيوتري طراحي شده در طول ترم را تكميل كنيد به نحوي كه بعد از هر بازي امتياز كاربر را نمايش دهد .

    امكانات اضافي :
    1- استفاده از طرحها و رنگهاي متنوع در طراحي پنجره ها ، خانه ها و آدمكهاي بازي .
    2- ايجاد پنجره اي مخصوص نمايش امتياز كاربر در هر مرحله و در انتهاي بازي .
    3- استفاده از امكانات صوتي در مراحل مختلف بازي مثل شروع بازي ، پايان بازي ، انتخاب خانه صحيح ، انتخاب خانه غلط ، ظاهر شدن آدمك جديد ، ناپديد شدن آدمك متحرك .
    4- طراحي صفحه متحرك براي شروع و پايان بازي .
    5- ...
     
  2. کاربر پیشرفته

    تاریخ عضویت:
    ‏9/12/10
    ارسال ها:
    19,773
    تشکر شده:
    6,457
    امتیاز دستاورد:
    113
    پاسخ : آموزش محیط گرافیکی در توربو پاسکال 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ها :Dx

    تعيين كليد فشرده شده : 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; ​