تبلیغات :
آکوستیک ، فوم شانه تخم مرغی، صداگیر ماینر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




صفحه 3 از 6 اولاول 123456 آخرآخر
نمايش نتايج 21 به 30 از 51

نام تاپيک: مباحث پیشرفته و کاربردی در Vb

  1. #21
    اگه نباشه جاش خالی می مونه A_M_IT2005's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    بین جهنم و بهشت
    پست ها
    331

    پيش فرض آشنايي با BitBlt

    سلام

    آشنايي با BitBlt

    هدف از اين مبحث آموزشي ، آشنايي با تابع BitBlt و برخي ديگر از توابع کتابخانه Win32 GDI براي انجام برخي عمليات گرافيکي مثل double buffering و خواندن sprite از فايل است .
    نکته : sprite به کاراکترهاي متحرکي گفته مي شود که در بازيها وجود دارد .
    اولين چيزي که به آن نياز داريد ايجاد يک فرم است . خاصيت ScaleMode آنرا برابر 3-Pixel قرار دهيد . پيشنهاد مي کنم که هميشه در هنگام استفاده از فرم بهمراه API از pixel براي scalemode استفاده کنيد .
    سپس سايز فرم را به اندازه اي افزايش دهيد تا ScaleWidth برابر 320 و ScaleHeight برابر 256 شود . توجه کنيد که خاصيت HasDC فرم را True قرار دهيد . همچنين از خاصيت AutoRedraw براي فرم استفاده نمي کنيم زيرا مي خواهيم از Double Buffering استفاده کنيم که بسيار سريعتر و کارامدتر مي باشد .
    مرحله بعدي declare کردن API هايي است که به آنها نياز داريم :

    'blitting
    Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
    'code timer
    Private Declare Function GetTickCount Lib "kernel32" () As Long
    'creating buffers / loading sprites
    Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
    Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
    Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
    'loading sprites
    Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
    'cleanup
    Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
    Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long

    سوال : DC چيست ؟ DC و يا بعبارت ديگر Device Context ، hDC يک عدد است که به يک آدرس در حافظه اشاره مي کند که داده اي در آن ذخيره شده است . در هنگام استفاده از BitBlt براي اشاره کردن به آدرسي که داده گرافيکي در آنجا ذخيره شده ، استفاده مي شود .
    در مرحله بعدي نياز به ذخيره آدرسهاي DC داريم که مي سازيم . آدرسهاي DC مقادير Long هستند همچنين آنها را بصورت Public تعريف مي کنيم :

    'our Buffer's DC
    Public myBackBuffer As Long
    Public myBufferBMP As Long
    'The DC of our sprite/graphic
    Public mySprite As Long
    'coordinates of our sprite/graphic on the screen
    Public SpriteX As Long
    Public SpriteY As Long

    حال بايد تابعي بسازيم که تصاوير گرافيکي درون حافظه load کند . نکته مهمي که بايد به آن توجه کنيد اينست که يک device context خودش به تنهايي هيچ داده گرافيکي ندارد و بايستي يک bitmap موجود باشد تا درون آن load شود براي مثال يک فايل bmp يا يک bitmap خالي که از آن بعنوان back buffer استفاده مي کنيد .
    تابعي که خواهيم نوشت يک device context منطبق با صفحه مي سازد سپس فايلهاي گرافيکي مورد نظر را درون device context قرار مي دهد :

    Public Function LoadGraphicDC(sFileName As String) As Long
    'temp variable to hold our DC address
    Dim LoadGraphicDCTEMP As Long
    'create the DC address compatible with
    'the DC of the screen
    LoadGraphicDCTEMP = CreateCompatibleDC(GetDC(0))
    'load the graphic file into the DC...
    SelectObject LoadGraphicDCTEMP, LoadPicture(sFileName)
    'return the address of the file
    LoadGraphicDC = LoadGraphicDCTEMP
    End Function

    سوال : double-buffering چيست ؟ زمانيکه يک محيط گرافيکي مي سازيد تا درون آن چيزي را ترسيم کنيد ، شما sprite ها / گرافيکها / متن را درون حافظه blit مي کنيد ( offscrean ) سپس نتيجه نهايي را روي صفحه blit مي کنيد . اين عمل از لرزش تصوير يا flickering جلوگيري مي کند ( زماني رخ مي دهد که چندين sprite مستقيماً روي صفحه blit شوند ) و بسيار سريعتر از AutoRedraw است .
    قبل از اينکه مثالي براي اين تابع ذکر کنم تابع BitBlt را توضيح خواهم داد :
    BitBlt تابعي از کتابخانه dll “gdi32” است . اين تابع يک انتقال bit-block از داده هاي مرتبط به يک مستطيل از پيکسلها به يک device context مقصد انجام مي دهد . بعبارت ديگر داده هاي گرافيکي را از محيط گرافيکي ( يک bitmap ) به محيط گرافيکي ديگري ( screen يا يک form ) کپي مي کند . فرم کلي اين تابع بصورت زير است :

    Declare Function BitBlt Lib "gdi32" Alias "BitBlt" _
    (ByVal hDestDC As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal nWidth As Long, _
    ByVal nHeight As Long, _
    ByVal hSrcDC As Long, _
    ByVal xSrc As Long, _
    ByVal ySrc As Long, _
    ByVal dwRop As Long) As Long

    اولين خط بيان مي کند که ما بوسيله gdi32 DLL به تابع BitBlt دسترسي خواهيم داشت . خطوط ديگر پارامترهايي هستند که اين تابع مي گيرد :
    hDestDC : hDC مربوط به محيط مقصد ( اگر مي خواهيد مقصد يک فرم باشد از form.hDC استفاده کنيد و يا اينکه آدرس يک backbuffer را که ساخته ايد بدهيد )
    x : مختصات افقي محلي که مي خواهيد گرافيک شما ظاهر شود .
    y : مختصات عمدي محلي که مي خواهيد گرافيک شما ظاهر شود .
    nWidth : عرض گرافيک شما
    nHeight : ارتفاع گرافيک شما
    hSrcDC : hDC مربوط به محيط مبدا
    xSrc : افست x . 0 زماني استفاده مي شود که بخواهيد از سمت چپترين گوشه گرافيک مبدا عمل blit را انجام دهيد .
    ySrc : افست y
    dwRop : مد draw اي که در زمان blitting گرافيکتان مي خواهيد استفاده کنيد ( Raster Operations يا ROP ) . اين پارامتر مقادير زير را مي تواند بگيرد :
    - vbSrcCopy : داده تصوير مبدا را مستقيماً در مقصد کپي مي کند .
    - vbSrcPaint : داده هاي تصاوير مبدا و مقصد را با هم OR مي کند ( pseudo-alphablending effect )
    - vbSrcAnd : داده هاي تصاوير مبدا و مقصد را با هم AND مي کند ( pseudo-gamma effect )
    - vbSrcInvert : داده هاي تصاوير مبدا و مقصد را با هم XOR مي کند
    - vbSrcErase : ابتدا داده تصوير مقصد را invert مي کند سپس آنرا با داده تصوير مبدا AND مي کند .
    - vbDstInvert : داده تصوير مقصد را invert مي کند و داده تصوير مبدا را در نظر نمي گيرد .
    - vbNotSrcCopy : داده تصوير مبدا را invert مي کند و آنرا مستقيماً در مقصد کپي مي کند .
    - vbNotSrcErase : داده تصاوير مبدا و مقصد را OR کرده و نتيجه را invert مي کند .

    مثالي از کاربرد BitBlt :
    BitBlt Form1.hDC, PlayerX, PlayerY, 48, 48, picPlayer.hDC, 0, 0, vbSrcCopy

    حال مي خواهيم از BitBlt در يک حلقه استفاده کنيم تا يک image را در فرم حرکت دهيم :
    1 – يک فايل bmp با ابعاد 32x32 بسازيد و با نام sprite1.bmp در دايرکتوري پروژه ذخيره کنيد .
    2 – يک دکمه در فرم قرار دهيد و نام آنرا cmdTest بگذاريد .
    3 – دکمه را در گوشه بالايي فرم و در سمت راست قرار دهيد .
    4 – کد زير را براي event مربوط به کليک شدن دکمه بنويسيد :

    'Timer variables...
    Dim T1 As Long, T2 As Long
    ساخت DC براي backbuffer’
    myBackBuffer = CreateCompatibleDC(GetDC(0))
    ساخت يک سطح bitmap براي DC’
    myBufferBMP = CreateCompatibleBitmap(GetDC(0), 320, 256)
    load کردن سطح bitmap خالي درون buffer’
    SelectObject myBackBuffer, myBufferBMP
    قبل از blit کردن درون بافر بايد آنرا با black پر کنيم’
    BitBlt myBackBuffer, 0, 0, 320, 256, 0, 0, 0, vbWhiteness
    load کردن split توسط تابعي که در بالا نوشتيم’
    mySprite = LoadGraphicDC(App.Path & "\sprite1.bmp")
    cmdTest.Enabled = False
    == شروع حلقه اصلي ==’
    خواندن tickcount جاري’
    T2 = GetTickCount
    Do
    DoEvents
    T1 = GetTickCount
    اگر 15 ميلي ثانيه گذشته بود فريم بعدي شروع شود’
    If (T1 - T2) >= 15 Then
    پاک کردن محل قبلي sprite بوسيله پر کردن آنجا با black ‘
    BitBlt myBackBuffer, SpriteX - 1, SpriteY - 1,32, 32, 0, 0, 0, vbBlackness
    Blit کردن sprite درون back buffer’
    BitBlt myBackBuffer, SpriteX, SpriteY, 32, 32,mySprite, 0, 0, vbSrcPaint
    Blit کردن backbuffer روي فرم’
    BitBlt Me.hdc, 0, 0, 320, 256, myBackBuffer,0, 0, vbSrcCopy
    حرکت دادن sprite روي صفحه’
    SpriteX = SpriteX + 1
    SpriteY = SpriteY + 1
    'update timer
    T2 = GetTickCount
    End If
    Loop Until SpriteX = 320
    سپس بايد يک cleanup code بنويسيد تا حافظه هاي را که براي نگهداري تصاوير گرافيکي و buffer ها استفاده کرده ايد آزاد کنيد :

    Private Sub Form_Unload(Cancel As Integer)
    DeleteObject myBufferBMP
    DeleteDC myBackBuffer
    DeleteDC mySprite
    End
    End Sub

    [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
    Last edited by A_M_IT2005; 20-01-2007 at 21:58.

  2. #22
    اگه نباشه جاش خالی می مونه A_M_IT2005's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    بین جهنم و بهشت
    پست ها
    331

    پيش فرض آشنايي با شی پرينتر در ويژوال بيسيک

    سلام

    آشنايي با شی پرينتر در ويژوال بيسيک

    جلسه اول :

    مقدمه

    شی پرينتر ، شیي است که پرينتر پيش فرض سيستم را کنترل می کند . استفاده از شی پرينتر در ويژوال بيسيک 6 مانند کار با ساير اشيا است و بايستی از خواص و متدهای آن استفاده کرد . در ادامه با برخی از اين خواص و متدها آشنا خواهيد شد .

    چاپ متن توسط شی پرينتر

    برای چاپ متن توسط شی پرينتر کافيست خواص CurrentX و CurrentY که محل قرار گرفتن کرسر می باشد را تنظيم نوده و سپس با استفاده از متد Print متن مورد نظر را چاپ نموده و در پايان با استفاده از متد EndDoc صفحه چاپی را از پرينتر بيرون بدهيم . مثال :


    Printer.CurrentX=150
    Printer.CurrentY=200
    Printer.Print "Visual Basic Printer Object Test"
    Printer.EndDoc


    در مثال فوق فرض شده که ScaleMode برابر Pixel قرار داده شده است . توجه داشته باشيد که تا قبل از اجرای متد EndDoc عمل چاپ انجام نمی شود و فقط بعد از اين متد است که چاپ انجام شده و کاغذ بيرون می آيد .

    اگر پس از يک دستور Print ، دستور Print ديگری را استفاده کنيم متن روی خط بعدی چاپ خواهد شد . اگر بخواهيم متن بلافاصله بعد از متن اول چاپ شود بايد بعد از دستور Print اول از علامت ; استفاده کنيم .

    نکته : برای کنترل دقيق محل چاپ از CurrentX و CurrentY استفاده نمائيد .

  3. این کاربر از A_M_IT2005 بخاطر این مطلب مفید تشکر کرده است


  4. #23
    اگه نباشه جاش خالی می مونه A_M_IT2005's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    بین جهنم و بهشت
    پست ها
    331

    پيش فرض آشنايي با شی پرينتر در ويژوال بيسيک

    سلام

    آشنايي با شی پرينتر در ويژوال بيسيک

    جلسه دوم :

    چاپ گرافيک توسط شی پرينتر

    به 4 روش می توان اشکال گرافيکی را توسط شی پرينتر چاپ کنيد :
    1 – چاپ دايره : با استفاده از متد Circle می توان يک دايره ، قوس و يا بيضی را در صفحه چاپ کرد . فرمت کلی اين متد بصورت زير است :

    Circle (x,y),radius,[color],[start],[end],[aspect]

    که x و y مختصات مرکز دايره و radius شعاع آن می باشد .
    پارامترهای color ، start ، end و aspect اختياری هستند و بترتيب رنگ ، محل شروع قوس ، محل خاتمه قوس و نسبت شعاع بيضی را نشان می دهند .

    2 – چاپ خط : با استفاده از متد Line می توان يک خط و مستطيل را در صفحه چاپ کرد . فرمت کلی اين متد بصورت زير است :

    Line (x1,y1)-(x2,y2),[color],[B[F]]

    که x1 و y1 مختصات شروع خط ( يا مستطيل ) و x2 و y2 مختصات انتهای خط ( يا مستطيل ) هستند .
    پارامتر color اختياری بوده و رنگ خط ( يا مستتطيل ) را نشان می دهد .
    پارامتر B اختياری بوده و نشان می دهد يک مستيل رسم شود .
    پارامتر F اختياری بوده و بهمراه B می آيد و نشان می دهد يک مستطيل توپر رسم شود .

    3 – چاپ نقطه : با استفاده از متد PSet می توان نقطه ای روی صفحه چاپ کرد و فرمت کلی آن بصورت زير است :

    PSet (x,y),[color]

    که x و y مختصات نقطه می باشند .
    پارامتر color اختياری بوده و رنگ نقطه را نشان می دهد .

    4 – چاپ تصوير : با استفاده از متد PaintPicture می توان محتويات يک فايل گرافيکی را چاپ کرد . فرمت کلی اين متد بصورت زير است :

    Printer.PaintPicture picture, x1, y1, [width1], [height1], [x2], [y2], [width2], [height2], [opcode]

    x1 و y1 مختصات قرارگرفتن تصوير در صفحه بوده و picture يک شی از کلاس IPictureDisp است . اين شی را می توان از يک PictureBox يا از خاصيت Picture فرم گرفت و يا از دستور LoadPicture استفاده کرد .

    مثال 1 :


    Printer.PaintPicture Picture1.Picture, 100, 100

    مثال 2 :

    PaintPicture LoadPicture("C:\sample.jpg"), 100, 100

    width1 و height1 طول و عرض تصوير چاپی می باشند . x2 و y2 نيز بهمراه width2 و height2 می توانند ميزان برش از تصوير اصلی برای چاپ را مشخص کنند .

  5. #24
    اگه نباشه جاش خالی می مونه A_M_IT2005's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    بین جهنم و بهشت
    پست ها
    331

    پيش فرض آشنايي با شی پرينتر در ويژوال بيسيک

    سلام

    آشنايي با شی پرينتر در ويژوال بيسيک

    جلسه آخر :

    ساير خواص مهم شی پرينتر

    ColorMode : اگر پرينتر رنگی باشد ، رنگی يا تک رنگ بودن چاپ را تعيين می کند .
    Copies : تعداد چاپ را مشخص می کند .
    Font : نوع فونت چاپ متن را مشخص می کند .
    FontSize : سايز فونت چاپ متن را مشخص می کند .
    PrintQuality : کيفيت چاپ را مشخص می کند .

    ساير متدهای مهم شی پرينتر

    KillDoc : پرينت در حال چاپ را از صف چاپ حذف می کند .
    NewPage : صفحه جاری را به پايان برده و صفحه جديدی را برای چاپ آماده می کند .
    Scale : سيستم مختصات کاربر را تعيين می کند .
    TextHeight : ارتفاع متن پس از چاپ شدن در مختصات Scale را تعيين می کند .
    TextWidth : عرض متن پس از چاپ شدن در مختصات Scale را تعيين می کند

  6. #25
    اگه نباشه جاش خالی می مونه A_M_IT2005's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    بین جهنم و بهشت
    پست ها
    331

    پيش فرض آموزش DirectX-Graphic

    سلام

    آموزش DirectX-Graphic

    جلسه اول :

    DirectX8 ابزاري براي ساخت تصاوير ثابت و متحرک دو بعدي و سه بعدي مي باشد .
    براي کار با DirectX8 ابتدا بايستي آنرا روي سيستم خود نصب کنيد . سپس در محيط vb از منوي project گزينه References را انتخاب کنيد . در فرمي که ظاهر مي شود اطمينان حاصل کنيد که گزينه DirectX8 for VB type library فعال باشد .
    براي کار با DirectX8 بايستي از تعريف نمودن شي پايه DirectX8 شروع نمود :


    Dim Dx as DirectX8


    شي Direct3D8 براي کنترل اشيا‌‌ سه بعدي بکار مي رود :


    Dim D3D as Direct3D8


    شي Direct3DDevice8 ، سخت افزار مربوط به رندر تصاوير را مشخص مي کند :


    Dim D3DDevice as Direct3DDevice8


    حال براي شروع کار با Direct3D ، تابع ( ) initialise را تعريف مي کنيم . اگر اينکار درست انجام شود تابع ، مقدار true را برمي گرداند :


    public function initialise () as boolean
    Dim DispMode as D3DISPLAYMODE


    شي D3DISPLAYMODE حالت نمايش را مشخص مي نمايد .


    Dim D3Dwindow as D3DPRESENT_PARAMETERS


    شي فوق مشخص مي کند که viewport شما چگونه باشد .
    حال شي اصلي DirectX8 را مي سازيم :


    Set Dx=New DirectX8


    سپس شي اصلي ساخت واسط سه بعدي را مي سازيم :


    ()set D3D.Dx.Direct3Dcreate


    سپس حالت فعلي نمايش را با دستور زير استخراج مي کنيم :


    D3D.getadapterdisplaymode D3DADAPTER_DEFAULT,dispmode


    حال دو حالت براي کار با DirectX داريم :
    1 - windowed mode
    2 - fullscrean mode
    1 - براي کار با حالت پنجره اي ابتدا اين موضوع را به DirectX اطلاع مي دهيم :


    D3Dwindow.windowed=1


    سپس نوع referesh تصوير را مشخص مي کنيم ( در اينجا چند انتخاب وجود دارد که در صورت نياز به اطلاعات بيشتر با من تماس بگيريد . ) :


    D3Dwindow.swapeffect=D3DSWAPEFFECT_COPY_VSYNC


    سپس بايستي فرمت بافر نگهدارنده تصاوير را مشخص کنيم :


    D3Dwindow.backbufferformat=dispmode.format


    2 - براي کار با حالت تمام صفحه ، ابتدا نوع refresh را مشخص کرده سپس تعداد بافر هاي تصوير و سرانجام نوع و سايز بافر را مشخص مي نمائيم :


    D3Dwindow.swapeffect=D3DSWAPEFFECT_DISCARD
    D3Dwindow.backbuffercount=1
    D3Dwindow.backbufferformat=dispmode.format
    D3Dwindow.backbufferheight=dispmode.height
    D3Dwindow.backbufferwidth=dispmode.width


    سپس پنجره نمايش مشخص مي گردد :


    D3Dwindow.hdevicewindow=frmMain.hwnd



    @حال بايستی يک device ساخته شود که يا از طريق سخت افزار و يا نرم افزار تصاوير را رندر نمايد :


    Set D3DDevice=D3Dcreatedevice(D3DADAPTER_DEFAULT
    ,D3DDEVTYPE_HAL,
    frmMain.hwnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,
    D3Dwindow)x,
    end sub


    درصورتي که کارت گرافيک شما امکانات رندر سخت افزاري تصاوير را ندارد از D3DDEVTYPE_REF بجاي D3DDEVTYPE_HAL استفاده کنيد .
    حال بايستي روتين render را بنويسيم . البته در اين درس تصويري براي رندر نداريم و تنها چگونگي نوشتن اين روتين را بيان خواهم کرد :
    ۱ - ابتدا بايستي device مربوط به رندر ، قبل از کشيدن تصوير در آن پاک شود :


    D3DDevice.clear 0,byval 0,D3DCLEAR_TARGET,&H0,1#,0


    عدد hex اي که در دستور فوق آمده رنگ زمينه صفحه را مشخص مي کند
    ۲ - سپس بايستي تصاوير مورد نظر را رندر کنيم . اينکار توسط دستورات زير انجام مي شود :


    D3DDevice.beginscence
    all rendering calls go between these two lines '
    D3DDEvice.endscence


    3 - در پايان بايستي صفحه را update کنيد :


    D3DDevice.present byval 0,byval 0,0,byval 0

  7. #26
    اگه نباشه جاش خالی می مونه A_M_IT2005's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    بین جهنم و بهشت
    پست ها
    331

    پيش فرض آموزش DirectX-Graphic

    سلام

    آموزش DirectX-Graphic

    جلسه دوم :

    موضوع : بدست آوردن مشخصات و تواناييهاي گرافيکي يک سيستم توسط DirectX-Graphic


    1 - شمارش تعداد آداپتورهاي گرافيکي يک سيستم : فرض کنيد متغير nAdapters متغيري از نوع long باشد . همچنين شي D3DADAPTER_IDENTIFIER8 يک ساختار است که اطلاعات مربوط به آداپتور را نگه مي دارد . در اينصورت روتين enumerateAdapters بصورت زير خواهد بود :


    Dim adapterinfo as D3DADAPTER_IDENTIFIER8
    Private Sub EnumerateAdapters
    Dim i as integer
    nadapters=D3D.Getadaptercount


    براي بدست آوردن جزئيات آداپبورها بصورت زير عمل مي کنيم :


    for i=0 to nadapters-1
    D3D.GetadapterIdentifier i ,0,adapterinfo


    نام اين آداپتور بصورت ليستي از کدهاي اسکي است که بايستي آنها را درون يک string قرار دهيم :


    for j=0 to 511
    name=name & chr$(adapterinfo.description(j)) x
    next j
    name=replace(name,chr$(0)," ") x
    end sub


    بنابراين در متغير name نام آداپتور قرار خواهد گرفت .

    ۲ - مشخص کردن نوع Rendering : فرض کنيد شي D3DCAPS8 توانايي rendering آداپتور را نشان دهد . در اينصورت روتين EnumerateDevices بصورت زير خواهد بود :


    Private EnumerateDevices
    On Local Error resume next
    Dim Caps as D3DCAPS8
    deviceindex=0 'For Example
    D3D.Getdevicecaps deviceindex,D3DDEVTYPE_HAL,caps
    if err.number=D3DERR_NOTAVAILABLE then


    اگر آداپتور امکان رندر سخت افزاري نداشته باشد در اينصورت :


    MsgBox("Reference Rasterizer(REF)") x
    else
    MsgBox("Hardware Acceleration(HAL)+Reference Rasterizer(REF)") x
    end if
    end sub


    3 - شمارش تعداد Mode نمايشي آداپتور :
    فرض کنيد در صورت REF بودن امکان رندر ، متغير r=2 و در غيراينصورت r=1
    باشد . همچنين شي D3DDISPLAYMODE اطلاعات مدهاي نمايشي را در خود
    دارد . همچنين فرض کنيد متغير nModes از نوع longباشد . در اينصورت روتين enumeratedispmodes بصورت زير خواهد بود :


    Private Sub EnumerateDispModes(r as Long,n as Long) x
    Dim i as integer
    Dim mode_tmp as D3DDISPLAYMODE
    deviceindex=0 'For Example
    nModes=D3D.Getadaptermodecount(deviceindex) x
    for i=0 to nModes-1
    D3D.EnumAdapterModes(deviceindex,i,mode_tmp) x


    ابتدا Mode ها را به دو گروه ۱۶ بيتي و ۳۲ بيتي تقسيم مي کنيم :



    if mode_tmp.format=D3DFMT_R8G8B8 or mode_tmp=D3DFMT_X8R8G8B8 or mode_tmp=D3DFMT_A8R8G8B8 then


    حال چک مي کنيم که device قابل پذيرش و معتبر است يا نه :


    if D3D.checkdevicetype(deviceindex,r,mode_tmp.format, mode_tmp.format,Flase)>=0 then
    MsgBox(mode_tmp.width & "X" & mode_tmp.height & "32 Bit
    FMT:" & mode_tmp.format ) x & "
    end if
    else
    if D3D.checkdevicetype(deviceindex,r,mode_tmp.format, mode_tmp.format,Flase)>=0 then
    MsgBox(mode_tmp.width & "X" & mode_tmp.height & "16 Bit
    FMT:" & mode_tmp.format ) x & "
    end if
    end if
    next i


    4 - مشخص کردن توانايي هاي آداپتور گرافيکي : فرض کنيد در صورت REF بودن امکان رندر ، متغير r=2 و در غيراينصورت r=1 باشد :


    Private Sub EnumerateHardware(r as long) x
    Dim caps as D3DCAPS8
    D3D.Getdevicecaps deviceindex,r,caps
    If Caps.MaxActiveLights = -1 Then
    MsgBox "Maximum Active Lights: Unlimited" x
    Else
    MsgBox "Maximum Active Lights: " & Caps.MaxActiveLights
    End If
    MsgBox "Maximum Point Vertex size: " & Caps.MaxPointSize
    MsgBox "Maximum Texture Size: " & Caps.MaxTextureWidth & "X" & Caps.MaxTextureHeight
    MsgBox "Maximum Primatives in one call: " & Caps.MaxPrimitiveCount
    If Caps.TextureCaps And D3DPTEXTURECAPS_SQUAREONLY Then
    MsgBox "Textures must always be square" x
    End If
    If Caps.TextureCaps And D3DPTEXTURECAPS_CUBEMAP Then
    MsgBox "Device Supports Cube Mapping" x
    End If
    If Caps.TextureCaps And D3DPTEXTURECAPS_VOLUMEMAP Then
    MsgBox "Device Supports Volume Mapping" x
    End If
    If Caps.DevCaps And D3DDEVCAPS_PUREDEVICE Then
    MsgBox "Device supports the Pure Device Option" x
    End If
    If Caps.DevCaps And D3DDEVCAPS_HWTRANSFORMANDLIGHT Then
    MsgBox "Device supports hardware transform and lighting" x
    End If
    If Caps.DevCaps And D3DDEVCAPS_HWRASTERIZATION Then
    MsgBox "Device can use Hardware Rasterization" x
    End If
    If Caps.Caps2 And D3DCAPS2_CANCALIBRATEGAMMA Then
    MsgBox "Device can Calibrate Gamma" x
    End If
    If Caps.Caps2 And D3DCAPS2_CANRENDERWINDOWED Then
    MsgBox "Device can Render in Windowed Mode" x
    End If
    If Caps.Caps2 And D3DCAPS2_FULLSCREENGAMMA Then
    MsgBox "Device can calibrate gamma in fullscreen mode" x
    End If
    If Caps.RasterCaps And D3DPRASTERCAPS_FOGRANGE Then
    MsgBox "Device supports range based fog calculations" x
    End If
    If Caps.RasterCaps And D3DPRASTERCAPS_ANISOTROPY Then
    MsgBox "Device supports Anisotropic Filtering" x
    End If
    If Caps.RasterCaps And D3DPRASTERCAPS_ZBUFFERLESSHSR Then
    MsgBox "Device does not require a Z-Buffer/Depth Buffer" x
    End If

  8. #27
    اگه نباشه جاش خالی می مونه A_M_IT2005's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    بین جهنم و بهشت
    پست ها
    331

    پيش فرض آموزش DirectX-Graphic

    سلام

    آموزش DirectX-Graphic

    جلسه سوم :

    موضوع : رسم اشکال دو بعدي

    مروري بر object هاي DirectX8
    1 - DirectX8 : اين شي ، شي مرکزي براي directX است و به شما امکان دسترسي به توابع و اشيا DirectX را مي دهد .
    ۲ - Direct3D8 : شي اصلي براي کار با محيط سه بعدي مي باشد . هدف از آن ، ساخت Direct3DDevice8 است و همچنين شامل توابعي براي مشخص کردن توانايي هاي کارت گرافيک است .
    ۳ - Direct3DDevice8 : اين شي مسئول ساخت بافتها textures ، مديريت نورها در يک صحنه ، مديريت مواد materials و همچنين render صحنه است . در واقع اين شي ، قلب نمايشي کار شماست .
    4 - D3DX8 : گر چه هميشه نيازي به استفاده از اين شي نيست ، اما اين شي شامل توابعي براي ساخت برنامه هاي userfriendly تر توسط DirectX است . مثلاً ساخت اشيا سه بعدي ( مثل کره ، مکعب و ... ) ، ساخت بافتها ، ساخت سطوح و غيره
    شروع کار براي رسم اشيا دوبعدي
    ابتدا ثابت FVF را تعريف مي کنيم . اين ثابت توصيف " فرمت قابل انعطاف نقطه flexible-vertex-format " براي يک vertex دو بعدي انتقال يافته و ساده شده مي باشد .
    سپس بايستي يک ساختار براي توصيف اين vertex معرفي کنيم :


    Const FVF = D3DFVF_XYZRHW Or D3DFVF_TEX1 Or D3DFVF_DIFFUSE Or D3DFVF_SPECULAR
    Private Type TLVERTEX
    X As Single
    Y As Single
    Z As Single
    rhw As Single
    color As Long
    specular As Long
    tu As Single
    tv As Single
    End Type


    فرض کنيد بخواهيم يک مربع را در صفحه رسم کنيم . براي رسم آن نياز به 4 عدد vertex داريم . بنابراين آرايه TriStrip را از نوع TLVERTEX تعريف ميکنيم :


    Dim TriStrip (0 To 3) As TLVERTEX


    حال به سراغ تابع initialize که در درس ۱ با آن آشنا شديد مي رويم و دستورات زير را به آن اضافه مي کنيم :


    Private Function Initialize as boolean
    .
    .
    .


    ابتدا سيستم سايه زني vertex را طوري تنظيم مي کنيم که از FVF استفاده کند .


    D3DDevice.SetVertexShader FVF


    حال سيستم lighting را براي vertex هاي دو بعدي غير فعال مي کنيم زيرا نيازي به آن نداريم :


    D3DDevice.SetRenderState D3DRS_LIGHTING,false


    حال بايستي تابع initializeGeometry را اجرا کنيم . اين تابع را در ادامه توضيح خواهم داد . اگر نتيجه اين تابع true باشد دراينصورت initialize به درستي انجام شده است :


    if initializeGeometry()=true then initialize=true
    end function


    تابع initializeGeometry در اين درس ، تابعي ساده است که تنها آرايه Vertex ها را مقدار دهي مي کند . براي رسم يک مربع نياز به مقداردهي ۴ vertex در جهت عقربه هاي ساعت داريم ( اين مربع شامل ۲ مثلث است )



    Private Function InitialiseGeometry() As Boolean
    On Error GoTo BOut:
    color = RGB(200, 100, 0)
    TriStrip(0) = CreateTLVertex(100, 100, 0, 1, color, 0, 0, 0)
    TriStrip(1) = CreateTLVertex(300, 100, 0, 1, color, 0, 0, 0)
    TriStrip(2) = CreateTLVertex(100, 300, 0, 1, color, 0, 0, 0)
    TriStrip(3) = CreateTLVertex(300, 300, 0, 1, color, 0, 0, 0)
    InitialiseGeometry = True
    Exit Function
    BOut:
    InitialiseGeometry = False
    End Function


    همانطور که مشاهده مي کنيد براي تعريف vertex از تابع CreateTLVERTEX استفاده شده است . اين تابع صرفاً مقادير ساختار TLVERTEX را مقداردهي مي کند :


    Private Function CreateTLVertex(X As Single, Y As Single, Z As Single, rhw As Single, color As Long, specular As Long, tu As Single, tv As Single) As TLVERTEX


    نکته : ضمن اينکه شما مي توانيد مقادير اعشاري floating point را براي مختصاتهاي x و y و z بکار ببريد ، Direct3D مختصاتها را با گردکردن آنها تخمين مي زند و بنابراين ممکنست باعث ايجاد نتايج ناخواسته شود .


    CreateTLVertex.X = X
    CreateTLVertex.Y = Y
    CreateTLVertex.Z = Z
    CreateTLVertex.rhw = rhw
    CreateTLVertex.color = color
    CreateTLVertex.specular = specular
    CreateTLVertex.tu = tu
    CreateTLVertex.tv = tv
    End Function
    حال بايستي تابع Render را بنويسيم :
    Public Sub Render()
    D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET, 0, 1#, 0
    D3DDevice.BeginScene
    D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, TriStrip(0), Len(TriStrip(0))x
    D3DDevice.EndScene
    D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
    End Sub


    ساختار اصلي براي اجراي توابع فوق بصورت زير است :


    --Main part--
    Initialize
    Do While yourevent=true
    Render
    DoEvents
    Loop

  9. #28
    اگه نباشه جاش خالی می مونه A_M_IT2005's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    بین جهنم و بهشت
    پست ها
    331

    پيش فرض آموزشDirectX-Graphic

    سلام

    آموزشDirectX-Graphic

    جلسه چهارم :

    موضوع : آشنايي با برخي اصطلاحات

    1- Mesh : مش ، مجموعه اي از face ها است که يک شي سه بعدي را روي صفحه تشکيل مي دهند .

    ۲ - Face : يک چند ضلعی است که توسط مجموعه ای از نقاط به نام vertex ساخته مي شود .

    ۳ - Vertex : يک نقطه در فضاي سه بعدي است که براي دادن موقعيت ، scale و زاويه يک face استفاده مي شود .

    ۴ - Direct3D از شيي بنام D3DVERTEX براي نمايش يک Vertex استفاده مي کند . براي ساخت face نيز از آرايه اي از vertex ها استفاده مي شود . آرايه هميشه بايستي قابل تقسيم به سه باشد زيرا اشکال از face هاي مثلثي ساخته مي شوند . هنگاميکه اين مثلثها کنار هم گذاشته شوند ، شي سه بعدي را مي سازند . Direct3D از بافري با نام Index Buffer استفاده مي کند که با direct3D مي گويد که با چه ترتيبي vertex ها را رسم نمايد . index ها بايستي هميشه در جهت عقربه هاي ساعت مشخص شوند .

  10. #29
    اگه نباشه جاش خالی می مونه A_M_IT2005's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    بین جهنم و بهشت
    پست ها
    331

    پيش فرض آموزشDirectX-Graphic

    سلام

    آموزشDirectX-Graphic

    جلسه پنجم :

    موضوع : اختصاص بافت Texture به اشکال دو بعدي

    در اين درس مي خواهيم يک مربع که داراي بافت مي باشد را رسم کنيم . براي اينکار از کتابخانه کمکي D3DX8 استفاده مي کنيم . همچنين شي Direct3DTexture8 را نيز استفاده مي نمائيم .


    Dim D3DX as D3DX8
    Dim Texture as Direct3DTexture8


    حال بايستي در تابع Initialize بافت مربوطه را از روي يک فايل تصويري load کنيم :


    Private Function Initialize as boolean
    .
    .
    .
    Set Texture=D3DX8.CreateTextureFromFile(D3DDevice,app. path & yourfilename) x
    end function


    تابع Render نيز بصورت زير خواهد بود :


    Private Sub Render
    D3DDevice.clear 0,byval 0,D3DCLEAR_TARGET,0,1#,0
    D3DDevice.beginscence
    D3DDevice.SetTexture 0,Texture
    D3DDevice.DrawprimitiveUP D3DPT_TRIANGLESTRIP,2,Tripstrip(0),len(Tristrip(0) )x
    .
    .
    .
    end function

  11. #30
    اگه نباشه جاش خالی می مونه A_M_IT2005's Avatar
    تاريخ عضويت
    Oct 2005
    محل سكونت
    بین جهنم و بهشت
    پست ها
    331

    پيش فرض آموزشDirectX-Graphic

    سلام

    آموزش DirectX-Graphic

    جلسه ششم :

    موضوع : مفاهيم اوليه رسم اشکال سه بعدي در DirectX 8

    در اين درس با استفاده از Direct3D يک مکعب را رسم مي کنيم . براي اين منظور ابتدا نياز به يک بافر داريم که بتوانيم شکل مورد نظر خود را در آن ذخيره کنيم :


    Dim VBuffer as Direct3DVertexBuffer8


    براي رسم مکعب از vertex هاي سه بعدي استفاده مي کنيم . براي اينکار نياز به تعريف يک تايپ جديد داريم :


    Private Type LITVERTEX
    x as single
    y as single
    z as single
    color as long
    specular as long
    tu as single
    tv as single
    end type


    توصيف گر اين فرمت ، بصورت زير است :


    Const Lit_FVF = (D3DFVF_XYZ Or D3DFVF_DIFFUSE Or D3DFVF_SPECULAR Or D3DFVF_TEX1)x


    براي توصيف مکعب در اين درس از روشي غيرکارامد استفاده شده است . به اين ترتيب که از ۳۶ عدد vertex استفاده شده ( در درسهاي بعدي متدهايي معرفي خواهند شد که اجازه مي دهند از ۸ عدد vertex باري توصيف مکعب استفاده کنيد ) .


    Dim cube(35) as LITVERTEX


    سپس بايد يکسري ماتريس سه بعدي تعريف کنيم :
    اولين ماتريس ، matworld است که نشان مي دهد چگونه vertex ها در فضاي سه بعدي قرار گرفته اند . دومين ماتريس ، matview است که نشان مي دهد دوربين ( نقطه ديد ) در کجا قرار گرفته و سومين ماتريس ، matproj است که نشان مي دهد دوربين چگونه دنياي سه بعدي را روي صفحه دو بعدي نشان مي دهد :


    Dim matworld as D3DMATRIX
    Dim matview as D3DMATRIX
    Dim matproj as D3DMATRIX


    در تابع Initialize قبل از ساخت device بايستي چک کنيم که آيا مي توانيم از يک بافر Z شانزده بيتي استفاده کنيم يا نه ؟


    If D3D.CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, DispMode.Format, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_SURFACE, D3DFMT_D16) = D3D_OK Then
    D3DWindow.AutoDepthStencilFormat = D3DFMT_D16 '16 bit Z-Buffer


    حال بايستي متد D3DCreateDevice را اجرا کنيد . سپس بايد سيستم سايه زني vertex را با فرمت vertex مان تنظيم کنيم :


    D3DDevice.SetVertexShader Lit_FVF


    همچنين سيستم نورپردازي را غير فعال مي کنيم :


    D3DDevice.SetRenderState D3DRS_LIGHTING, False


    Direct3D هيچ مثلثي را که در ديد شما نباشد رسم نخواهد کرد . براي متوقف کردن اين امر بايستي حالت culling آنرا متوقف کنيد همچنين vertex ها را بترتيب عقربه هاي ساعت معرفي کنيد :


    D3DDevice.SetRenderState D3DRS_CULLMODE, D3DCULL_NONE


    سپس بايد فرمت بافر Z را فعال سازيد :


    D3DDevice.SetRenderState D3DRS_ZENABLE, 1
    Last edited by A_M_IT2005; 28-11-2006 at 04:02.

Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •