“RUN” それは魔法の言葉

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

110.HSPでゲームを作ろう:技術研究 HTTPアクセス その1

次のゲーム&ウォッチ再現に取り掛かる前に、別のオリジナルゲームを作るための元ネタというか、技術研究をやっていこうと思う。
そのうちの1つが、HTTPアクセス。ネットの特定のページの情報をHTMLの中から拾い出して、使いたいと思っている。

HSP3.6自体にはHTTPアクセス用の命令は無いのだが、Dishであれば簡易的なアクセスができる命令が用意されている。
そのほかの方法としては、拡張モジュール"hspinet.as”を使う方法がある。
しかし、これはWindowsAPIを使うので、Androidアプリにしたときに使えない。

そういうわけで、Dishの命令で、どれだけのことができるかを試していく。
幸い、サンプルプログラムがあるので、流れを確認。
httpload命令でリクエストを投げられる。
リクエストが返ってきたら、httpinfo命令で取得できる。
それをバッファの変数に放り込んでやるという流れのようだ。

HTTPのリクエストには、GETとPOSTの二種類があって、若干動きが変わってくる。
URLにパラメータを含めて送るのがGET。POSTは良くある入力フォームなどで「送信」ボタンを押すと、入力項目のデータが渡せる方式。

今回は、天気予報の情報を取得して、抜き出すことにチャレンジ。
wttr.inというサイトに、パラメータを付けてアクセスすると、世界中の天気予報がテキストで取得できる。
例えば、ブラウザに https://wttr.in/tokyo と入力して、Enterキーを押せば、東京の天気予報が表示できる。

天気予報: tokyo

     \  /       所により曇り
   _ /"".-.     20 °C          
     \_(   ).   ↗ 45 km/h      
     /(___(__)  10 km          
                0.0 mm         
                                                       ┌─────────────┐                                                       
┌──────────────────────────────┬───────────────────────┤  火 09 11月 ├───────────────────────┬──────────────────────────────┐
│              朝              │              昼       └──────┬──────┘        夕             │              夜              │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│               曇り           │  _`/"".-.     驟雨または強…  │    \  /       所により曇り   │    \  /       所により曇り   │
│      .--.     +22(25) °C     │   ,\_(   ).   +22(25) °C     │  _ /"".-.     21 °C          │  _ /"".-.     20 °C          │
│   .-(    ).   ↖ 44-72 km/h   │    /(___(__)  ↑ 41-72 km/h   │    \_(   ).   ↗ 33-40 km/h   │    \_(   ).   ↗ 45-56 km/h   │
│  (___.__)__)  10 km          │    ‚‘‚‘‚‘‚‘   7 km           │    /(___(__)  10 km          │    /(___(__)  10 km          │
│               0.0 mm | 0%    │    ‚’‚’‚’‚’   5.0 mm | 99%   │               0.0 mm | 0%    │               0.0 mm | 0%    │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
                                                       ┌─────────────┐                                                       
┌──────────────────────────────┬───────────────────────┤  水 10 11月 ├───────────────────────┬──────────────────────────────┐
│              朝              │              昼       └──────┬──────┘        夕             │              夜              │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│    \  /       所により曇り   │    \  /       所により曇り   │  _`/"".-.     所により雨     │    \  /       所により曇り   │
│  _ /"".-.     18 °C          │  _ /"".-.     18 °C          │   ,\_(   ).   18 °C          │  _ /"".-.     18 °C          │
│    \_(   ).   → 64-74 km/h   │    \_(   ).   → 50-58 km/h   │    /(___(__)  → 45-51 km/h   │    \_(   ).   → 46-53 km/h   │
│    /(___(__)  10 km          │    /(___(__)  10 km          │      ‘ ‘ ‘ ‘  10 km          │    /(___(__)  10 km          │
│               0.0 mm | 0%    │               0.0 mm | 0%    │     ‘ ‘ ‘ ‘   0.1 mm | 60%   │               0.0 mm | 0%    │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
                                                       ┌─────────────┐                                                       
┌──────────────────────────────┬───────────────────────┤  木 11 11月 ├───────────────────────┬──────────────────────────────┐
│              朝              │              昼       └──────┬──────┘        夕             │              夜              │
├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤
│               曇り           │               曇り           │    \  /       所により曇り   │               曇り           │
│      .--.     18 °C          │      .--.     18 °C          │  _ /"".-.     18 °C          │      .--.     18 °C          │
│   .-(    ).   → 49-57 km/h   │   .-(    ).   → 52-60 km/h   │    \_(   ).   → 46-53 km/h   │   .-(    ).   → 47-54 km/h   │
│  (___.__)__)  10 km          │  (___.__)__)  10 km          │    /(___(__)  10 km          │  (___.__)__)  10 km          │
│               0.0 mm | 0%    │               0.0 mm | 0%    │               0.0 mm | 0%    │               0.0 mm | 0%    │
└──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘
位置情報: 東京都, 日本 [34.2255804,139.294774527387]

この情報を取得して、HTMLから情報を抜き出そうとした。
HTTP操作のサンプルもあり、取得自体を行うプログラムは一から作る必要がなかった。
URLを与えて、単純にHTMLを取得することは簡単にできたのだが、もちろんHTMLのタグも付いてきているので膨大な文字数に…
これから天気予報の情報を抜き出すのは超面倒…処理も遅くなりそう。
とにかくHTMLの情報量を少なくするオプションは無いか探していたが、なかなか見つからない。

パラメータのヘルプは、https://wttr.in/:help で表示できるのだが、ここには書いていないオプションがあった。
githubのwttr.inのページを見ると、JSONで取得ができる!
JSONなら、HTMLよりはパースしやすいかなと思い、作り始めたのだが…

109.HSPでゲームを作ろう:Digi Mole Attack! その7

HSPコンテストに応募するのはいいが、誰もAndroid専用アプリを応募していない。
運営さんにメールで問い合わせると、apkファイルと説明書きのテキストファイルでも応募可能ということだった。
ただ、いろんな人に見てもらうならWindowsで動くプログラムも付けたほうがよいとのアドバイスがあった。
ま、そのままexeファイルにしてしまえば送れるので、そうしようと思っていた。

家族の協力もあり、約半日ほど集中してプログラムできる時間を確保できたので、ゲームの一通りの流れを完成させた後、Windows版はテンキーで遊べるようにプログラムを追加し始めた。

カーソルキーや一部ゲームでよく使われるキーは、stick命令で状態を取得できる。しかし、テンキーの状態は取得できないので、getkey命令を使う。

単純に文字が一致しているかではなく、キーを押したときの番号で判定できる。
だから、テンキーの「1」と、フルキーにある「1」は、別のキー番号となり、ちゃんと判別できる。

これをもとにして、テンキーを押したかを判定するテストプログラムを作った。
うまくいったし、ゲームへの組み込みは、そんなに大変じゃなかった。
マウスでのテストプレイが大変だったので、もっと早くやればよかったww

#include "hsp3dish.as"

*main
  redraw 0
  ;キーボードの操作
  for keynum,96,106,1
    getkey key,keynum
    if key & pushed=0 {
      pos 0,0
      mes str(keynum-96)
      pushed=1
    }
    if key=0 : pushed=0
  next

  redraw 1
  await 1000/60
  goto *main

こうして、ゲームの微調整や、残りの部分を作成してできたのがこれ。

youtu.be

無事、締め切り前にHSPプログラムコンテストに応募できた。
ダウンロードは↓からできます。ぜひ遊んでみてください。
https://dev.onionsoft.net/seed/info.ax?id=2091

コンテストの結果は、一次審査は通過したものの、賞は特になし。
ま、もともと参加賞狙いだったので当たりまえか。w

今回は突貫工事だったので、やれてないことがある。
今後は気が向いたらw改良していこう。

  • 電卓筐体の画像w
  • 難易度アップのバランス
  • レベルごとのモグラ出現数の調整(オリジナル同様だとスコアに余裕がでてギリギリ感がでない)
  • ハイスコアの記録を保存
  • GooglePlayに登録するために、無料版(広告あり)を作る

108.HSPでゲームを作ろう:Digi Mole Attack! その6

2022年最初のエントリーです。今年もよろしくお願いします。

ゲーム部分は形になってきたものの、HSPコンテストに応募するためには、このままじゃあまりに不親切。
せめてタイトルとルール説明画面はしっかり作らないとと思い、取り掛かった。

タイトル画面は、GIMPで適当に作成。出てくるキャラクタもなく、文字だけなので、楽勝w
ルール説明画面もGIMPで1枚ずつ作って、ページをめくるようにすればいいかと。
こうして、だんだんゲームっぽくなってきた。

f:id:CORO3:20211021001955j:plain:w200
f:id:CORO3:20211021002015j:plain:w200

チュートリアルは、Androidならタッチ、WindowsならEnterキーでページを進められるようにしてみた。

電卓のボディ画像は、ダサいままで諦めたw
HSPコンテストが終わって、これをもう少し調整などを加えてGooglePlayで公開するとなったら、画像作成も再チャレンジしよう。
そのためにも、今年はドット絵の練習も定期的に行いたい。

107.HSPでゲーム&ウォッチのパラシュートを作ろう その6

後は、調整や細かいところを作っていく。

まずは、ミスクリアの処理。パラシュートも200点、500点でミスしていた分がクリアされる。
これはヘルメットのソースの判定条件を変えてやるだけで、そのまま動いた。

次はアニメーション。パラシュートでも、一定期間でアニメーションするものが2つある。一つは上空のヘリコプターのプロペラ。もう一つは海を泳ぐサメ。
ヘリの方は2パターンを交互に表示するだけだったので、簡単に作れた。

サメは、ミスパターン時の演出とパターンが共用で、これまた適当なタイミングでアニメが開始される。
どちらもサブルーチンを作っておき、ゲーム中のループで毎回呼び出すようにした。

音は、ヘルメットとほぼ変わらない。ダイバーの落下音、キャッチ音、ミス音が2パターンぐらい。
バイブレーションは、キャッチ時のみ行うようにした。

今回もアラームモンキーをタッチすることで、音のON/OFFをできるようにした。

ゲーム部の調整として、まずはダイバーの落下速度。
ヘルメットと同じぐらいでいいかなぁと思って作ったら、80点を越えるごろにはほぼパニック状態にw
少しずつ速くしたいが、程々に速くする調整が難しかった。

次は、キャッチ時のダイバーを消すタイミングを少し遅らせる処理。
これは面倒なので作るのを止めたwww
なので、いきなり消えたようになるのはご愛敬ということで。

これで完成として、できたのがこれ。
ヘルメットと同じく、自分ではなかなかよく再現できたと思っているw

youtu.be

さて、ゲームウォッチ再現シリーズも、遊んだことがある実機がほぼなくなってきたので、どうしようかな?
「タートルブリッジ」にチャレンジするか、「シェフ」や「ポパイ」とか「パラシュート」と同時期発売のゲームにするか。
友人からは、エポック社の「モンスターパニック」というこれまた名作のリクエストがあったのだが、ゲームウォッチに比べると圧倒的にルールなどの情報が少ない。また、液晶パターンのフル点灯している画像がなさそうなので、ちょっと厳しい。
同じような理由で、バンダイのデジタルシリーズも難しい。「バクダンマン」や「クロスハイウェイ」、「大地震」とかも面白いのだが…

そうだ!【BASIC!】で作った、「マンホール」と「オクトパス」を作り直しますか。
この二つはGAME AとBの違いや、音のオンオフも、ハイスコアの記録も作ってないし。
なにより、マンホールの通行人の出現パターンをちゃんとロジックで作りたい。頭の体操で始めたサンデープログラムなので。

年内の投稿はこれが最後です。2022年も引き続きよろしくお願い致します。