忍者ブログ
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

FLネタは有るには有るのですが、しばらく自粛するのでちょっとたまにはツールの開発サイドの話でも。

基本的にはド素人なのでかなり行きあたりばったりな感じで作ってます。
簡単なベースを「動けばいいや」みたいな感じで作ってるので、後から追加機能を肉付けするときに困ったりすることも多々あります。

というわけでシュクレクールさんとしては久しぶりにツールの開発をしました。
といっても過去のyui規模のものではなく(あれはホント大掛かりでしたね・・・。2PC前提でホームネットワーク組んで2PC目のファイルを開いたりしてましたからね・・・)、基幹が2日程度で、後のデバッグなどの調整に1週間っていう感じのものです。

エクセルのマクロを使うことでかなり面倒な部分も省略させてもらってます。

本記事はソースから抜粋してるので宣言とかを省略してます。
ソース全文はバトスケのVBAをみれば一目瞭然なのでそっちをみてください。


というわけでバトスケの開発コンセプトから見てみましょう


・バハ4層用に作ってます
・予め攻撃パターンを書き込んでおく必要があります
・1秒毎に1行下にスクロールします
・ウィンドウが非アクティブでも指し示す行が分かるように囲いをします
・フェーズ移行は手動(ボタン直押しorホットキー)
・時間表示を行う(動作中であることが目視で分かるように)

基本的にはこんな感じです。

まずいちばんの基幹となる1秒毎にスクロールするという部分の作成から始めました。

開始ボタンを押すと走ります。

まず実時間の取得と初期化?のような処理から始めます。

当初、時間補正を考えてなかったので、1/1000秒の取得を考えていたので実は無駄なプログラムとなってます。
Dim dblTimer As Double
dblTimer = CDbl(Timer)
これで0時からの経過秒数が1/1000秒単位で返ってきます。
(ジャスト午前11時なら39600.0000)
で、結果として少数以下要らなかったので
settime = Fix(dblTimer)
として丸めてます。
最初から少数以下を取得しないようにすればよかった話ですね。
こういうところが私の行きあたりばったり感です。

あと浮動小数とか扱わない限り、VBAは宣言なしで使えるので楽ですね。
大きいの組むときは逆に弊害になりそうですけど。

とにかくコレで実時間を取得したことに成ります。


次に、アクティブセルを頭に持ってきます。
カーソルが遊びに行ってたら戻してあげないといけないので。
(例えばP4でリスタートになった時に、P1のところにカーソルが戻ってくるようにしないといけないという話です)

ActiveWindow.ScrollColumn = 1
ActiveWindow.ScrollRow = 1

これで、まず表示が1行1列目に戻ってきます。

P0 = Sheet1.Range("B2").Value
Range(P0).Select

シート1のB2に予め開始セルを書き込んでおきます。ここはユーザーコンフィグの部分です。(例えば、盾役の人はカウントダウンが欲しくて、その他の人はいきなり始まってから動かすので、開始秒数が0かカウントダウン分がほしいかでユーザー設定できるようにしてます)
で、その設定したセルにselectでカーソルを動かしてます。

Range("A2").Value = TimeValue("00:00:00")
時間表示をするのでまずは開始時間を0にあわせます
Range("A1").Value = "Active"
動いてることを示すためにSTOPという表示をACTIVEにかえます。
Range("A1").Interior.ColorIndex = 6
と同時に、バックカラーを点滅(黄/白)させるので変えます。
ti = Now + TimeValue("00:00:01")
さっき取得した実時間とは違う方法で実時間を取得します。
コレは単純に+1秒の差分を取るためのものです。
Application.OnTime ti, "test"
この1秒後にtestという関数を走らせろと命令して初期化のパートは終わりです。

また、コメントオフ処理してますが、分かる人が見ればウィンドウの大きさを固定値にできるように
'Application.Height = 500
'Application.Width = 330
というのを入れてます。

そしてtest関数が走ります。
名前がおもいっきりテスト用に作ったものをそのまま使い続けてるってパターンですね。
まさに行きあたりばったり。

test関数ではまず補正をします。
1秒毎にスクロールとはいっても、差分で動かし続けると、プログラムの処理時間が加算されていき、次第に遅れていくという事が起こります。PCがビジーになると顕著なので、コレを実時間で補正しようという処理です。

If corrcount > 3 Then
comptime = Fix(CDbl(Timer)) - corrcount - settime
かといって、毎秒プログラムが走るたびに補正しても忙しすぎるので、
あるていどマージンを設けています。
1秒毎のこのtest関数が走るたびにcorrcountは+1されていきます。
そして3より大きくなった時に

comptimeをいまの実時間から、最初に取得した実時間を差し引いて、
さらに走った回数を引きます。
単純な話、10秒経っているのに、8回しか走ってなかったら、
その差分の2回を埋める必要がある。というのを算出してます。

そして補正

If comptime >= 1 Then
ActiveCell.Borders.LineStyle = False
ActiveCell.Offset(comptime, 0).Activate
ActiveWindow.SmallScroll down:=comptime
End If

corrcount = 0
settime = Fix(CDbl(Timer))
'Range("D1").Value = settime
End If

comptimeが1より大きかったら、
その差分分だけ選択セルを移動します。
そのご、補正カウンタをすべて初期化して、
次の補正に備えます。

3秒毎にこの補正をすることで、処理遅延を防いでます。

当初はこの補正機能は取り入れるつもりはありませんでした。
というのもPCのスペックを言い訳にして、こんな面倒なことをしたくなかったのです。
でも、実際のところは積もり積もって処理遅延は発生してしまうため、入れることに成りました。

でもって1行スクロールの本体です。

ActiveCell.Borders.LineStyle = False
まず今いるセルの囲い(強調線)を消します。
ActiveCell.Offset(1, 0).Activate
1つしたのセルにカーソルを動かします。
ActiveCell.BorderAround Weight:=xlMedium
移動したセルの囲いを付けます。
ActiveWindow.SmallScroll down:=1
1行だけスクロールします(カーソルだけ動かしても画面も動かさないといずれカーソルが消えていってしまう)
l = Range("A1").Interior.ColorIndex
ACTIVEって書いたセルの色を取得します
If l = 6 Then
Range("A1").Interior.ColorIndex = 0
黄色なら白(透明)へ
Else
Range("A1").Interior.ColorIndex = 6
それ以外なら黄色へ
End If

こんなかんじで、
囲いを消して→移動して→囲いを付ける

ッて感じの処理をしてます。
面倒ですね・・・。

でもって

Range("A2").Value = Range("A2").Value + TimeValue("00:00:01")
ti = Now + TimeValue("00:00:01")

ホットキーフラグチェック

If rensyakinsi = 0 Then
ホットキーフラグ処理
ElseIf rensyakinsi > 0 Then
rensyakinsi = rensyakinsi - 1
End If

音鳴らす

Application.OnTime ti, "test"
End Sub

経過時間を更新して、
ホットキーフラグ関数に飛んで、
その結果でホットキーフラグ処理関数に飛んで、
音鳴らす関数(サウンド機能)に飛んで、

再び、1秒後にtest関数走れよ。って予約して終わりです。

ちなみにですがVBAは日本語での関数名を許可してます

なので上記で唐突に音鳴らすって言葉が出てきてますが、
コレは関数名のことで

Sub 音鳴らす

(本文)

End Sub

っていうのがアリマス。


ってなかんじです。



さて、長文に成りますが、最後まで書ききってしまいましょうか。



まずボタンについて説明しておきます。
ボタンについてはActiveXのコマンドボタンを使ってます。
VBAでは外見は同じですがフォームボタンとコマンドボタンがあります。

コマンドボタンの利点はオブジェクト化しているので、プログラムで色々いじれるところです。

Sub CommandButton1_Click()
開始
CommandButton1.BackColor = &HFF00&
CommandButton2.BackColor = &H8000000F
CommandButton3.BackColor = &H8000000F
CommandButton4.BackColor = &H8000000F
CommandButton6.BackColor = &H8000000F
End Sub

実際に開始ボタン(裏ではComanndButton1というオブジェクト名がついてます)を押すと、
開始関数(前述のもの)が走って、その後にボタンの色を変更しています。

これはボタンが押されていることを強調するためのものです。

コレがないと、「あれ、いまP2が動いてるんだっけ?」とわからなくなってしまいます。

同様に、他のボタンについても
Private Sub CommandButton2_Click()
フェーズ2
CommandButton6.BackColor = &H8000000F
CommandButton2.BackColor = &HFF00&
CommandButton3.BackColor = &H8000000F
CommandButton4.BackColor = &H8000000F
End Sub

のように、押されたボタンに色を付けて、
その他のボタンを待機状態の色に変えてます。


さて、ホットキーについて解説します。

ホットキーは、やはりFF14を動かしながら、一度画面外にマウスを動かして、P4などのボタンをクリックで押すのはリスクが有ります。詳しくはこっちの理由のせいでこの機能を付けたのですが、プログラムが走っているタイミングに寄ってはボタンを押しても受け付けてくれない事があるのです。

なのでホットキー機能を付けました。

まず、冒頭に
Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long

とおまじないを入れます。

これはキーが押されたらその値を返します。

If GetAsyncKeyState(hotp1) <> 0 And rensyakinsi = 0 Then
flagp1 = 1

これを
hotp1(ユーザー設定の場所です)が押されたらflagp1を1にして立てます。
(ほかのホットキーも同じです)
ちなみにrensyakinsiってそのまんまの名前でAND判定してます。
ホットキーを一度受け付けた後一定時間はキー入力を受け付けないようにしてます。

kinsisec = 5
'フェーズ1のホットキー処理
If flagp1 = 1 Then
flagp1 = 0
flagp2 = 0
flagp3 = 0
flagp4 = 0
rensyakinsi = kinsisec
フェーズ1
Sheet2.OLEObjects("CommandButton6").Object.BackColor = &HFF00&
Sheet2.OLEObjects("CommandButton2").Object.BackColor = &H8000000F
Sheet2.OLEObjects("CommandButton3").Object.BackColor = &H8000000F
Sheet2.OLEObjects("CommandButton4").Object.BackColor = &H8000000F

rensyakinsi時間は5です。
で、フラグが立っていたら、すべてのフラグを初期化して
フェーズ1関数に飛んで、ボタンの色を変えます。

で、

Sub フェーズ1()
corrcount = 0
settime = Fix(CDbl(Timer))
ActiveCell.Borders.LineStyle = False
P1 = Sheet1.Range("B2").Value
Range(P1).Select
End Sub

フェーズ1関数はこれだけです。
test関数はつねにいつでも1秒毎に動いているので、
P1の攻撃パターンが書かれているセルへ飛ばしてあげるだけでいいのです。
カウンタ系は初期化しておきます。

意外とこんなもんです。


では最後に音の再生機能です。

予めC列にサウンドファイルへのパスを記述しておく必要があります。
また、WAVのみです。
というのもWindowsに標準搭載のサウンド再生機能を使っているからです。

Sub 音鳴らす()

Dim SoundFile As String, rc As Long
SoundFile = Chr(34) & ActiveCell.Offset(0, 1).Value & Chr(34)
rc = mciSendString("Play " & SoundFile, "", 0, 0)
End Sub
コメントアウト多いので、コメントアウト部分は削除したらこれだけで音が鳴ります。

ただし、予め冒頭で
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
という外部機能を使うことを宣言しておかないといけません。

正直、記述のルールなどは基本的なことしか知りません。
宣言とかIFの使い方とかその程度です。
あとは関数間とかの構造的なところくらいですかね。

あとは「こういうことがしたい」というのを検索してほとんどコピペして作ってるだけです。
手打ちで書いてることなんてあんまりありません。
記述に関してはVBAがサポートしてくれるので手打ちでも楽ですけどね。

さて、サウンドファイルのパスを直打ちさせるのはさすがに忍びないです。

なのでサポートボタンを作ってます。

Sub サウンドエフェクト()

celladd = ActiveCell.Address
Dim vntFileName As Variant
vntFileName = Application.GetOpenFilename(FileFilter:="ウェブファイル(*.wav),*.wav", FilterIndex:=1, Title:="select", MultiSelect:=False)
If vntFileName <> False Then
Range(celladd).Value = vntFileName
End If
End Sub

これで、windowsについてるファイルオープンの機能を使うことが出来ます。
実際に開くわけではないですが、パスを貰ってC列にそのパスを記述するっていう動作を、ファイルオープンの機能を使ってやってます。(ファイルオープン機能もパス貰ってオープン処理してるのでファイルオープン機能をかすめ取ってるというわけでもないのですが・・・。説明用の解釈です)

そんな感じでバトスケは作られています。
PR
COMMENT
name
title
text
color   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
mail
URL
pass
secret
PREV ←  HOME  → NEXT
プロフィール
HN:
komyu/シュクレール/修造
性別:
非公開
自己紹介:
こうぶつはけものみみとのーびす(♀)とエリーン
主にROとTERAとラノベと雑多なkomyuの日記帳です。
新生FF14
TERA紋章しみゅ
ROサポートツール
タイムライン
RSSボットが記事更新をつぶやくのがほとんどっス…
ROキャラクター紹介


TERAキャラ紹介

シュクレール(バサ)



syuzo(エレ)



サケマス(アチャ)


その他サブ

ウリエルキゥィス(スレLv54)

Vermillion(サラLv56)

パズドラ

157,318,362
フレンド募集中
枠なきゃ増やす
最終プレイ3日以上になったら消す
カレンダー
02 2024/03 04
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
ツリーカテゴリ
ブログ内検索
最新コメント
[04/30 のな]
[03/22 NEIN]
[03/22 NEIN]
[10/31 イロイ]
[05/02 NONAME]
Copyright (C) 2024 のーびす監察日記 All Rights Reserved.
Photo by 戦場に猫 Template Design by kaie
忍者ブログ [PR]