VB DirectX7 2D Game Sample (비베 다이렉트7 샘플)

비주얼베이직으로 게임을 만들고 싶은데

만드는 법을 모르는 사람들을 위해서.

 

본 자료는 비주얼베이직(VB)에서 다이렉트X7을 활용하여 게임을 만들 수 있게

도와주는 초보자용 기초자료이다.

 

1. 첨부파일을 다운받아서 VB6로 열고

2. 본 게시물을 잘 읽어보면, 초보도 충분히 가능하다

 

< VB DirectX7 2D Game Sample (비베 다이렉트7 샘플) >

 

이 예제는 나도 어디에서 배운 것을 재구성해본 것이다.

최근에 다이렉트 최신버젼이 많이 나오면서 다이렉트X 7 을 쓰는 사람은 잘 없겠으나,

아는 사람은 알겠지만 다이렉트X 8 이상부터는 3D 기반이라서 이해하기가 힘들 수 있다.

 

따라서 2D 게임을 쉽게 만들어보고 싶다면,

비주얼 베이직으로 다이렉트 7부터 차근히 만들어보는 것도 나쁘지 않다.

 

이해를 돕기 위해 모듈없이 폼 하나 안에 전부 넣어 구성하였고,

비주얼 베이직 기초가 된 사람이라면 이를 적절히 수정해서 1945 류의 슈팅게임 정도는 만들 수 있을 것이다.

(변수 선언하는 법, 변수 값 바꾸는 법, For문, If문, Do-loop문 정도만 알아도)

 

물론 다이렉트X 7 를 거의 이해 못해도 가능하다.

 

1. 비주얼베이직 실행 – 프로젝트 – 참조 – DirectX 7 for Visual Baisc Type Library를 체크

2. Form1의 코딩창을 열고 아래 소스 전문을 복사 – 붙여넣기

——————————————————————————–

*소스 전문(All Source)

 

Option Explicit
Private Declare Function GetKeyState Lib “user32” (ByVal nvirkey As Long) As Integer

Private DX As New DirectX7 ‘다이렉트X
Private DDraw As DirectDraw7 ‘다이렉트 드로우
Private DDSPrimary As DirectDrawSurface7 ‘주화면
Private DDSBack As DirectDrawSurface7 ‘배고하면
Private DDSSprite As DirectDrawSurface7 ‘스프라이트 그림변수
Private DDSBGround As DirectDrawSurface7 ‘스프라이트 그림변수

Private bEnd As Boolean ‘게임루핑
Private X As Integer, Y As Integer

Private Sub form_click()
bEnd = True
End Sub

‘다이렉트 드로우 초기화
Private Sub InitDDraw()
Dim DDSD As DDSURFACEDESC2
Dim Caps As DDSCAPS2
Dim ColorKey As DDCOLORKEY

Set DDraw = DX.DirectDrawCreate(“”)  ‘초기화

‘독점모드 설정
Call DDraw.SetCooperativeLevel(Me.hWnd, DDSCL_EXCLUSIVE Or DDSCL_FULLSCREEN)

‘해상도
Call DDraw.SetDisplayMode(800, 600, 16, 0, DDSDM_DEFAULT)

‘주화면 환경변수 삽입
DDSD.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT
DDSD.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX
DDSD.lBackBufferCount = 1

‘주화면 생성
Set DDSPrimary = DDraw.CreateSurface(DDSD)

‘백화면 환경변수 삽입
Caps.lCaps = DDSCAPS_BACKBUFFER

‘백화면 생성
Set DDSBack = DDSPrimary.GetAttachedSurface(Caps)

Set DDSBGround = CreateOffScreenFromBMP(App.Path & “\air.bmp”, 800, 600)
Set DDSSprite = CreateOffScreenFromBMP(App.Path & “\plain.bmp”, 800, 600)

ColorKey.high = 0
ColorKey.low = 0

Call DDSSprite.SetColorKey(DDCKEY_SRCBLT, ColorKey)

End Sub

Private Function CreateOffScreenFromBMP(szFileName As String, iwidth As Integer, iheight As Integer) As DirectDrawSurface7
Dim DDSTemp As DirectDrawSurface7
Dim DDSD As DDSURFACEDESC2

‘스프라이트 화면 환경변수 설정
DDSD.lFlags = DDSD_WIDTH Or DDSD_HEIGHT Or DDSD_CAPS
DDSD.lWidth = iwidth
DDSD.lHeight = iheight
DDSD.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_SYSTEMMEMORY

‘스프라이트 화면 생성
Set DDSTemp = DDraw.CreateSurfaceFromFile(szFileName, DDSD)

Set CreateOffScreenFromBMP = DDSTemp

End Function

Private Sub Render()
On Error Resume Next

‘출력 목적 좌표와 원본 그림 좌표를 기억할 변수
Dim rcDest As RECT, rcSrc As RECT
Dim iX As Integer, iY As Integer

iX = X
iY = Y

‘배경 그림 사이즈
rcSrc.Left = 0: rcSrc.Top = 0: rcSrc.Right = 800: rcSrc.Bottom = 600

‘백화면에 그림을 출력
Call DDSBack.BltFast(0, 0, DDSBGround, rcSrc, DDBLTFAST_WAIT)

‘스프라이트 출력될 좌표를 설정
rcDest.Left = iX: rcDest.Top = iY: rcDest.Right = iX + 80: rcDest.Bottom = iY + 80

‘원본 그림중 출력할 그림의 좌표
rcSrc.Left = 0: rcSrc.Top = 0: rcSrc.Right = 80: rcSrc.Bottom = 80

‘화면 밖에 나갔을때 처리
If iX < 0 Then rcSrc.Left = iX * -1: iX = 0
If iX > 800 – 80 Then rcSrc.Right = 800 – iX
If iY < 0 Then rcSrc.Top = iY * -1: iY = 0
If iY > 600 – 80 Then rcSrc.Bottom = 600 – iY

‘백화면에 그림을 출력
Call DDSBack.BltFast(iX, iY, DDSSprite, rcSrc, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY)

Call DDSPrimary.restore ‘Alt+Tab을 대비하여 복구

‘백화면에 있는걸 주화면으로 전송
Call DDSPrimary.Flip(DDSBack, DDFLIP_WAIT)

End Sub

Private Sub Form_Load()
Me.Show

‘DirectX 초기화
Call InitDDraw

X = 0
Y = 0
bEnd = False

‘bEnd가 True가 될때까지 루핑
‘bEnd는 마우스를 클릭했을 때와 ESC를 눌렀을 경우 TRUE가 됨
Do Until bEnd = True

KeyState
Render
DoEvents
Loop

Unload Me

End Sub

‘키입력
Private Sub KeyState()
If GetKeyState(vbKeyRight) < 0 Then
X = X + 3
End If

If GetKeyState(vbKeyLeft) < 0 Then
X = X – 3
End If

If GetKeyState(vbKeyUp) < 0 Then
Y = Y – 3
End If

If GetKeyState(vbKeyDown) < 0 Then
Y = Y + 3
End If

If GetKeyState(vbKeyEscape) < 0 Then
bEnd = True
End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
Set DDSSprite = Nothing
Set DDSBack = Nothing
Set DDSPrimary = Nothing
Set DDraw = Nothing
Set DX = Nothing

End Sub