理論上どんな言語でもDXライブラリを使用することができます。
(言語によっては構造体は使えないかもしれませんが)
そこで、今日はExcelのVBAでDXライブラリを使用してみました。
作成したのは、見た目は中学生が作ったような単純なシューティングゲームです。
Declare Function dx_DxLib_Init Lib "DxLib.dll" () As Long
Declare Function dx_DxLib_End Lib "DxLib.dll" () As Long
Declare Function dx_ChangeWindowMode Lib "DxLib.dll" (ByVal flag As Long) As Long
Declare Function dx_SetDrawScreen Lib "DxLib.dll" (ByVal DrawScreen As Long) As Long
Declare Function dx_ScreenFlip Lib "DxLib.dll" () As Long
Declare Function dx_ProcessMessage Lib "DxLib.dll" () As Long
Declare Function dx_ClearDrawScreen Lib "DxLib.dll" (ByVal ClearRect As Long) As Long
Declare Function dx_GetHitKeyStateAll Lib "DxLib.dll" (ByRef KeyStateBuf As Byte) As Long
Declare Function dx_DrawTriangle Lib "DxLib.dll" ( _
ByVal x1 As Long, ByVal y1 As Long, ByVal x2 As Long, _
ByVal y2 As Long, ByVal x3 As Long, ByVal y3 As Long, _
ByVal Color As Long, ByVal FillFlag As Long) As Long
Declare Function dx_GetColor Lib "DxLib.dll" ( _
ByVal Red As Long, ByVal Green As Long, ByVal Blue As Long) As Long
Declare Function dx_DrawGraph Lib "DxLib.dll" ( _
ByVal x As Long, ByVal y As Long, ByVal GrHandle As Long, ByVal TransFlag As Long) As Long
Declare Function dx_DrawString Lib "DxLib.dll" ( _
ByVal x As Long, ByVal y As Long, ByVal Str As String, _
ByVal Color As Long, ByVal EdgeColor As Long) As Long
Declare Function dx_LoadGraph Lib "DxLib.dll" ( _
ByVal FileName As String, ByVal NotUse3DFlag As Long) As Long
Declare Function dx_GetRand Lib "DxLib.dll" (ByVal RandMax As Long) As Long
Const DX_SCREEN_BACK = -2
Const KEY_INPUT_ESCAPE = 1
Const KEY_INPUT_LEFT = 203
Const KEY_INPUT_UP = 200
Const KEY_INPUT_RIGHT = 205
Const KEY_INPUT_SPACE = &H39
Public Type tama_t
x As Long
y As Long
exist As Boolean
End Type
Public Type char_t
x As Long
y As Long
dx As Long
hp As Long
End Type
Const TAMA_MAX = 200
Sub Auto_Open()
Dim Key(256) As Byte
Dim e_tama(TAMA_MAX) As tama_t
Dim m_tama(TAMA_MAX) As tama_t
Dim mychar As char_t
Dim enemy As char_t
Dim spaceFlag As Boolean
Dim i As Long
Dim enemyGraph As Long
Dim mycharGraph As Long
ChDrive ThisWorkbook.Path
ChDir ThisWorkbook.Path
dx_ChangeWindowMode 1
dx_DxLib_Init
dx_SetDrawScreen DX_SCREEN_BACK
enemyGraph = dx_LoadGraph("enemy.png", 0)
mycharGraph = dx_LoadGraph("mychar.png", 0)
Randomize
enemy.x = 320
enemy.y = 50
enemy.hp = 100
enemy.dx = 5
mychar.x = 320
mychar.y = 430
mychar.dx = 3
mychar.hp = 10
spaceFlag = False
While Not dx_ProcessMessage() And Not dx_ClearDrawScreen(0) And Not dx_GetHitKeyStateAll(Key(0))
If enemy.hp > 0 And mychar.hp > 0 Then
If enemy.x > 640 - 100 Or enemy.x 0 Then mychar.x = mychar.x - mychar.dx
If Key(KEY_INPUT_RIGHT) And mychar.x 0 And mychar.hp > 0 Then
m_tama(i).y = m_tama(i).y - 5
If m_tama(i).y 0 And mychar.hp > 0 Then
e_tama(i).y = e_tama(i).y + 5
If e_tama(i).y > 650 Then e_tama(i).exist = False
If mychar.x <= e_tama(i).x + 10 And e_tama(i).x <= mychar.x + 50 And _
mychar.y <= e_tama(i).y + 30 And e_tama(i).y <= mychar.y + 30 Then
e_tama(i).exist = False
mychar.hp = mychar.hp - 1
End If
End If
dx_DrawTriangle e_tama(i).x + 5, e_tama(i).y + 30, e_tama(i).x, e_tama(i).y, _
e_tama(i).x + 10, e_tama(i).y, dx_GetColor(255, 255, 0), 1
End If
Next
'自機
dx_DrawGraph mychar.x, mychar.y, mycharGraph, 1
'敵
dx_DrawGraph enemy.x, enemy.y, enemyGraph, 1
'HP表示
dx_DrawString 10, 10, " 敵のHP:" & enemy.hp, dx_GetColor(255, 0, 0), 0
dx_DrawString 10, 40, "自機のHP:" & mychar.hp, dx_GetColor(0, 255, 0), 0
'クリア・ゲームオーバー
If mychar.hp <= 0 Then
dx_DrawString 100, 100, "ゲームオーバー", dx_GetColor(255, 0, 0), 0
ElseIf enemy.hp <= 0 Then
dx_DrawString 100, 100, "ゲームクリア!", dx_GetColor(0, 255, 0), 0
End If
dx_ScreenFlip
Wend
dx_DxLib_End
End Sub
ただし、DXライブラリのウィンドウを閉じるとExcelも終了してしまうのが玉に瑕ですね。
オフトピック
VBA難しい。
文の最後についセミコロンを付けてしまうし。
関数を単独で使うときに引数をかっこで囲むとイコールを請求するなぞなぞを出してくるし。
エラーを一個ずつしか出してくれないし。
変数をtypoしても実行できてしまうし。
(不慣れなだけですね、わかります)
文の最後についセミコロンを付けてしまうし。
関数を単独で使うときに引数をかっこで囲むとイコールを請求するなぞなぞを出してくるし。
エラーを一個ずつしか出してくれないし。
変数をtypoしても実行できてしまうし。
(不慣れなだけですね、わかります)