وبلاگ تخصصي برنامه نويسي با VB

آشنايي با تکنيک Masking در متحرک سازي

حتماً بازيهاي دوبعدي را ديده ايد که يک کاراکتر متحرک توسط شما روي يک زمينه تصويري حرکت داده مي شود . تکنيکي که براي قراردادن يک کاراکتر متحرک روي يک زمينه ثابت استفاده مي شود Masking نام دارد . Masking عبارت است از حذف بخشهايي از کاراکتر متحرک که نمي خواهيم نشان داده شوند و قرار دادن کاراکتر روي يک زمينه تصويري . براي آشنايي بيشتر با اين تکنيک دو تصوير زير را مشاهده کنيد :



مي خواهيم کاراکتر يک هواپيما را روي زمينه تصويري حرکت دهيم .
براي اينکار نياز به دو Mask براي کاراکتر هواپيما داريم :
1 – Mask اول بدين صورت ساخته مي شود که نقاطي از کاراکتر را که مي خواهيم روي زمينه ظاهر شوند را به رنگ سياه و ساير نقاط را به رنگ سفيد در مي آوريم :


2 – Mask دوم معکوس ماسک اول است يعني نقاطي از کاراکتر را که مي خواهيم روي زمينه ظاهر شوند را به رنگ سفيد و ساير نقاط را به رنگ سياه در مي آوريم :


حال براي قرار دادن کاراکتر روي زمينه بايد مراحل زير انجام شود :
1 – قرار دادن ماسک اول روي زمينه با استفاده از MergePaint
2 – قرار دادن ماسک دوم روي کاراکتر با استفاده از MergePaint
3 – قرار دادن نتيجه مرحله اول روي نتيجه مرحله دوم با استفاده از And
مراحل برنامه نويسي :
1 - تعريف بافرهاي مورد نياز :

buffer1 = CreateCompatibleDC(GetDC(0))x
mybuffer1 = CreateCompatibleBitmap(GetDC(0), 50, 45)x
buffer2 = CreateCompatibleDC(GetDC(0))x
mybuffer2 = CreateCompatibleBitmap(GetDC(0), 320, 256)x
buffer3 = CreateCompatibleDC(GetDC(0))x
mybuffer3 = CreateCompatibleBitmap(GetDC(0), 320, 256)x

SelectObject buffer1, mybuffer1

SelectObject buffer2, mybuffer2

SelectObject buffer3, mybuffer3


ابعاد زمينه 320x256 و ابعاد کاراکتر هواپيما 50x45 است . buffer1 براي ذخيره کاراکتر و انجام عمليات شماره 2 بکار مي رود . buffer2 براي نگهداري زمينه بکار مي رود و buffer3 براي انجام عملياتهاي 1 و 3 بکار مي رود .

2 - Load کردن تصاوير مورد نياز :

mySprite = LoadGraphicDC(App.Path & "\sprite1.bmp")x
myMask1 = LoadGraphicDC(App.Path & "\mask1.bmp")x
myMask2 = LoadGraphicDC(App.Path & "\mask2.bmp")x


زمينه تصوير Picture فرم شما مي باشد پس ابتدا بايد به فرمتان يک picture را بعنوان background بدهيد .

3 – ذخيره زمينه در buffer2 :

BitBlt buffer2, 0, 0, 320, 256, Form1.hdc, 0, 0, vbSrcCopy


4 – شروع حلقه متحرک سازي و انجام Masking :

Do
DoEvents
قرار دادن زمينه در يک بافر کمکي’
BitBlt buffer3, 0, 0, 320, 256, buffer2, 0, 0, vbSrcCopy
Merge کردن ماسک اول با بافر کمکي زمينه’
BitBlt buffer3, SpriteX, SpriteY, 50, 45, myMask1, 0, 0, vbMergePaint
قرار دادن کاراکتر در يک بافر کمکي’
BitBlt buffer1, 0, 0, 50, 45, mySprite, 0, 0, vbSrcCopy
Merge کردن ماسک دوم با بافر کمکي کاراکتر’
BitBlt buffer1, 0, 0, 50, 45, myMask2, 0, 0, vbMergePaint
And کردن بافرهاي کمکي با هم’
BitBlt buffer3, SpriteX, SpriteY, 50, 45, buffer1, 0, 0, vbSrcAnd
قرار دادن نتيجه نهاي روي فرم’
BitBlt Form1.hdc, 0, 0, 320, 256, buffer3, 0, 0, vbSrcCopy
SpriteX = SpriteX + 1
SpriteY = SpriteY + 1
Loop Until SpriteX = 320


+ حامد شیدائیان ; ۱٢:٥٧ ‎ب.ظ ; چهارشنبه ٢٧ شهریور ،۱۳۸۱
comment نظرات ()