プログラミング・動画編集 備忘録

プログラミングや動画編集についての備忘録です

Terrariaの飛び道具のAIを調べる

はじめに

アイスロッドがブロック化してから消える前での秒数についてIce Rod - Terraria Japan Wikiでは次のように書かれている。

設置された氷ブロックは15秒ほどで割れる他、ツルハシで削れる。またIce Block.png Ice Block同様滑る

「15秒ほど」とあるので15秒なのだろう。 しかし、この15はどのように定義されているのかがよくわからない。 というわけで、実際に正しいのか中身のコードを覗いてみることにした。

なお、結論としてはアイスロッドは魔法武器で飛び道具であるため、使用するとアイスブロックが飛び出す。 Terrariaではこうした飛び道具で飛び出すものは「発射物」として管理され、「発射物」としての性能があり、AIが定義されている。 アイスロッドで作成したアイスブロックのAIはブロック化した際に1f毎にカウントを始めて、900f (15秒) 経過したら削除される動作となっている。

コードの確認について

こちらを参考に。 【Terraria】tModLoaderからTerrariaをデバック実行する - プログラミング・動画編集 備忘録

アイテムの仕様を調べる

アイスロッドはアイテムなので、まずはアイテムとしての仕様を確認することにした。 Terraria.ID.ItemID にてItemIDを確認する。

       public const short IceRod = 496;

アイテムの基本的な性能などはSetDefaultsに記載されているのでそこを確認するが、手っ取り早くは== 496)といった形でItemIDで検索すればそれらしい場所が見つかる。

           if (type == 496)
            {
                this.rare = 4;
                this.mana = 6;
                this.damage = 28;
                this.useStyle = 1;
                this.shootSpeed = 12f;
                this.shoot = 80;
                this.width = 26;
                this.height = 28;
                this.UseSound = SoundID.Item28;
                this.useAnimation = 9;
                this.useTime = 9;
                this.rare = 4;
                this.autoReuse = true;
                this.noMelee = true;
                this.knockBack = 0f;
                this.value = Item.buyPrice(0, 50, 0, 0);
                this.magic = true;
                this.knockBack = 2f;
                return;
            }

見た感じ、ここで消滅までの秒数が定義されている様子はない。 それもそうだ。アイスロッドは魔法の武器でアイスブロックを射出してそれがブロック化する。 つまり、何かしらの発射物なので、確認すべきは projectile となる。

発射物の性能を調べる

Terrariaでは「発射物」はTerraria.Projectileに各種アイテムの性能やAIの動作が記載されている。 こちらも作成された際の仕様などはSetDefaultsに記載されている。 まずはIDをTerraria.ID.ProjectileIDで調べる。

       public const short IceBlock = 80;

先ほどアイテムの仕様でthis.shoot = 80;とあるので、ここが発射物のIDなのだと思うが、もう忘れている。 なお、名前が良くわからなければ、SetDefaultsの入口にでもブレークポイントを設定して実際に動かしてみれば良い。 つづいて、type == 80)といった形で検索。

           else if (this.type == 80)
            {
                this.width = 16;
                this.height = 16;
                this.aiStyle = 22;
                this.friendly = true;
                this.magic = true;
                this.tileCollide = false;
                this.light = 0.5f;
                this.coldDamage = true;
            }

aiStyle22となっているので、aiStyle == 22といった形で検索する。 該当のAIの処理の入口がわかったら後はそこからコードを見ていくのだが、よくわからなければデバッグで少しずつ確認していく他ない。 今回は、おそらくブロックが作成されたらそこから秒数のカウントなりが始まると思うので、ブロックが作製される部分に着目してみれば良い。 次のようになっていた。

                           if (flag6)
                            {
                                if (WorldGen.PlaceTile(num292, num293, 127, false, false, this.owner, 0))
                                {
                                    if (Main.netMode == 1)
                                    {
                                        NetMessage.SendData(17, -1, -1, null, 1, (float)((int)this.ai[0]), (float)((int)this.ai[1]), 127f, 0, 0, 0);
                                    }
                                    this.damage = 0;
                                    this.ai[0] = -1f;
                                    this.velocity *= 0f;
                                    this.alpha = 255;
                                    this.position.X = (float)(num292 * 16);
                                    this.position.Y = (float)(num293 * 16);
                                    this.netUpdate = true;
                                    return;
                                }
                                this.ai[1] = -1f;
                                return;
                            }

this.ai[1] = -1f;となっているので、これが初期値だろう。次はこのブロックを削除する部分を確認する。

                   this.ai[0] -= 1f;
                    if (this.ai[0] <= -900f && (Main.myPlayer == this.owner || Main.netMode == 2) && Main.tile[num281, num282].active() && Main.tile[num281, num282].type == 127)
                    {
                        WorldGen.KillTile(num281, num282, false, false, false);
                        if (Main.netMode == 1)
                        {
                            NetMessage.SendData(17, -1, -1, null, 0, (float)num281, (float)num282, 0f, 0, 0, 0);
                        }
                        this.Kill();
                        return;
                    }

this.ai[0] <= -900fと判定が書かれているので、900フレーム、1秒60フレームで、900 / 60 = 15ということで、15秒ということがわかる。

AviUtlでよく使うショートカット

はじめに

半年程動画編集を行っていなかったので、今後のことも考えて編集時によく使うショートカットを整理しておく。

基本の編集

キー 効果
s 選択しているオブジェクトの分割
. 同レイヤー内の次のオブジェクトの先頭へ
, 同レイヤー内の前のオブジェクトの先頭へ
Delete オブジェクトの削除
1フレーム進める
1フレーム戻る
PageDown 設定値分フレームを進める(デフォルトは30フレーム)
PageUp 設定値分フレームを戻す(デフォルトは30フレーム)
Home 最初のフレームへ
End 最後のフレームへ
t テキストオブジェクトを挿入
e 選択しているオブジェクトへフィルタ効果を追加するメニューを表示する
p 選択しているオブジェクトの現在のフレーム位置で分割する

オブジェクトの選択について

[Ctrl]キーを押しながらマウスドラッグで矩形の範囲に触れたオブジェクトが選択される。
矩形の範囲から外れても、一度選択されたオブジェクトは選択されたままとなる。
また、右クリックのメニューで[オブジェクトの選択]から全て選択などが行える。
[Ctrl]キーを離すと解除されるので注意。

スクロール

マウスホイールで左右のスクロール。 [Alt]キーを押しながらで上下のスクロール。

SkyrimのインストールやMod導入でうまくいかないことまとめ

はじめに

以下のSkyrimのインストールとMod導入するまでの動画を公開しておりますが、よくある質問などをここにまとめます。

「An exception occurred in the script」のエラー

Skyrim Mod データベースのSkyUIにて解決策がかかれております。 http://skyrim.2game.info/detail.php?id=3863(説明欄の下) 以下、抜粋です。

NMMを管理者権限で起動後、
オプション項目の「add shell extensions for supported file types」にチェックを入れてNMMを再起動して下さい。

エラー内容でググれば画像入りで説明しているものも見つかるかと思います。 An exception occurred in the script - Google 検索

Terrariaのフォントを自作する

はじめに

本記事はTerrariaにて画面上で表示されるフォントを自作するツールの利用方法について説明しています。
ツールの作成にあたっては、定義ファイルを用意すれば簡単にフォントを生成してくれるジェネレータを作成されているmistzzt氏の『Standalone - DynamicSpriteFontGenerator 0.4 (Generate fonts without XNA Game Studio) | Terraria Community Forums』(GNU General Public License v3.0) を改修させてもらいました。
また、日本語フォントの作成するための定義設定には、Terrariaの日本語化ツール「Terraria JpMod Maker」の製作者であるsynctam氏の『synctam: Terraria v1.3.5 用フォントの作成方法』より『Terraria_Death_Text_Pen.spritefont』を使わせていただいております。

はじめる前にバックアップ!

あらかじめ元のフォントファイルのバックアップをとるようにしてください!
通常は以下のフォルダにありますので、フォルダごとどこかにコピーをとってください。

C:\Program Files (x86)\Steam\steamapps\common\Terraria\Content\Fonts

DynamicFontGenerator

ダウンロード:DynamicFontGenerator.zip
f:id:rrryutaro:20180609220704p:plain

使い方

(1) Terrariaのゲームフォルダのパス設定

通常はデフォルトのままで大丈夫です。
Terraria Game Folder:はあらかじめTerraria.exeがあるであろう、次のパスを指定してあります。

C:\Program Files (x86)\Steam\steamapps\common\Terraria

もし異なる場所にインストールしている場合には、パスを直接入力するか...ボタンをクリックしてフォルダを選択してください。

(2) 定義ファイルの指定

通常はデフォルトのままで大丈夫です。
DynamicFontGenerator.exeを実行時、実行したフォルダ内にSampleFont.dynamicfontファイルが無い場合、このファイルが作成されます。(synctam氏作成の日本語用の定義ファイル)
その他、同フォルダ内にファイル名の最後が.dynamicfontとなっているファイルがあれば読込まれます。
Font AllocationリストのDynamicfontの任意のセルをクリックするとコンボボックスが表示されて、定義ファイルを指定することが出来ます。

(3) フォントの指定

フォント設定を変更した対象のFont NameSizeのセルをクリックするとフォント選択のダイアログが表示されますので、好みのフォントとサイズを指定してください。
なお、まとめて変更したい場合All Fontボタンより変更してください。
なお、通常はフォントサイズは12、ただしDeath_Text24くらいが良いそうです。

(4) フォント生成

Generatボタンをクリックすることでフォント生成が実行されます。
元あったフォントを上書きしますので、必ずバックアップをとっておいてください!

イメージ

こんな感じになります。
f:id:rrryutaro:20180609223034p:plain
f:id:rrryutaro:20180609223122p:plain


以上

プログラミングを始めるなら

はじめに

最近まったく記事を書けていないので。
基本的にC#が好きで、このブログは趣味のゲームのMod作りや動画作りをネタにして、C#での開発などについて触れていますが、ここ半年程今まであまり触れる機会のなかった言語を扱ったりしていました。

で、何にせよ何か新たな言語を始めるのに手っ取り早い方法ですが、ちょっとしたプログラムなら今はブラウザで簡単に実行できるサイトが多数あるようですね。
そういったものをサクッと紹介です。

また、プログラミングを学ぶにあたっては、ある程度文法などを学んだら、実際に何か作るのが手っ取り早いと思います。
作ってみたいものが既にあるのなら、それに取り組むのが良いですし、なければ競技プログラミングのサイトを利用するのも手だと思います。

同じような記事をQiitaでも投稿しています。
各言語の環境構築と簡易確認と腕試し

プログラムの実行するなら

次の記事を参考にさせてもらいました。
ブラウザー上でサクッとコードの動作テストができるWebサイトいろいろ | Webクリエイターボックス

とりあえず色々な言語をちょっと実行してみたいのなら『Ideone』(イデオン)が良さそうです。
次の記事を参考にさせてもらいました。
Ideoneの使い方 (2014年8月) - Qiita

こんな感じで使えます。

JavaScriptなら以前に少し『JSFiddle』(ジェイエスフィドル ?) を使っていました。
こんな感じです。

いずれもURLを開けば、登録等不要で、直ぐにでもプログラムの入力が出来て確認も行なえます。

プログラム学習のネタを探すなら

競技プログラミングサイトを利用するのが良さそうです。
次の記事を参考にさせてもらいました。
ITエンジニアのレベルアップに最適!競技プログラミングサイト10選 - paiza開発日誌

中でも『AtCoder』辺りが日本語で取っ付き易いのではと思います。
こちらは登録が必要ですが、各種言語のサンプルもありますし、問題もステップアップで進めることができるため、順々に進めることで学べるのではないかと思います。


以上。

今からはじめる動画編集 - 1 - 録画とAviUtl導入

はじめに

去年の12月頃から動画編集をはじめて、丁度1年が経過しました。
投稿した動画は一応130件ほど。ニコニコ動画YouTube両方に同じ動画を投稿しています。

最近、動画を作ってみようかというコメントをいただけている事もあり、改めて一から動画編集の方法を見つめなおして行きたいと思います。
なお、以前にもこのような記事を書いています。
rrryutaro.hatenablog.com

なお、TerrariaというSteamでなんと定価980円!!のゲームを題材としていきます。
store.steampowered.com

ロイロゲームレコーダーのインストール

今回はとりあえず、ロイロゲームレコーダーを使って録画する事にします。
loilo.tv

リンク先に飛んで、ダウンロードボタンを押して、ダウンロードしたexeファイルを実行します。
f:id:rrryutaro:20171216133026p:plain

特に難しい指定をする事も無く、[インストール]ボタンをクリックしたらインストールがはじまり、終わったら次のウィンドウが表示されます。
f:id:rrryutaro:20171216133116p:plain

後は、ゲームを起動してF6キーを押せばそこから録画が始まります。
とても簡単ですが、今回はとりあえず何も設定変更せずに進めています。
このため録画容量が多くなりますが、その辺はおいおいと。

ちなみに、普段の録画はGeForce Experienceを利用しています。
www.nvidia.com

GeForce® GTX グラフィックス カードを利用している場合、こちらがお勧めです。
自身の環境のグラフィックカードを確認するには、「ファイル名を指定して実行」(ショートカットは[Win]+[R])にて、
dxdiag と入力して[OK]して、「Direct X 診断ツール」を利用するのが基本みたいです。

f:id:rrryutaro:20171216133811p:plain

AviUtlの導入

今回の導入に関わらず、「AviUtlの易しい使い方」のサイト様がとても詳しいです。
何か困ったらまずはここを見るのが一番です。
aviutl.info

導入については、「AviUtl初心者が最初に読むべきページ【導入から使い方まで】」を順番に進めていけばできます。
aviutl.info

今回は一応、その内容を抜粋していきます。

AviUtl本体と拡張Pluginの導入

AviUtlのお部屋 に行き、「aviutl100.zip」と「exedit92.zip」をダウンロードします。
それぞれ解凍して、「exedit92」側のファイルを全て「aviutl100」側にコピーします。
なお、インストールするとかは無いため、AviUtl本体の「aviutl100」のフォルダは管理しやすい場所に置くのが良いかと思います。

入力プラグイン「L-SMASH Works」の導入

L-SMASH Works r921 -- RePOPn に行き、「L-SMASH Works r921」をダウンロードします。
解凍したら先ほどと同じように、AviUtl本体の「aviutl100」に丸ごとコピーしてみ大丈夫なようですが、「aviutl100」の中に"Plugins"フォルダを作成し、その中に解凍したファイルを全てコピーします。
この後、優先順位の確認や、拡張子の設定などもありますが、必要に応じて対応していきます。

出力プラグイン「x264guiEx」の導入

rigayaの日記兼メモ帳 に行き、(画面右側の「○Aviutlプラグイン」の所の)「x264guiEx 2.xx」のリンクをクリックするとOneDriveのページが表示されると思いますので、「x264guiEx_2.52v2.zip」をダウンロードします。
ファイルを解凍し、「auo_setup.exe」を実行します。
「AviUtlのフォルダ」にAviUtl本体のフォルダ「aviutl100」を指定して、「次へ」をクリックするとインストールが開始されます。
しばらく待って「x264guiEx.auoのインストールが完了しました。」が表示されたら、終了をクリックします。

インストールされているかの確認をするため、AviUtlを起動します。(「aviutl.exe」を実行する)
メニューの[設定]-[拡張編集の設定]をクリックするとタイムラインが表示されますので、その上で右クリックして、[新しいプロジェクトの作成]をクリックします。
ダイアログが表示されますので、そのまま[OK]をクリック。
メニューの[ファイル]-[プラグイン出力]-[拡張 x264 出力(GUI) Ex]をクリック。
[ビデオ]圧縮をクリック。
以下の部分が空白となっていなければOKのようです。
f:id:rrryutaro:20171216140114p:plain

初期設定

メニューの[ファイル]-[環境設定]-[システムの設定]をクリック。

次のように設定するのがお勧めなようです。
f:id:rrryutaro:20171216140346p:plain

なお、個人的には「関連ウィンドウ同士を移動時にスナップする」は好みではないのでチェックを付けていません。

フィルタの順序の設定

メニューの[設定]-[フィルタ順序の設定]-[ビデオフィルタの順序]をクリック。
次のように「サイズの変更」と「拡張編集」を上に移動させます。
f:id:rrryutaro:20171216140555p:plain


これで最低限の準備は完了です。

といった所で、今回はここまで。

以上

www.nicovideo.jp
www.youtube.com

画像処理や画像解析そしてOCR・OMRについて考える

背景

ここ3ヶ月ほどはここでの記事を書くことも無かったものの、せっせとTerrariaのMod作りは進めていました。
そして、それなり作りたいと思うものは作れたりしてきています。

その中でもCADのようにTerrariaのゲーム内で建築を行なうMod作りをしています。
その内の1つの機能で、あらかじめ用意した画像ファイルをゲーム内に配置するものがあります。
用途としては、単純に眺めるのもいいですし、立ち絵のように置いておいて一緒に冒険している風を感じてもいいですが、基本はなぞるためのものです。

しかし、最終的には画像解析して、読込んだ画像をTerraraのブロックに置き換えることをやってみたいと思っています。
このため、今まで気にはなりつつも手を付けていなかった OpenCV について調べ始めました。
また、動画編集を楽にするために動画内の文字などを認識させたいと思い、Tessseractについても調べ始めました。

いまやっていること

というわけで、次のような記事を別途書いていたりします。
qiita.com qiita.com


とりあえず、途中ですがこの辺りで。(まだメモとして書いている状態です)