“RUN” それは魔法の言葉

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

205.HSPでゲームを作ろう:標準スプライトのマップ表示を使ってアクションゲームを作る その3

次はマップのスクロール。
マップのスクロールは、es_putbg命令で、マップを表示するXY座標を動的に変えることで実現できる。
coro3.hatenablog.jp

今回はオートスクロールする中で、上に登っていくようなゲームデザインにしたい。

表示するマップは、縦長の物になる。以前作っていたテストプログラムだと、マップの初期表示座標は (0,0) でよかったが、今回はマップの一番下から上に向かってスクロールするため、少なくともY座標は、最下部+画面に表示するマップのY座標にしなくてはならない。

マップの表示領域を20×20チップ、Y方向のマップを300チップ分と定義した。
あとは算数です。1チップのYサイズは40ドット。画面内には常に20チップを表示するので、281チップ目から表示するのが最下段。最初のチップはY=0から始まるので、Y座標は、281×40-40=11,200ドット目からになる。
これを変数にセットしておき、値を減算していけば、上に向かってスクロールするマップ表示ができる。

スタート地点(最下段)の表示

徐々にスクロールすると…

スクロールは、例によって、ゲーム内のカウンタを使って処理することにした。
いきなりスクロールし始めたら、ゲームにならないので、1000フレーム経過するまではスクロールさせないように。
そして、毎フレームスクロールさせると早すぎるので、3フレームごとに1ドットずつスクロールさせるようにしてみた。
この設定は仮なので、今後ゲームの難易度調整の時に変更していく。

sy=11200
*main
redraw 0
  es_putbg 0,0,0,0,sy; マップを描画
  if gamecnt\3=0 and gamecnt>1000 {
    sy=sy-1
  }
redraw 1
await 16
gamecnt++

goto *main

204.HSPでゲームを作ろう:標準スプライトのマップ表示を使ってアクションゲームを作る その2

続いて、マップの定義と表示のおさらい。

マップは、普通にデータ構造を考えると、縦×横の2次元配列で作るのだが、標準スプライトのマップは、縦×横のチップ数だけ要素数を持つ、1次元配列を使う。

mapsx=20:mapsy=20 ; マップサイズ
dim map,mapsx*mapsy ; マップデータ変数

こんな感じで、縦と横のチップ数を変数にしておくと、あとで変更が楽になる。

チップのグラフィックは、celloadで読み込んで、celdivで1つのチップのサイズを設定する。
画像もサンプルプログラムのものを、とりあえずそのまま利用。

es_bgmap命令で、マップの広さと、表示範囲などを定義し、es_bgattr命令で、マップチップに属性(アトリビュート)を設定する。
この属性を設定することで、背景と通り抜けられない壁を判別してもらえるようになる。
さらに、スプライトとBG当たり判定を有効にすると、例えば、通り抜けられない壁の方に移動させようとしても移動しなくなる。

ざっくりこんな感じ。

celload "pic/parts.bmp",2
celdiv 2,40,40 ; マップのセル設定

es_bgmap 0,map,mapsx,mapsy,mapsx,20,2 ; マップ登録
es_bgattr 0, 6,8, ESMAP_ATTR_HOLD ; アトリビュート値を設定
es_bgattr 0, 9,11, ESMAP_ATTR_WALL ; アトリビュート値を設定
es_bglink 0, ESSPMAPHIT_BGHIT ; スプライトのBG当たり判定を有効にする

最後にマップの配列変数それぞれに、チップNoをセットしていく。
そして、スプライトの表示と同じように、redraw 0~redraw 1の間に、es_putbg命令を書けば、マップが表示される。

203.HSPでゲームを作ろう:標準スプライトのマップ表示を使ってアクションゲームを作る その1

昨年は、標準スプライトのマップ機能を使って、スクロールするフィールドを探索するようなゲームの基礎部分をテスト作成していた。
coro3.hatenablog.jp
coro3.hatenablog.jp

そちらはちょっと置いといて、今年作る予定の、ジャンプアクションゲームに使えないかと方向転換。

HSP3.7β7から追加されたサンプルの中に、それっぽいものがあった。

スプライトの重力設定と足場設定、スクロールする命令を組み合わせれば、やりたいことができそう。

今回のゲームは、HSP3に標準提供されている素材のキャラ「珠音」を使う。

「珠音(たまね)」

まずはスプライトパターンの取り込み。あれ?培養臼でさんざんやったはずなのに、忘れてるwww
途中にスプライトを使ってない、竜巻鮫とDidi Mole Attack改を挟んだのはあるけど、この忘却スピードはヤバいw

ということで、おさらい。
まずは、celload命令で元になる画像をロード。
gsel命令でロードしたウィンドウIDに切り替え。
es_size命令でスプライトパターンのサイズを指定。
es_pat命令でパターンを読み込み。
このときのパターンは、es_patanim命令で読み込み、走っているところを自動でアニメさせることも考えたが、ちょっとずつ動かしていくことを考えて、今は使わない。
こうしてパターンを定義したら、スプライトの設定をes_set命令で行う。
これで、redraw 0 ~ redraw 1の間に、es_draw命令を書けば、スプライトが表示できる。

es_ini
celload "pic/mychr.bmp",1
gsel 1
es_size 64,128
es_pat 0,0,0
gsel 0

es_set 0,0,0,0

*main
redraw 0
  es_draw
redraw 1
await 16

goto *main

ひとまずここまで。

202.HSPでゲームを作ろう:技術研究 HTTPアクセス→JSONフォーマットの操作 その2

前回の続き。
注意して取得したJSONを眺めてみると、要素が1つしかない配列になっているところが結構あったのだ。
そうすると、直接キー名を指定しても取得できない。

何で気づけたかというと、Firefoxで見たときに、折りたたみができるブロック表示になったから。
こんな感じ。

まさか、最上位の構造から配列になっているとは思わなんだ…
ということが分かれば、あとはこのサイトの情報をもとに、配列の参照を行っていけばよかった。

hogespace.hatenablog.jp

jsongetobj命令で、current_conditionのポインタをゲット。続けてjsonnext命令で子ノードの1つ目のポインタをゲットする。
本来は、配列の数分ループするのだろうけど、今回は配列が1つだけなので、そのままjsongets命令で、各項目の値をゲットできた。
さらに配列になっているノードがあるので、同じようにjsongetobjで、ポインタを取得し、jsonnextで子ノードのポインタをゲット、jsongetsで希望のキーの値を取得できるようになった。

これで、エリアコードと呼ばれる番号を指定した地点の天気情報が取得できるようになり、最初のステップは完了。
さて、次はゲーム本編の基本部分を作っていこう。