みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

ExcelでDXライブラリ

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

ExcelでDXライブラリ

投稿記事 by みけCAT » 12年前

DXライブラリはDLLが公開されているので、(任意の型の引数の)DLLが使える言語なら、
理論上どんな言語でもDXライブラリを使用することができます。
(言語によっては構造体は使えないかもしれませんが)

そこで、今日はExcelのVBAでDXライブラリを使用してみました。
作成したのは、見た目は中学生が作ったような単純なシューティングゲームです。

CODE:

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

このコードをExcelのVBAで書いて、ファイルを開いてマクロを有効にすると・・・
excel_dxlib_sanple.png
作ったゲーム
excel_dxlib_sanple.png (48.51 KiB) 閲覧数: 383 回
はい、この通りExcelでDXライブラリが動きました。
ただし、DXライブラリのウィンドウを閉じるとExcelも終了してしまうのが玉に瑕ですね。
オフトピック
VBA難しい。
文の最後についセミコロンを付けてしまうし。
関数を単独で使うときに引数をかっこで囲むとイコールを請求するなぞなぞを出してくるし。
エラーを一個ずつしか出してくれないし。
変数をtypoしても実行できてしまうし。
(不慣れなだけですね、わかります)
添付ファイル

[拡張子 zip は無効化されているため、表示できません]


ISLe
記事: 2650
登録日時: 14年前

Re: ExcelでDXライブラリ

投稿記事 by ISLe » 12年前

関数名の前にCallを置くと引数を括弧できたかと。

実行されるまでエラーがあっても分からないのがいま流行りのインタプリタ型言語ですね。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: ExcelでDXライブラリ

投稿記事 by みけCAT » 12年前

ISLe さんが書きました:関数名の前にCallを置くと引数を括弧できたかと。
新しい書き方を覚えないといけないことには変わりないですし、
だったらカッコをつけない書き方に慣れる方が私としては好みかな。
ごめんなさい。
最後に編集したユーザー みけCAT on 2012年11月10日(土) 21:13 [ 編集 1 回目 ]

ISLe
記事: 2650
登録日時: 14年前

Re: ExcelでDXライブラリ

投稿記事 by ISLe » 12年前

引数並びに括弧が必要かどうかと、引数を括弧するかどうかの機能の違いが分かっているなら良いです。
括弧が必要ないのにうっかり括弧を付けると意味が違ってしまう場合があるので。
最後に編集したユーザー ISLe on 2012年11月10日(土) 21:19 [ 編集 1 回目 ]

トントン
記事: 100
登録日時: 14年前

Re: ExcelでDXライブラリ

投稿記事 by トントン » 12年前

ISLe さんが書きました:関数名の前にCallを置くと引数を括弧できたかと。

実行されるまでエラーがあっても分からないのがいま流行りのインタプリタ型言語ですね。
亀レスですが。。。
中間言語に翻訳されるタイプなら実行しなくてもエラーを出せるはずです。
まぁ、VBAは多分駄目なような気はしますけど。