最近、ActiveBasic(バージョンは4.21.00)をはじめて、外部DLL呼び出しやクラスの処理も学び始めましたが、どうしてもわからないことが2つあります。
1.変数の値がリセットされている?
[ここをクリックすると内容が表示されます]
このプログラムのコード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Dim CallOnce_funcGameMain As BOOL 'ゲームのメインプログラム呼び出しフラグ
Dim APP_TITLE As String 'アプリケーション タイトル
Dim CWMain As CWait 'ウェイトクラス
Dim bgmpath As String 'BGMのパス
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
'ゲームのメインコード ---
Sub GameMain()
'FPS調整用の設定(その1) ---
Dim frames As Double
Dim beforeTime As Double
Dim fps As Double
Dim fps_status As String
frames = 0
fps = 60 'fps の値が調整する値
'---
'ゲーム初期化及び最初に実行されるプログラム ---
'CWMain.Wait(3000)
bgmpath = "dat\bgm\bol.ogg"
STReadOggFile(0,bgmpath,0)
STLoop(0)
STPlay(0)
'---
'ゲーム処理のループ
'FPS調整用の設定(その2) ---
beforeTime = timeGetTime()
'---
Do
'FPS調整用の設定(その3) ---
Dim nowTime As Double,progress As Double,idealTime As Double
nowTime = timeGetTime()
progress = nowTime - beforeTime
idealTime = (frames * (1000 / fps))
'---
'FPSの調整 ---
If idealTime > progress Then Sleep(idealTime - progress)
If progress >= 1000 Then '1秒経過した
fps_status = APP_TITLE + " FPS=" + Str$(frames-1)
SetWindowText(hMainWnd,StrPtr(fps_status))
beforeTime = nowTime
frames = 0
End If
frames++
'---
DoEvents()
Loop
End Sub
'通常のメインコード ---
Sub MainWnd_Destroy()
'終了処理
STStop(0,1)'BGMの停止
STEnd() 'BGM、SEの終了
wunison_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_IDM_Version_MenuClick()
DialogBox(hMainWnd,"Ver")
End Sub
Sub MainWnd_IDM_Quit_MenuClick()
Dim ret As Long
ret = MessageBox(hMainWnd,"終了しますか?","終了確認",MB_YESNO or MB_ICONEXCLAMATION or MB_DEFBUTTON2)
If ret = IDYES Then
MainWnd_Destroy()
End If
End Sub
Sub MainWnd_QueryClose(ByRef cancel As Integer)
Dim ret As Long
ret = MessageBox(hMainWnd,"終了しますか?","終了確認",MB_YESNO or MB_ICONEXCLAMATION or MB_DEFBUTTON2)
If ret = IDNO Then
cancel = 1
End If
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
'リソースデータなどの読み込み・関数の初期化など
APP_TITLE = "WILD UNISON" 'アプリケーション タイトル
SetWindowText(hMainWnd,StrPtr(APP_TITLE))'上の文字列をウィンドウのタイトルに設定
STInit(hMainWnd,0) 'BGM、SEの初期化
End Sub
Sub MainWnd_Paint(hDC As HDC)
'一回だけ実行する(ゲームのメインプログラムを呼び出す)
If CallOnce_funcGameMain = FALSE Then
GameMain()
CallOnce_funcGameMain = TRUE
End If
'画面の再描画
End Sub
コード: 全て選択
MainWnd_Paint(hDC As HDC)
2.クラスがうまく動かない
[ここをクリックすると内容が表示されます]
1.の時のコードで、コード: 全て選択
'ウェイト(時間待ち)クラス
Class CWait
Private
bTime As Long
nTime As Long
nCnt As Long
bCnt As Long
Public
'Wait_Count 関数(時間計測による指定時間の処理制御)
Function Wait_Count(wCnt As Long) As BOOL
If WC_Once = FALSE Then '1回だけ取得
bCnt = timeGetTime()
WC_Once = TRUE
End If
nCnt=timeGetTime()
If (nCnt - bCnt) >= wCnt Then
WC_Once = FALSE
Wait_Count = TRUE
Else
Wait_Count = FALSE
End If
End Sub
'Wait 関数(いかなる状況に関わらず、内部処理だけ指定時間、停止する)
Sub Wait(wTime As Long)
bTime=timeGetTime()
Do
nTime = timeGetTime()
DoEvents()
Loop While (nTime - bTime) <= wTime
End Sub
End Class
コード: 全て選択
'CWMain.Wait(3000)
これがプログラムのミスなのか、それとも仕様なのか(バグではないと思ってます)、教えていただきたいです。