“RUN” それは魔法の言葉

私とコンピュータの思い出を、だらだらと綴ります。最近はHSP3でのゲーム作り日記です

120.HSPでゲームを作ろう:技術研究 2Dスプライト機能 その2

標準スプライト機能のマニュアルも用意されている。
www.onionsoft.net
これと、スプライト機能を使用した、サンプルシューティングゲーム「マジカルタマホーキ」のソースが公開されたので、参考にする。
珠音ちゃんサンプルゲーム マジカルタマホーキ

まずは、hsp3dish.as をincludeする。
次に、スプライト機能を使うためのおまじない、es_ini命令を書く。

スプライトの定義には、画像ファイルがそのまま使える。
picload命令でバッファに画像を読み込んでおく。透過色を使いたいので、ここでも画像はPNG形式を使う。
そして、es_size命令で、1つのキャラが何ドット×ドットなのかを定義した後、es_pat命令で、バッファのどの座標から取り込むかパターン番号と、座標を指定する。
こんな感じ。

#include "hsp3dish.as"

es_ini ;スプライト初期化

buffer 3 ;バッファを作成
picload "meta.png" ;画像を読み込み
es_size 42,23 ;パターンサイズ
es_pat 0,0,0 ;パターンを読み込み

gsel 0 ;操作バッファを0に戻す

es_patはスプライト定義だけなので、表示するにはスプライトを登録する必要がある。
es_setで、スプライト番号、X,Y座標、es_patで設定したパターン番号を指定する。
そして、dishのおまじないである、redraw 0 ~ redraw 1で1サイクルを囲むのと、awaitを入れるんだけど、スプライトの描画はes_draw命令でまとめて行う。
スプライトを表示するプログラムはこんな感じになる。

#include "hsp3dish.as"

es_ini ;スプライト初期化

buffer 3 ;バッファを作成
picload "meta.png" ;画像を読み込み
es_size 42,23 ;パターンサイズ
es_pat 0,0,0 ;パターンを読み込み

gsel 0 ;操作バッファを0に戻す
es_set 0,320,200,0

*main
  redraw 0
  es_draw
  redraw 1
  await 1000/60
  goto *main

119.HSPでゲームを作ろう:技術研究 2Dスプライト機能 その1

2022年のHSPコンテストにも、応募したいなと思い、ネタをいくつか検討中。
そのうちの一つを作るために、技術研究としていくつかやってみる。
まずは、2Dスプライト機能を使ってみる。

スプライトといえば、自分の知識の中ではMSXの物だけ。
このブログでも、久しぶりに使ってみた。
coro3.hatenablog.jp

スプライトの利点は、背景とは別扱いなので、キャラクタを動かしても、背景との重ね合わせを気にしなくてもよいこと。
でも、HSP3Dishでは、redraw 0 実行時点で画面は全部消えてしまい、どっちにしても毎回背景とキャラを描かなくてはならない。
さらに、celputで、透過PNGを読み込めるので、背景との重ね合わせも簡単で、ほぼスプライトと同じ感覚で使えていた。

では、なぜスプライト機能なのか。
HSP3.6のスプライト機能には、ゲームを作るのに便利な機能が満載だったからなのだ。
自分で使いたいなと思ったのは、アニメーション、勝手に動いていけ!命令w、スプライトが何のキャラなのかを識別するタイプ番号定義かな。
さて、次回からは少しずつ標準スプライトのサンプルをもとにして、使い方と動きを確認してみよう。

118.HSPでゲーム&ウォッチのマンホールを作り直そう その7

最後は音や、ミスクリアの処理追加、ハイスコアの記録など。
ミスクリア処理、ハイスコア処理は、ほぼヘルメットのプログラムのまま使えるので流用して完了。

音については、以前MIDIで作ってWAVに変換したファイルを読み込むと、なぜかアプリが落ちてしまった。
しょうがないので、HSPで音が鳴ることを確認した、適当なビープ音のWAVをもとに、音を編集できるアプリ「Audacity」でピッチを変更した。

マンホールは、通行人が進むごとに音がなるのだが、他のゲームウォッチと違って、同じ音が鳴るのではなく、半音ずれた音が交互になって心地よいBGMになっていた。
Audacity」を使えば、ピッチを変更できるので、ベース音、ベース音を半音上げたものを作り、交互に鳴らすようにした。

このゲームも「ファイア」や「パラシュート」と同じキャッチ系で、キャッチしたことがわかる必要があるので、キャッチ音にあわせて、スマホではバイブレーションさせるようにした。これで無音でも快適に遊べる。

そうして完成したのがこれ。
youtu.be

ほぼ満足のいく仕上がり♪
通行人のロジックを考える作業は、なかなか楽しかった。十分な頭の体操になってるね。

次はオクトパスを作り直そうかなと思っているけど、新しいチャレンジがあまりない…
そもそもGAME AとGAME Bの違いもイマイチ分かっていない。さてどうしますか。

今年のHSPプログラムコンテストに向けて、早々とネタを考えたので、その基礎技術を習得することにするのと並行しよう。

117.HSPでゲーム&ウォッチのマンホールを作り直そう その6

前回の続き。
通行人のパターンは、前回作ったパターンシートを参考にした。
これを10か所分ごとに区切って、バッファに足す数をパターンを考えた。
通行人の人数ごとにパターンをいくつか出して、その内の1つを選んで、バッファに足すようにしてみた。

パターンは上下段ワンセットにして、カンマで区切った文字列にした。
例えば、上下段ともに1人を追加するなら、"512,512"。これが2人の時のパターン。

上下段で似たような出現パターンになるので、追加するたびに、反転するようにした。
両方とも同じ数字の時は意味がないが、上に1人、下に2人の追加パターンの場合、同じパターンでも上に2人、下に1人の時と1つのデータで済む。

こうして、1人~9人までの上下に出現するパターンを考えて、テストプレイしたが、すぐに具合が悪いことに気づいた…

このゲーム、上下段ともに、進行方向に向かって、4か所目と7か所目で通行人が穴の上に来るのだが、同時に落ちるようになってしまうと、どちらか一方が必ずミスになるので、まずい。
また、連続して通行人を出すときは、1コマ以上空ける。ただし、2コマ空けるのはNG。
この条件に従って、問題が無いように各パターンを考えてデータにしてみたが、連続するパターンによっては、同時に落ちるような問題パターンが発生してしまうのだった。

f:id:CORO3:20220129002409p:plain

問題パターンの組み合わせを人力で見つけていくのは時間がかかりすぎるので、今回考えた通行人追加ロジック部分のプログラムを抜き出して、パターン検証プログラムを作った。
問題のパターンを見つけるために、instr命令を使った。
instr命令は、文字列の中に、指定した文字列があったら、その位置を数字で返す。
無ければ、-1が返ってくる。これを利用した。
問題パターンを検出したら、logmes命令でログにNGの文字を出力するようにした。

buf=str(addpasser)+","+str(addpasser2)+": "
han=""
repeat 2
 j=cnt
 buf=buf+str(j)+": "
 han=""
 repeat 20
  if passline(j)&((512<<10)>>cnt) {
   buf=buf+"1"
   han=han+"1"
  } else : buf=buf+"0" : han=han+"0"
  if cnt=9 : buf=buf+"|"
 loop
 if instr(han,0,"1001")>0 or instr(han,0,"11")>0 {
  buf=buf+" NG!/ "
 } else : buf=buf+"    / "
loop
logmes buf

ログ出力したところ
f:id:CORO3:20220127010452p:plain

こうしてパターンを修正して、ランダムにパターンを繋げても、ゲームとして成り立つようにした。

あとは、スコアに応じて通行人の上限を上げていき、難易度が上がるようにした。
GAME Bでは、これに加えてスコアが増えると、ゲームスピードが速くなる調整も行った。

;スコアアップによる調整
;最大通行人数
maxpasser = 1+(score>10)+(score>45)+(score>150)+(score>230)+(score>350)+(score>450)+(score>600)+((gamemode=1)*(score>750))

;ゲームスピード(GAME Bだけスピードアップ)
if gamemode=1 {
  g_speed = g_speed_def-(score\100>10)*2-(score\100>30)*2-(score\100>50)*2-(score\100>80)*2
}