“RUN” それは魔法の言葉

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

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の配列にしたり、添え字を使って参照ができないのだ。
続く。

200.HSPで作ったAndroidアプリを公開しよう 竜巻鮫

「Digi Mole Attack!」の公開がうまく行ったので、竜巻鮫にも広告を付けて公開することにした。
こちらは、横持ちにしてもらうアプリなので、バナー広告は表示せず、1ゲーム終わるごとに全面広告に切り替わるインタースティシャル広告を表示するようにした。

毎回表示するのもうっとおしいので、3ゲーム毎に1回表示するようにカウンタを追加して、処理を行った。
のだが…現時点では、最初の1回は表示されるが、それ以降表示されない…
HSP3Dishのバグなのか、AdMobの仕様変更なのかは不明。とりあえず、HSP掲示板に不具合報告したものの、しばらく修正されそうにないので、このままリリースすることにww

ま、修正されたら表示されることを確認して、アップデート版として公開しよう。

そして今回も公開申請後、4日目の昼に審査が通って公開された。
んで、さっそくインストールして実行したら…デバッグ用のコードが残ってて、数字が表示されてる…_| ̄|○

やっちまったと思い、すぐに非公開に切り替えた。でも、よくよく考えたら、すぐに検索されないから、このまま公開しておいて、アップデート版にすればいいじゃないかと思いつく。

じゃ、公開に切り替えまーすとGoogle Consoleで設定を変更すると…
非公開→公開の切り替えもGoogle先生の審査がいると…_| ̄|○

ということで、アップデート版の審査と、再公開の審査を同時に行った。
ついでに、公開される国を増やしてみた。一応シャーク〇ードを観たことがありそうな日本とアメリカにしていたが、カナダ、メキシコ、イギリス、オーストラリアを追加した。といっても、英語版は無いから、あまり意味はないかもね。

こうして、再度申請したわけだが、丸々1週間「申請中」…
あまりに長いので、他の人のブログとかを検索してみると、いったん申請を取り消して、再申請すると数時間で公開されたというものがあった。ホントに?と思って実行したら、1時間ちょっとで公開されたww

というわけで、ダウンロードして遊んでもらえると嬉しいです。
play.google.com