投稿記事

2019年 07月の記事 (6)

Heliodor 2019/07/30 21:00

タイトル画面

一応製作中のゲームの話なのでフォロワー以上で。

フォロワー以上限定無料

まずは無料プランで様子見を。 お気軽にフォローしてみて下さい。

無料

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Heliodor 2019/07/28 10:03

Godot Engine

せっかく Google Game Builder を試してみたので、以前から気になっていた他のゲームエンジンも少し触ってみました。

それが Godot Engine です。

公式
https://godotengine.org/


これ、何が良いって、ダウンロードしてみると分かるのですが、なんとEXEが1個入っているだけという超シンプル構成なんです。

Readme すらありません。他のゲームエンジンみたいに大量のDLLが入っているだとか、大量の謎のファイルが詰め込まれたフォルダがいくつも並んでいる、なんてことが無いんです。これだけでも、ちょっとダウンロードして試してみようって気に、なりません?(ならないか?)



日本語化もバッチリで、日本語環境で起動すれば勝手に日本語のUIになってくれます。

基本的な使い方は、Unity 触ったことのある方ならだいたいカンでわかると思います。
プログラムは Python ライクな Godot 独自の言語が使われています。
(ちなみに Godot をダウンロードする時に通常版かMono版かを選択しますが、そこでMono版を選べば C# がスクリプトとして使えるようになります)

ガチなスクリプトの他に、ビジュアルスクリプトという、様々な効果を持つパネル同士を線で結ぶという定番のスクリプトモードも用意されていますので、プログラムが分からない方でも安心できるかと思います。

とりあえず Godot を起動するとプロジェクトマネージャーという画面が出るのですが、そこで「テンプレート」を選ぶと勝手に公式サイト上からテンプレ一覧を探してきてくれますので、カテゴリーから「DEMO」を選んで、適当なデモプロジェクトをダウンロードしてみると良いと思います。



個人的には、自分でプログラムをガリガリ書いた方が融通が利いて楽、という感じで、Unityみたいなゲームエンジンは使ってこなかったのですが、もしも今後ゲームエンジンに移行することがあるとしたら、まず最初に Godot を試すと思います。

一応公式動画を置いておきますね

https://www.youtube.com/watch?v=UTAeDoRIHaA
なんかどこかで見たようなゲームがちらほらあっていいんスかコレ親しみを感じますね!

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Heliodor 2019/07/21 10:04

ZIPファイル その2

ZIPファイルについて続きです。
長いです。

それは Libre Office の Calc(Excel互換アプリ)で作成した .XLSX ファイルを開こうとした時の事です。

参考
Libre Office
https://ja.libreoffice.org/


.XLSX ファイルの中身はただの .ZIP ファイルなので、普通に .ZIP として開くことができます。
……のハズなのですが、自分が最初に作ったプログラムではこれがエラーになって開けなかったんです。

で、調べてみたら「ローカルファイルヘッダ―」にデータサイズが記載されてなかったんです。なんのこっちゃ?って感じだと思うので、以下 ZIP ファイルフォーマットについての話です。


まず簡単にZIPファイルの構造を書いておきます。

ZIPファイルの先頭には ZIPファイル全体に対するヘッダがあるのかと思いきや、そうではなく、格納している個々のファイルデータに対するヘッダから始まります。


・ローカルファイルヘッダ (30バイト)
・ファイル名(nバイト)
・拡張データ(省略可能)(nバイト)
・ファイルデータ(nバイト)
・データデスクリプタ(省略可能)(12 or 16バイト)


このブロックがファイルの個数だけひたすら繰り返されます。
それが終わると、今度は「中央ディレクトリヘッダ」がやはりファイルの個数だけ繰り返し続きます。


・中央ディレクトリヘッダ (46バイト)
・ファイル名(nバイト)
・拡張データ(省略可能)(nバイト)
・コメント(省略可能)(nバイト)


最後に、ZIP全体の情報が入ります。


・中央ディレクトリ終端レコード (22バイト)
・ZIPに対するコメント(省略可能)(nバイト)


そう、ZIPファイル全体の情報は、ファイル先頭ではなく末尾にあるのです!
さてここで、単純にZIPファイル内のファイル名をリスト化することを考えてみます。普通に考えれば次のようになります。


まずファイル先頭に読み取り位置を移動してから、以下の手順を繰り返します。

・最初の4バイトが "PK0304" ならば「ローカルファイルヘッダ」なので、それを読む
・ファイル名を読む
・拡張データがあれば、それをスキップ
・ファイルデータをスキップ
・データデスクリプタ があれば、それをスキップ


これを、「中央ディレクトリヘッダ」にたどり着くまで繰り返せば、自動的にすべてのファイル名が分かるはずです。
ところで、「ファイルデータをスキップ」するためには、当然ファイルデータが何バイトあるのか?を知らなくてはなりません。
で、普通それは「ローカルファイルヘッダ」に書いてあります。

ところが、場合によっては「ローカルファイルヘッダ」にサイズが記載されておらず(圧縮前と圧縮後のデータサイズの値が 0 になっている)、その代わりに圧縮データの後に「データデスクリプタ」がくっついていて、そこにサイズが書いてあることがあります。

「データデスクリプタ」を見つけるには、ファイルデータ部分をスキップしないといけません。
ファイルデータをスキップするためには、データが何バイトあるのかを知らないといけません。
データのバイト数は「データデスクリプタ」に書いてあります。


無限ループです。


この「データデスクリプタ」はオプション的な扱いで、あってもなくてもOKです。
これがあるかどうかは「ローカルファイルヘッダ」のフラグ "general purpose bit flag" の Bit3 を見る(0x0008との論理積)と分かります。
この値が1ならばファイルデータの後ろには「データデスクリプタ」がくっついていて、そこにデータサイズが記録されています。
「データデスクリプタ」が存在するという事は、「ローカルファイルヘッダ」にはデータサイズが記載されていない可能性があるという事です。
この場合、ファイルを先頭から辿ることはできないので、逆に末尾から辿っていきます。

ファイルの末尾には「中央ディレクトリ終端レコード」があります。
まずファイルの末尾までシークして、そこから 22 バイト戻れば「中央ディレクトリ終端レコード」が読み取れるはずです。
これを読むと、ファイル先頭から最初の「中央ディレクトリヘッダ」までのオフセットバイト数がわかるので、それを使って「中央ディレクトリヘッダ」に移動します。

実はこの「中央ディレクトリヘッダ」には、「ローカルファイルヘッダ」とほとんど同じ内容が重複して書いてあります。
そして「データデスクリプタ」の有無とは無関係に、「中央ディレクトリヘッダ」のデータサイズの項目にはちゃんとデータサイズが書いてあります。


……ところがですねえ、これでうまくいくとは限らないんですよ。
いま、サラっと「まずファイルの末尾までシークして、そこから 22 バイト戻れば中央ディレクトリ終端レコードが読み取れるはず」なんて書きましたが、実は「中央ディレクトリ終端レコード」の後ろに「ZIPファイルに対するコメント」が付いている場合があります。
コメントの文字列バイト数は「中央ディレクトリ終端レコード」に書いてあるので、その場合はフィアル終端からの逆シークができなくなります(ファイル終端からコメントバイト数+22バイト戻れば「中央ディレクトリ終端レコード」にたどり着くが、そもそもコメントバイト数は「中央ディレクトリ終端レコード」に書いてあるという矛盾)

これ、本気で解析しようと思ったら次のようにします。

  1. ファイル終端に移動
  2. ファイル先端に向かって1バイトづつ移動しながら識別子 "PK0506" と一致するバイト列を探す
  3. 一致した場合は、そこが「中央ディレクトリ終端レコード」であると仮定してレコードを読む
  4. 「中央ディレクトリ終端レコード」にはコメントのバイト数が入っているので、
      レコードの位置、コメントサイズ、全体のファイルサイズの関係に矛盾が無ければOK。具体的にはレコード位置+レコードサイズ(22バイト)+コメントサイズ=全体のファイルサイズ になっていれば良い。
    (※コメントは文字列であるとは限らず、単なるバイナリデータでもよいため偶然一致してしまう可能性も十分ある。極端な場合だと、コメントとして別のZIPファイルのバイナリが丸ごと入っている可能性もある。その場合はコメントとして入っているZIPの終端レコードなのか、それとも今開いているファイルに対する終端レコードなのか区別できない。が、そういうひねくれた使い方はここでは考えない)

  5. 矛盾があった場合、偶然一致してしまっただけなので (2) に戻り、さらに探す

そんなわけで、「データデスクリプタ―」が存在し、かつ全体コメントがあるZIPファイルは、その中身を確定的に知ることができない(矛盾が無いようなファイル構造を自分で調べないといけない)、という事になります。
(ここで問題にしているのは「ZIP全体」に対するコメントのことであって、「ZIP内の各ファイル」に対するコメントは全く問題ありません)


なんて面倒なんでしょう。
まあ、ZIPファイルにコメントが付いていること自体めったにない事ですが。


さらに「データデスクリプタ(※)」自体が遺物というか、ランダムシークできなかった頃の名残なので、今更そんなヘッダがくっついていることもないだろうと。
……そうんなふうに考えていた時期が私にもありました。

(※ストリーミングやテープメディアなど、逆シークできない(しにくい)環境での圧縮を想定したもの。圧縮しながらデータを送り出す場合、圧縮が完了してからでないとデータサイズがわからない。圧縮後のサイズが分かっても、既に書き込んでしまったローカルファイルヘッダを編集することができないので、データデスクリプタという形で情報を追加する)


ところがあったんですよ。そんな亡霊のような「データデスクリプタ」が。
それが冒頭でお話しした Libre Office Calc の .XLSX ファイルでした……。




ZIPファイルの構造について、くわしい情報はこちらをどうぞ。
だいぶお世話になりました

ZIP (ファイルフォーマット)
https://ja.wikipedia.org/wiki/ZIP_(ファイルフォーマット)


ZIP書庫ファイル フォーマット
http://www.tvg.ne.jp/menyukko/cauldron/dtzipformat.html

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Heliodor 2019/07/14 22:39

公約ポイント達成しました

正直、キャンペーンの仕組みをよく分かっていなかったのですが(いいね!とリツイートの数?)、ポイント500を越えていたので達成したようです。
応援ありがとうございました。

公約どおり、現在製作中の「あやかし紅白戦」にボーナスイラスト(なんかエロいやつ)を追加いたします。


※追記
公約達成、じゃなくてポイント達成でしたね。てへっ。




……と、その報告だけでは忍びないのでゲーム冒頭のワンシーンを動画でちょっぴり公開。
先日ボツ絵として公開したキャラを、ゲーム開始時の状況説明キャラとして再利用してみました。
(実はモブキャラの髪型とメガネを変更してみただけですが)

なんか主役2人よりも派手な髪色で目立っている気がしなくも無いですがw

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Heliodor 2019/07/14 22:07

ZIPファイル

プログラム話です。(また無駄に長いです)


ZIPファイル、便利ですよね。アレ。

なんでも圧縮できるし、複数のファイルを簡単にまとめられるし、手軽に使えますし。
Androidの .apk ファイルやJavaの .jar ファイル、Excelの .xlsx ファイル、Word の .docx など、実はただのZIPファイルだったりします。(これらのファイルの拡張子を .zip に変えれば普通にダブルクリックで解凍できます)


とりあえずライブラリさえあればゲームからでも割と気軽に使えるので、以前はよくゲームファイルをZIPにまとめて、場合によってはパスワードもかけてEXEと一緒に入れたりしました。
もちろんパスワードはプログラム内にそのまま文字列リテラルとして書いてあるので本気で解析されたら丸わかりなのですが、それでも割と効果的なんですよね。


ZIPを作ったり解凍したりするのにシンプルなアプリしか使っていなかったりするとなかなか気づかない事ですが、実はZIP内に入れるファイルというのはファイル毎に個別に圧縮率を設定することができます。

例えばゲームファイル全部を単一のZIPに固めるときにOGGファイルだけ無圧縮にしておくと、OGGをストリーミング再生する場合にわざわざファイルを解凍してからOGGプレイヤーに流す必要がなくなります。
Cプログラムで言えば fopen でZIPを開いて(解凍する必要はなく、本当にただ開くだけでOK)適切な場所に fseek さえしておけば、FILEをそのままOGGプレイヤーに渡すことだってできます。

また、PNGなども無圧縮で入れるには良いファイルです。
PNGというのは既に画像を圧縮してあるわけですから、それをさらにZIPで圧縮してもほとんどサイズが変わりません。
それどころかZIPからPNGへ、PNGから無圧縮画像へと二段階に解凍しなければならず無駄が多いです。

そこで圧縮済みPNGを無圧縮でZIPに入れておけば(ややこしい…)、ZIPからPNGに解凍する手間が省けます。
(逆に無圧縮PNGをZIPで圧縮しても良いわけですが)



あと、ZIPファイルのパスワードというのはファイル毎に別々にかけることができます。
例えば同じZIPファイル内にある crypt.txt と plain.txt について、crypt.txt を取り出す時はパスワードが必要だが plain.txt はパスワード不要、という事ができます。

普通にパスワード付きZIPを作るといかにもZIPファイル全体に対して1つのパスワードがかかっているように見えますが、それは単にZIP内の全ファイルに対して同じパスワードがかかっているというだけです。

あまり良い利用方法が思いつかないのですが、その気になればZIP内の全てのファイルに対してそれぞれ異なるパスワードをかけることができる、という事です。

ただしこのようなZIPを作成・解凍できるツールはそう多くはありません。
そういったZIPを扱いたければ、そこそこ高機能なアーカイバを探してくる必要があります。
(さすがと言うべきか、WinRARはこれらのZIPに対応しています)



さらにどうでもよい情報ですが、基本的にZIPのパスワードには文字数制限や文字種制限がありません。
「○○文字まで入力可能」とか「半角英数のみ」とかいうのは、あくまでもツール側が自主的にかけた制限です。

全角ひらがな漢字混じりでもOKですし、そもそも普通の文字でなくてもかまいません。タブ文字0x09とか改行文字0x0Aとか、普通にバイナリデータで 0xDEADBEEF とか。
まあ、入力できるものならやってみろという感じではありますが。

極端な話、パスワードと称して、適当なバイナリデータをぶっこんでも良いわけです。
例えばEXE自身のバイナリをパスワード(もはや文字ですらないのでパスデータと言うべきか?)
にしておいて、EXEが1バイトでも改変されていたら解凍できなくなる(=ゲームが動かなくなる)なんてこともできます。改造対策に使えそうですね。
ZIPライブラリを使って自前でZIPを作成・解凍できるならば、試してみると面白いかも……?

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

« 1 2

月別アーカイブ

記事のタグから探す

限定特典から探す

記事を検索