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. 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:
1. 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;
2. 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);
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).
4. 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
5. 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 bên
Đã đế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