• Thứ Năm, 15/05/2008 08:24 (GMT+7)

    Lập trình game 3D với Visual Basic

    Khi nói đến lập trình game 3D thường chúng ta nghĩ đến các ngôn ngữ lập trình VC++, C#, với các thư viện lập trình như OpenGL hoặc DirectX. Vậy còn VB - một ngôn ngữ khá thông dụng thì sao? Cũng được, ngay cả với Visual Basic 6.0, thông qua bộ công cụ của 3DState. Bộ công cụ rất dễ sử dụng và miễn phí cho sinh viên, bạn có thể tải về từ trang web http://www.3dstate.com.

    Bộ công cụ này cung cấp một số lượng lớn các hàm và thư viện lập trình từ xử lý đối tượng 3D, tệp mô hình 3D (*.MD2, *.MD3,...) các hàm xử lý bàn phím, chuột, khiến cho việc lập trình game 3D dễ dàng hơn bao giờ hết.

    Hãy xem ví dụ nạp một nhân vật hoạt hình 3D, sau đó dùng bàn phím để điều khiển hoạt động của nhân vật.

    Hình 1: Nhân vật 3D được nạp vào "thế giới" trong phòng có lò sưởi và các đồ đạc khác, người dùng có thể dùng bàn phím để điều khiển nhân vật

    Ví dụ này gồm các thủ tục xử lý sau:
    - LoadWorld: thủ tục nạp file thế giới hay còn gọi là file địa hình của trò chơi;
    - LoadPlayer1: thủ tục nạp nhân vật 3D vào thế giới game;
    - DefineAnimations: thủ tục chuẩn bị và định nghĩa các hành động của nhân vật 3D theo các phím được bấm;
    - InitCamera: thủ tục làm việc với các máy quay phim (camera) một kỹ thuật không thể thiếu với lập trình 3D;
    - InitHardware: thủ tục làm việc với các thiết bị card đồ họa và âm thanh;
    - EnterWorldBegin: thủ tục chính để xử lý các hành động của cả trò chơi, ở ví dụ này, nhân vật 3D sẽ được nạp vào thế giới và người sử dụng dùng bàn phím máy tính để tương tác với nhân vật, khi bấm các phím đã được gán trước nhân vật sẽ có hành động tương ứng như đi lại, chạy, nhảy...

    Các bạn có thể đọc thêm phần hướng dẫn của bộ công cụ để hiểu thêm các hàm và thư viện sử dụng trong chương trình, ở đây tôi chỉ giải thích sơ qua một số hàm thường dùng nhất khi lập trình game 3D với bộ thư viện 3DSTATE:
    • Hàm nạp file thế giới:
    lngw=STATE_engine_load_world(filename,path1,path2,world_mod);

    Hàm này trả về một giá trị Long cho biết việc nạp file thế giới có thành công hay không; trong đó:
    Tenfile: Chỉ cho chương trình biết tên file thế giới bạn đang muốn nạp làm nền cho trò chơi;
    path1: Đường dẫn tới thư mục chứa file thế giới;
    path2: Đường dẫn tới thư mục chứa các hình ảnh tạo nên file thế giới;

    • Hàm nạp file mô hình (nhân vật 3D):
    lngPlayer = STATE_object_create_from_file(TenFile)

    Hàm này trả về một giá trị Long báo cho chương trình biết việc nạp file mô hình có thành công hay không; trong đó: TenFile là file mô hình có phần mở rộng *.MD2 hoặc *.MD3 (các loại file định dạng mô hình Quake 2 hoặc Quake 3);

    • Hàm nạp Skin(áo ,quần , da, tóc,...) cho nhân vật:
    - lngSkin = STATE_bitmap_load(Bitmap1, Trans1)
    - STATE_object_set_bitmap lngPlayer, lngSkin

    Nhóm hàm này đi kèm với nhau để "mặc" cho nhân vật "quần áo" và trang bị cho nhân vật "mầu da" đúng với mô tả trong file ảnh Bitmap1 (chú ý Skin là ảnh jpg hoặc bmp).

    • Nhóm hàm xử lý camera
    - lngViewCamera = STATE_camera_get_default_camera() hàm khởi tạo camera mặc định của chương trình
    - STATE_camera_set_object_to_chase lngViewCamera, lngPlayer hàm gắn camera cho nhân vật 3D theo dạng bám sát;
    - STATE_camera_set_chase_distance lngViewCamera, 400 hàm đặt khoảng cách quan sát từ camera đến nhân vật là 400 điểm
    - STATE_camera_set_location1 lngViewCamera, dblCameraPosition(0) hàm này cực kỳ quan trọng, dùng trong việc cập nhật vị trí camera sau khi nhân vật đã di chuyển khỏi vị trí ban đầu

    • Thủ tục hiển thị kết quả ra cửa sổ form:

    STATE_engine_render Me.hwnd, lngViewCamera
    Thủ tục này quan trọng nhất và không thể thiếu, các khâu chuẩn bị đã xong chúng ta phải hiển thị kết quả lên form hiện tại Me.hwnd với sự quan sát của camera được gán trong lngViewCamera.

    Dưới đây là đoạn mã đơn giản hiển thị một thế giới, một nhân vật 3D đứng nhún nhẩy, đoạn mã được trích ra từ ví dụ của bộ công cụ:

    -----Chương trình chính-------------
    Option Explicit

    Dim strCurrentAnimation As String
    Dim lngChaseStyle As Long

    Private Sub Form_Activate()
    LoadWorld "ngoac.wld"
    LoadPlayer1
    InitCamera
    InitHardware
    EnterWorldBegin
    End Sub

    ----Thủ tục nạp file thế giới---------
    Private Sub LoadWorld(strWorldFileName As String)
    STATE_engine_hide_log_window
    Dim lngResult As Long
    lngResult = STATE_engine_load_world(strWorldFileName, App.Path & "\..\..\Worlds", App.Path & "\..\..\Worlds\Bitmaps", USER_DEFINED_BEHAVIOR)
    If lngResult <> OK Then ExitOnError "Error loading world"

    End Sub
    ---Thủ tục nạp nhân vật 3D------------
    Private Sub LoadPlayer1()
    Dim lngSkin, lngSkin1 As Long
    lngPlayer = STATE_object_create_from_file(App.Path & "\..\..\Worlds\Models\player.md2")

    If lngPlayer = 0 Then ExitOnError "Error loading player"

    lngSkin = STATE_bitmap_load(App.Path & "\..\..\Worlds\Models\skin.bmp", -1)

    If lngSkin = 0 Then ExitOnError "Error loading player skin"

    STATE_object_set_bitmap lngPlayer, lngSkin

    STATE_object_move lngPlayer, WORLD_SPACE, 100, -100, -100

    STATE_object_rotate_z lngPlayer, 0, WORLD_SPACE

    End Sub

    ---Thủ tục xử lý camera---------------
    Private Sub InitCamera()
    lngChaseStyle = CHASE_FLEXIBLE
    lngViewCamera = STATE_camera_get_default_camera()
    STATE_camera_set_chase_type lngViewCamera, lngChaseStyle
    STATE_camera_set_object_to_chase lngViewCamera, lngPlayer
    STATE_camera_set_chase_distance lngViewCamera, 400

    End Sub
    Private Sub InitHardware()
    If (STATE_3D_card_set_window_mode = VR_ERROR) Then
    If (STATE_3D_card_check_hardware_support = YES) Then
    MsgBox "Failed to initialize 3D Acceleration.", vbOKOnly, "No 3D card detected"
    End If
    End If
    End Sub

    -------Vòng lặp chính xử lý các thao tác của trò chơi-------------
    Private Sub EnterWorldBegin()
    Do While GetAsyncKeyState(vbKeyEscape) = 0
    DoEvents
    STATE_engine_render Me.hwnd, lngViewCamera
    Loop
    Unload Me
    End Sub

    ------Xử lý lỗi----------------------
    Public Sub ExitOnError(strReason As String)
    MsgBox strReason, vbExclamation, "Error"
    Unload Me
    End Sub

    -----Kết thúc trò chơi---------------
    Private Sub Form_Unload(Cancel As Integer)
    STATE_3D_card_use NO
    STATE_engine_close
    End
    End Sub

    Lưu ý: Để chạy được chương trình, các bạn phải tải về bộ công cụ hỗ trợ lập trình miễn phí tại website http://www.3dstate.com và cài vào máy tính. Sau đó mở file ví dụ tại thư mục như đường dẫn sau: C:\Program Files\3DSTATE\Visual Basic 3D Developer Studio 6.0 (Student Package)\SDK Samples\MD2demo\md2demo.vbp.

    Nếu chưa chạy được thì các bạn vào phần add module của Project và thêm tất cả module sẵn có của ví dụ vào như hình vẽ dưới.

    Đã đến lúc chúng ta bắt tay vào việc, hãy tự viết cho mình những game 3D thật hay nhé, chúc các bạn thành công.

    Phạm Quang Vinh
    E-mail: Qvpham1979@yahoo.co.uk

    ID: A0804_143