カテゴリ:ゲームを作る( 118 )

GLSurfaceViewを使って見る(3)

ゲームの演出に必要なので、テクスチャを回転してみる。

ポリゴンの回転は普通にできたのだが、それにテクスチャを張って回転すると、
全く予想できない図になってしまった。

縦長の画像を張って回転したのだが、90°回転させたら、
微妙なゆがみが生じたのだ。

これは、おそらく、ディスプレイのアスペクト比の問題だろう。
OpenGL系では、座標はピクセル単位ではない。

F-10Dのディスプレイサイズは、720x1280 だが、
-1.0~1.0 という数値で指定するのだ。

というわけで、ソレを考慮して、回転させると、90°でも、ゆがまずに回転した。
…のだが!

縦長のテクスチャというのは、128x512 というサイズの画像を使用したのだ。

ところが、他のサイトを見ていたら、こういう一文が載っていた。

「OpenGL ESでは、正方形の画像データしかテクスチャマッピングの元画像として受け入れてくれない。」


えぇ!?
表示できましたけども…!?

これは機種依存なのか…。
[PR]
by miries | 2016-10-23 16:36 | ゲームを作る

GLSurfaceViewを使って見る(2)

私が使用しているスマホが、4年前のF-10Dなので、
OpenGL ES 1.0 にしか対応していない。

今時、1.0で作るのもどうか。
試しに作っているだけではあるが、ソースコードに、

GL10

という記述をしているため、あとでバージョンを上げると、この辺りを全部差し替える作業が発生するし…。

などと思いつつ、背景部分の移植完了。
背景は、良く使う手として、小さい画像をタイル状に敷き詰めて、スクロールさせている。

Canvasを用いた描画では、画像を何枚も並べて描画していたが、
GLを用いると、1枚のポリゴンに、UVを設定するだけでいける。

具体的には、u = 0.0 ~ 1.0 とすれば、1枚分が表示されるが、
u = 0.0 ~ 5.0 にすれば、5枚分になるわけだ。

ところが、実際にやってみると、パターンが細かい画像を使用したので気づいたのだが、
フルスクリーンのうち、数か所がたまにちらついて見える。

これは…いわゆる、ダブルバッファを使わないといけない案件なのでは。
しかし、OpenGL ES1.0には、フレームバッファはなく、
1.1のextensionを使わないといけないらしい。

しかも extensionだから、どの端末でも実装されているという保証はない。
いやまあ、今1.0で作ってるのが悪いんだけどさ。

ところが、だ。
テストを重ねると、どうやら、描画が追い付かずにちらついているわけではないらしい。

スクロールさせるために、uvをそれぞれ、0~1の範囲で動かしているわけだが、

u= 0.184f;
v = 0.816f;

と設定すると、描画が崩れている。
これは…単なる float誤差!?
しかも、全体の一部の描画のときだけ??


めんどくさいのきたー。
[PR]
by miries | 2016-10-20 16:35 | ゲームを作る

Android Studioバージョンアップ

ちょいと時間ができたので、またもや AndroidStudioのバージョンアップ。

前回、1.x ⇒ 2.0 のメジャーアップデートだったので、直接更新ができず、
ファイルをダウンロードしてからの更新だった。

今回は、別PCなので、やっぱりメジャーアップデートなのだが、最新Verが、2.2に上がっていた。
同じくファイルで更新して、前回の設定をインポートしたら、難なくプロジェクトは移行完了。

だが、ビルドは問題なくできたのに、実機に転送しようとしたらエラー。

Instant Run requires 'Tools | Android | Enable ADB integration'

こんなエラーがポップアップで表示され、コンソールにも出力されている。
何やら、権限が必要なようだが…。

って、"Tools | Android | Enable ADB integration" これがちゃんとメニューバーを表していたのね。
その通りにメニューを開いていくと、Enable ADB integration て項目がありましたわ。

しかし、同列の他のメニューは全部アイコン方式なのに、なんでこのメニューだけチェックボックス?
----
ついでに、自宅のもバージョンアップして、2.2にしてみた。

最初からチェックボックスが付いてるみたいだけど。
いつチェックしたんだろ。
[PR]
by miries | 2016-09-23 13:03 | ゲームを作る

世の中、信じられないことがあるもんだが。

完成間近のゲームを、デバッグ会社にお願いして、デバッグしてもらっているのだが。

何か様子がおかしいので、デバッグ環境を聞いたら、デバッガー持って無いって言われたんだよ!
デバッグ会社が、デバッガー所有して無いって、信じられる?

タクシー運転手が、免許持って無いのと同じレベルなんだけど。

明日の回答次第では、ぶち切れるかもしれん。
[PR]
by miries | 2016-08-18 01:37 | ゲームを作る

Javaでオープンタイプフォント

というわけで、全く解決方法が見つからない、Javaでオープンタイプフォントを使用する方法。

一応おさらいしておくと、実行環境から、オープンタイプフォントをリストアップすることもできるし、
それで、createFont() することもできる。

でも、drawString("あいうえお")で表示すると、

b0163324_013675.png


となってしまうのだ。
標準のAPIを使用し、何もエラーが出ない。なのにコレ。
もうどうしようもないわ。

これを回避するには、やはりローテクを使うしかない。

多関節キャラのパーツ画像を1枚のテクスチャに敷き詰めるアルゴリズム。
先日、機能向上したが、この技術が使えそうだ。

文字1字ずつを1つのパーツとみなし、横に結合・展開してみたのが、これ。

b0163324_0155027.png


重ならずに、文字列として表示する分には、完璧だ。
あとは、横に伸びている「い」を何とかするだけ。

…と、思いがちだが、そんなに簡単ではない。
たとえば、今のままで、「ショートケーキ」を表示すると、どうなるか。

b0163324_0175286.png


ベースラインやアセントなどの、Y方向の情報がないんだから、そりゃ、こうなる。
で、ここから、ごにょごにょするとだな。

b0163324_019241.png

b0163324_0194393.png


どうよ、このできばえ!
Javaでオープンタイプフォント(OpenTypeFont)を使えたぜ!
[PR]
by miries | 2016-08-12 00:25 | ゲームを作る

解決方法がまったくわからねぇぞ!⇒OpenType Font

Javaでオープンタイプのフォントが化ける件、まったく分からねぇ!!

オラクルの公式リファレンスにも、サンプルなど全く載ってない。

Java Font でぐぐると、ものすごい解説ページが引っかかるのに、

Java Font OpenType に変えたら、ヒット数激減で、トップに来るのは、
海外の質問掲示板と来たもんだ。
(同じように、使い方に迷っているらしい)

日本語の質問掲示板もあったが、ttf使えば?って回答しかないし!

そもそも、OpenTypeにも対応して、

getAvailableFontFamilyNames();

で、OpenTypeフォントもリストアップされるってのが、SE7のウリなんでしょ、、。
実際リストアップされるし、フォントを作成することもできる。

普通に Font 生成して、drawStringできないとダメじゃん。
自分で細かく設定しないと表示できないとか、んなアホなしようじゃあるまい。

で、一体どんな風になるんだ?ってのを解説する画像を用意してみた。
ネタで一番使用する、「創英角ポップ」 (TrueType) で、drawString("あいうえお")をしてみたのがこちら。

b0163324_236516.png


問題なし。

で、フォントワークスの書体である、「FOT-ロダン Pro DB」 (OpenType)で、同様の描画をすると。

b0163324_2381883.png


どないなっとんねん!

文字が中央に集まってる上に、「い」だけが横に2倍のサイズになっている。
中央に集まるだけなら、なんとか解決する手段もあるだろうが、
ランダムに、横に伸びたりされると、もうどうしようもない。

これは、Javaがアホなのか、フォントデータに仕様ミスがあるのか。

そんなことより、解決方法はあるのか。
[PR]
by miries | 2016-08-06 23:12 | ゲームを作る

久しぶりに、根本的なバグに出会う。

しかも、Java。

ゲーム作成に必要なツール類は、改良を重ねてきたJava製ツール1つでまかなっている。
プラグイン方式なので、何でも詰め込める。

エクセル解析から、画像自動生成まで、何でもこなせるようになっているのだが。

フォント系の画像を作っていたら、今まで見たこともない現象が。

普通に、文字列を描画しているだけなのだが、文字がすべて一箇所に集まってしまう。

あいうえお

という文字列を表示しても、全部の文字が中央で重なってしまうのだ。
一文字だけ表示する分には、何も問題ないのだが。

試しに、textWidthを取得してみたら、0。
そりゃ重なるわな…。

なぜそんなことになるのか?
どうやら、答えは、フォント形式らしい。

オープンタイプのフォントを指定すると、ボロボロになるが、
トゥルータイプだと、全く問題がない。

まさか、オープンタイプに対応していないというのが、今頃発覚するとは。
さて、どうやって対応すればいいのやら。
 
まだ解決方法は見つかってないので、修正できたら、また記事にするわー。
[PR]
by miries | 2016-08-06 02:00 | ゲームを作る

やっぱり中華パッドはダメっすなぁ。

赤札天国のクリスマスタブBOXで購入した

 Colorfly G708 クアッドコア(1.3GHz) GPS搭載 IPS液晶 BT搭載 Android5.1

このタブレットをそろそろ活用しようと、色々いじってみる。
問題は、音が鳴るときのプチノイズ。

これがとにかく音量がデカイ。
間違ってキー操作音をONにすると、えらいことになる。
(音の再生前と再生後の2回鳴るため、キー操作音も聞こえないという)

このプチノイズを消す方法はないのか?

音量を0にしても、アプリ等で、SEを再生すると、なぜか音量が復活する。
なので当然プチノイズ。

本体スピーカーの性能かも知れないので、ヘッドホンをつないでみた。

…プチノイズが聞こえる!
しかも本体から!

って、ヘッドホン差しても、本体から音聞こえるやん!!
もちろんヘッドホンからも音が聞こえる。

これはアカンやつや…。

最後、だめもとで、Bluetoothヘッドホンを繋ぐ。
おお、本体からの音が消えた!
ヘッドホンからもプチノイズが聞こえてこない!

というわけで、何でもいいので、Bluetoothスピーカーを繋げばいいということが判明。

…だが。
そもそも、このタブレット、音関係が弱いらしい。

自作アプリで試しているのだが、ボタン操作音などが、安定して再生されない。
ピアノアプリのようなものは、聞こえたり聞こえなかったりを繰り返す。

短い音の再生だけが弱いのかもしれないが、ゲームでは致命的だな。

ドット抜けや、ゴーストタップのようなものは経験したが、
まさか音でここまで悩まされるとは。

IPS液晶で一見良さそうだが、自作アプリで調べると、
フレームレートが、41.08fps だったので、性能も微妙だね。

やっぱり中華タブレットは、数千円超えたら、買わないほうがいいな(苦笑
[PR]
by miries | 2016-05-06 01:01 | ゲームを作る

パーツ敷き詰めテクスチャ生成、アルゴリズム改

2Dの小さい画像をたくさん組み合わせて、1つのキャラを作って動かす方式を、
多関節キャラと呼んだりするが、昔からある、メジャーなアニメーション手段だ。
 
昔のハードは、2Dと言えば、スプライト。
多関節キャラもスプライトをいくつも重ねて作られている。

現在のハードは、スプライトなどなく、ほぼすべてOpenGL系のポリゴンハードだ。
なので、

 パワーアップきのこ <> 1UP きのこ

のように、パレットだけ変えて使いまわす、などはできない。
多関節キャラもポリゴンを重ねて表現するしかない。

なので効率よくするため、それぞれの構成パーツ画像を1つの画像にまとめて、
1枚のテクスチャにしている。
メモリに余裕があるハードなら、各パーツばらばらのまま突っ込んでも良いんだろうケドね。

(通常、テクスチャは、2の乗数のサイズにしなければならないので、33x18 なんてサイズのパーツがあったら、64x32 にまで大きくしなければならず、無駄が多い)

そこで、敷き詰めの効率をあげるためのアルゴリズムが必要になるわけだ。
といっても、それ自体は大したことなくて、パーツを大きい順にソートして、端から配置するだけで、
それなりに綺麗に詰められるのだ。

だがしかし、もちろん落とし穴がある。
単純に敷き詰めるだけではだめなのだ。

1枚のテクスチャにした後、パーツ画像として表示するには、切り抜いて表示する。
その際、切り抜く矩形の周囲にドットがあると、バイリニアフィルタの補完で巻き込まれて、ゴミがでるのだ。
これまた昔からの習慣ではあるのだが、パーツ間は、1ドットの空白を空ける、というのが鉄則。

で、これらを踏まえて、パーツを敷き詰めるコンバーターを作成し、それなりのテクスチャが出来たので満足していたのだが。

パーツ間に異様な空白が空いているものが、多々見つかるようになった。
ツールの不具合ではない。

パーツ画像そのものに空白が含まれていたのだ。
酷いものになると、半分以上の面積が空白なものもあった。

無駄が目立つようになったので、さらにアルゴリズムを大改造!
パーツ内部の空白を他のパーツと共有化し、詰める!

ついでにスピードのボトルネックも解消しておいた。

久々に、結果に感動できたプログラミングだった。
[PR]
by miries | 2016-03-18 23:52 | ゲームを作る

一年過ぎるの早いなぁ…

ということで、毎年恒例の、latache.net のドメイン更新。

どういうわけか、過去の私は、年始にドメインを取得してしまったため、
更新時に料金を振り込むのがすっごい面倒だったりする。

で、更新は完了。
その後、作りかけのJavaScriptが、実は思った以上に作りかけだったことが判明し、大幅修正。

ついに、基本動作、というかこのゲームの核となる部分が完成した。
移植するだけと思いきや、微妙なバグ退治イベントも出現。

新たなる仕様を追加しなければならないことも判明するなど、先は長い。

しかし、需要あるのかね。
[PR]
by miries | 2016-01-06 01:35 | ゲームを作る