スキップしてメイン コンテンツに移動

HSPで画像の重ね合わせをしてみた

あいにくの曇り空だったが、スーパームーンを少し見ることができた。
なんとなくだが、月明かりがいつもよりも強い気がする。
中秋の名月とほぼ同時に月が地球に
接近するのは稀らしいので何かありがたい(-人-)

先週ブログを書いていたときに、
ハロウィンにちなんだゲームを作りたいなー
と思っていて、ふわっとした企画を考えて、少し作り始めた。
まだできるかどうかわからないけど、初めてHSPで絵を出せたのがうれしいのでブログを書いてみる。

HSP自体はだいぶ前から知っていて、ちょっとしたGUIのツールを作ったりしていた。
GUIアプリケーションをここまで短く実装できる言語は自分の中ではこれが一番だと思う。
もっと短くできるかもしれないが、ビギナーな私でもこのくらい短くかける。

screen 0, 160, 64 // ウィンドウ作成
button "greet", *OnGreet // ボタン作成&イベント関連付け
stop
*OnGreet // イベント
dialog "Hello!"
stop

バージョンアップして今では WebGL  iOS Android でも実行できる。
そのときは HSP3Dish という環境を使うために #include "hsp3dish.as" でスクリプトを読み込む。
 参照:HSP3Dish プログラミングマニュアル・基本仕様ガイド
制限として、拡張プラグインやCOM/Variant型や外部DLL呼び出しやモジュール変数については未サポートのようだ。

ゲームでスプライトを用いるため es_set などのスプライト用の関数を使いたかったが、これは hspdx という拡張プラグインなので HSP3Dish には対応していないと思う。
そんな理由から、スプライト系の処理を自作しようと思う。
先週ちまちまとドット絵を描いたので、それを HSP のウィンドウに描画してみた。


なんかドット絵を作っている最中は、わりと良く思えたのに、
ウィンドウに出してみると何か微妙(´・ω・`)
ちなみに、キャラは4コマにも描いている大砲ゲーム「お団子キャノン」に出てくるキャラクターだ。
キャラの並び方は、Wolf RPG Editor に同梱されているグラフィック合成器のフォーマットにあわせている。
寄らば大樹の陰。仕様に悩むこともなく説明もしやすい。助かります。


キャラの描画手順

さきほどの画像は1枚の絵ではなく、帽子、頭、肌、服上、服下、靴のパーツにわけて作成している。
作成は有名なドット絵のエディタ Edge を使っている。
これもレイヤーごとに描画ができて、重ね合わせ・アニメーションの確認も簡単にできてとても便利だ。
作ったパーツ画像を複数のバッファに読み込み、それを重ねて表示するプログラムをHSPで作成した。

パーツ画像の読み込み

まずは、パーツ画像をバッファに読み込む。
for i, 0, 8, 1
buffer i + 1
picload imagePath(i)
next

今回は8つのパーツ画像を読み込むため8回処理を繰り返している。
buffer 命令で直後の picload の画像読込先をスクリーンではなくバッファに切り替えている。
引数の番号がバッファの番号だ。

パーツ画像の重ね合わせ描画

読み込んだパーツ画像を、バッファからスクリーンに繰り返しコピー転送する。
gsel 0
for i, 0, 8, 1
pos 0, 0
gmode 2, 320, 480//24, 32
gcopy i + 1, 0, 0
next

gsel 命令で 0 番目のバッファを gcopy の転送先に指定している。
0 番目は screen 命令で作られたウィンドウのバッファだ。
buffer 命令だとウィンドウのないメモリ上だけのバッファになるが、 screen ではウィンドウに表示する画像データを扱うバッファになる。
gmode でコピー転送の方法を指定する。
今回は重ね合わせの際に黒(0, 0, 0)の色を透明色として扱って転送するために、第1引数に 2 を指定した。
これは黒から変えられないようで、 edge で最初白を透明色にしていたのを黒に変更して対応した。
edge のイメージのメニューに特定の色を置き換える項目があってすごく助かった。

今後の予定

単純な処理かもしれないが、右往左往したのできちんと重ねて表示されたときはすごいうれしかった。
作りたいゲームのイメージでは、もっとたくさんのキャラを動かす予定だ。
しかし、1つのキャラでさえも8つのパーツを組み合わせて作り、それを333ミリ秒ごとにアニメーションさせるとなると、実際に処理時間が足りなくなるかもしれない。
次は、アニメーションを手動でやってみる。

こんな出だしで、ハロウィンのころまで間に合うのかわからないが、だめもとでやってみよう。
あと、口調を意図的に変えてみたのだが、これもいつまで続くかわからない。



コメント

このブログの人気の投稿

QTableView で表を表示してみる

タイトルは駄洒落を狙っているわけではありません。 こんばんわ SakuraCrowd です。 今回は今作っているソフトの経過報告です。 最近のブログのパターンは、 「XXX作ったよ。これがスクリーンショットね。あとこんなこと思ったよ。」 という流れですが、 今日はできていないソフトの部分的な話なので、 いつもよりもプログラムちっくな話になると思います。(´Ծ_Ծ´)メガネノトキハマジメブッテル QTableView は GUIライブラリ Qt のクラスです。 それを Python で使うための PySide というライブラリを使っています。 某表計算ソフト っぽい表の GUI です。 このデータの日付が 09/01 なのでおそらくその日に   QTableView 使うぞ!(`・ω・´) とサンプルデータを作ったのでしょう。 Qt Designer という GUI エディタを使うとポトペタでウィンドウを設計できます。 選択できる GUI の中に QTableView と QTableWidget があります。 どちらも上のような表の GUI です。 QTableWidget は 簡単 に値をいれたりできます。 Qt Designer 上で直接編集 することができるので、 サンプルの表を簡単に作ることができます。 それに対して、 QTableView は Qt Designer 上では値を編集できません。たぶん。 QTableView の強みは MVC の構造 を使えることです。 名前のとおり QTableView は View です。 これにデータを管理している Model オブジェクトを設定して使います。 Model クラスを作る手間がかかりますが、 GUI の細かな操作をしなくても Model に応じた表を表示してくれます。 Model は QAbstractTableModel を 継承 して作ります。 コンストラクタで基底クラスの処理を呼び出し、いくつかの純粋仮想関数をオーバーライドします。 def __init__ ( self , parent= None , *args):...

LibreOffice Writer 文書の差分 (WinMerge x TortoiseGit) + 社畜PCの原因と対策

お久しぶりです。皆様におかれましてはお風邪などをひかれてはいませんでしょうか。 春と秋だけあればいいのにヽ(`Д´)ノとつい思ってしまう SakuraCrowd です。 今日はいつものような製作日記ではなく、ちょっとした役立つメモを書きました。 タイトルにもあるとおり、 TortoiseGit への WinMerge の導入の仕方です。 今まではソースコードくらいしか差分で確認しなかったので、 TortoiseGit 標準の Diff ツールで問題なかったのですが、 LibreOffice の Writer が最近自分の中で便利だと話題になっていて、それを差分表示するためにちょっと調べてみました。 #Writer は、文章書いて、ちょっと絵をいれたり表を作るのに便利だと思います。 #リッチテキストのエディタを探していて、これが一番よさそうな気がしたので使ってます。 それとブログを書くときはあまり長く書かないつもりだった、 Win7 PC が社畜PCになってしまった際の原因と対策も後半に書きました。割と有用な情報かもしれませんので、時間がありましたらご覧下さい。 まずは TortoiseGit で Writer の odt ファイルを管理して、差分も普通に表示させる方法です。 WinMerge(+plugin) 導入手順 すでに TortoiseGit はインストールしてある前提ではなします。 1.信頼と実績の窓の杜様から WinMerge 日本語版をダウンロードします。 WinMerge - 窓の杜ライブラリ 私の PC は 64 ビット版なのでそちらを選びました。 2.WinMerge をインストールします。 フォルダを指定し普通にインストールできます。 インストール直前の設定で TortoiseGit をチェックしておくと自動的に TortoiseGit の利用する Diff ツールの設定を置き換えてくれるようです。 これの設定は TortoiseGit の設定の Diff ツールの項目で確認できます。 3.LibreOffice Writer のファイルを読むためのプラグインをダウンロードします。 ぐぐって出てくる英語版のDLサイトは応答がなかったりしましたが、日本...