“RUN” それは魔法の言葉

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

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で希望のキーの値を取得できるようになった。

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

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

2023年のコンテストも終わり、2024年のコンテストも視野に入れつつ、次のゲームを作る準備を始めることにした。
まずは、2年前にうまくいかずに放置した、JSONフォーマットのデータ操作から。

coro3.hatenablog.jp

この時は、hspinet.asをincludeして、httpinfo命令で直接JSONフォーマットをゲットしてきたのがダメかと思っていたが、どうやら、ゲットしたJSONフォーマットの構造に合わせて適切なパース命令を使えてなかったようだ。

wttr.inでは、天気の情報をJSONフォーマットで取得できるパラメータがある。wttr.inのGitHubを見ると、ヘルプには載ってない、2つ目の短めにJSONを取得できるフォーマットを見つけた。
https://wttr.in/628?format=j2

このフォーマットなら、天気情報が、現時点のものだけになり、短くなる。こんな感じ。

{
    "current_condition": [
        {
            "FeelsLikeC": "11",
            "FeelsLikeF": "52",
            "cloudcover": "25",
            "humidity": "94",
            "lang_ja": [
                {
                    "value": "所により曇り"
                }
            ],
            "localObsDateTime": "2024-01-22 11:54 PM",
            "observation_time": "02:54 PM",
            "precipInches": "0.0",
            "precipMM": "0.0",
            "pressure": "1008",
            "pressureInches": "30",
            "temp_C": "11",
            "temp_F": "52",
            "uvIndex": "1",
            "visibility": "10",
            "visibilityMiles": "6",
            "weatherCode": "116",
            "weatherDesc": [
                {
                    "value": "Partly cloudy"
                }
            ],
            "weatherIconUrl": [
                {
                    "value": ""
                }
            ],
            "winddir16Point": "SSE",
            "winddirDegree": "160",
            "windspeedKmph": "17",
            "windspeedMiles": "11"
        }
    ],
    "nearest_area": [
        {
            "areaName": [
                {
                    "value": "Kawaguchi"
                }
            ],
            "country": [
                {
                    "value": "Japan"
                }
            ],
            "latitude": "35.805",
            "longitude": "139.711",
            "population": "468565",
            "region": [
                {
                    "value": "Saitama"
                }
            ],
            "weatherUrl": [
                {
                    "value": ""
                }
            ]
        }
    ],
    "request": [
        {
            "query": "Lat 35.75 and Lon 139.70",
            "type": "LatLon"
        }
    ],
    "weather": [
        {
            "astronomy": [
                {
                    "moon_illumination": "86",
                    "moon_phase": "Waxing Gibbous",
                    "moonrise": "01:28 PM",
                    "moonset": "03:59 AM",
                    "sunrise": "06:48 AM",
                    "sunset": "04:57 PM"
                }
            ],
            "avgtempC": "9",
            "avgtempF": "49",
            "date": "2024-01-22",
            "maxtempC": "11",
            "maxtempF": "51",
            "mintempC": "8",
            "mintempF": "46",
            "sunHour": "7.5",
            "totalSnow_cm": "0.0",
            "uvIndex": "2"
        },
        {
            "astronomy": [
                {
                    "moon_illumination": "93",
                    "moon_phase": "Waxing Gibbous",
                    "moonrise": "02:20 PM",
                    "moonset": "05:00 AM",
                    "sunrise": "06:48 AM",
                    "sunset": "04:58 PM"
                }
            ],
            "avgtempC": "8",
            "avgtempF": "46",
            "date": "2024-01-23",
            "maxtempC": "10",
            "maxtempF": "50",
            "mintempC": "4",
            "mintempF": "39",
            "sunHour": "9.3",
            "totalSnow_cm": "0.0",
            "uvIndex": "2"
        },
        {
            "astronomy": [
                {
                    "moon_illumination": "97",
                    "moon_phase": "Waxing Gibbous",
                    "moonrise": "03:19 PM",
                    "moonset": "05:54 AM",
                    "sunrise": "06:47 AM",
                    "sunset": "04:59 PM"
                }
            ],
            "avgtempC": "5",
            "avgtempF": "41",
            "date": "2024-01-24",
            "maxtempC": "7",
            "maxtempF": "44",
            "mintempC": "3",
            "mintempF": "38",
            "sunHour": "9.8",
            "totalSnow_cm": "0.0",
            "uvIndex": "2"
        }
    ]
}

落とし穴は、配列表記だった。
[…]は、配列の表記になるんだけど、要素が1つでも配列として記述ができる。ま、当たり前。
これを見落としていて、直接配列内の要素を参照しようとしていた。
いくら正しいと思える命令の書き方をしても、取得できなかったのだった。

HSPJSON関連の命令は、配列形式のJSONを直接HSPの配列にしたり、添え字を使って参照ができないのだ。
続く。