HSPの迷路プログラム更新した

こんちゃ

せっかくの春休みなのに風邪を引いて全く活発に活動できないのでごろごろしつつ一昨年くらいに書いた迷路プログラムを改造してみた。

なにもおもしろい機能は増えてないが、セーブロード周りの強化と細かい動作の改善程度。

laby150

 

前回と決定的に違うのは、ちゃんと配布するところです。

こちらからどうぞ。

ダウンロード

 

ウィザードリィっぽい迷路探索

たまにHSPでなんかつくろうと思った。なんとなく遊べるものを作るのにはHSPは手軽でいい。

ウィザードリィ風にしようと思った理由は簡単である。画面に線しか引かなくていいからだ。酷い理由だな。

 

labyexp

 

まずはうろうろ出来るようになった。

迷路は1マスあたり16進2桁で記録している。壁を1で道を0にするというのだとあとから仕掛けなど入れようと思ったときに道の種類など追加できない。まぁいまのところ種も仕掛けもないただの迷路なんだけど…

次に自動生成機能でも作ろうと思ったのだが、迷路を自動生成するならば2進で表せる迷路の方が簡単じゃないかと思った。というわけで先に0と1で表した迷路データを16進2桁のデータに変換するコードを書いた。

コンバータ部ができたところで、これなら手軽に使えるマップエディタが作れるなと思ったので自動生成はそっちのけでマップエディタを作成。

edit-exp

これでマップエディタで迷路を作ってそのまますぐ遊べる。

マップエディタで複雑な迷路を作れるようになると、今度は自分で作った迷路にもかかわらずクリア出来ないという事案が多発するようになった。クリアできない迷路ほど腹立たしいものはないので今度はミニマップをつけた。

minimap

ミニマップはあってないようなタイトル画面でON/OFFできる。自分で方眼紙にマッピングして遊ぶという方はOFFにして遊んで下さい。

さて、このへんまでくると迷路の自動生成はどうでもよくなってきた。今度はこの迷路にどんな仕掛けをつけるかが問題だ。謎解きくらいは盛り込みたいものだが、未だに方向性を絞れずにいるのでこのプロジェクトは停滞中。

 

 

 

 

ところで、似たような見た目の迷路を2,3年前にも作った。

labyrus

今回のものと昔作った物の決定的な違いは視界にある。

以前作った物は自分が今いるタイルしか表示されない。つまるところお先真っ暗。

今回のは2.5先まで見えている。

まぁただそれだけなんだが。

 

2016年2月追記

最新版置いときます

 

 

Bukkitサーバー用のプラグインを作ってみた

マインクラフトサーバーの更新にあたり、サーバープログラムをbukkitからSpigotに変更した。

また、MCbansと競合することがあった管理・ロギングプラグインであるShadowAdminをやめて定番のHawkeyeに入れ替えることにした。特に問題はなく移行は完了したのだが、ShadowAdminについていたチャット整形機能が使えなくなったためチャットの表示はデフォルトに戻ってしまった。

2014-04-01_19.52.58

使用上はなにも問題がないがShadowAdminの表示に見慣れていたのと、時間表示が便利であったためチャットを整形するプラグインを導入することにした。

もちろん先に既出の同等プラグインがないか探したけれど発見できず、ならばと自分で作ることにした。プラグインの作り方についてのページは英語、日本語ともに豊富で情報を集めるのに不自由はなかった。

まずはじめにプラグインを作成するにあたり、Javaの基本的な書き方について押さえなくてはならない。今までJavaは書いたことがなかった。

開発環境にEclipseを用意し、解説を読みながらとりあえず書いていく。イベントを関知する部分でちょっと悩んだが非常に簡単な機能のプラグインということもありあっけなく完成してしまった。

timecode

 

 

今回Bukkitのイベント一覧をざっと見たが、様々なイベントを取得できるようになっており、アイディア次第で様々な楽しいプラグインを作れそうだと感じたが、他にたいしたアイディアもなくこれ以来プラグインはおろかJavaすら書いていないのであった。

 

HSP3 横スクロールシューティング

先日はHSPで星もどきを多重スクロールするプログラムについて紹介しましたが、ああいうのはいかにも横シューの背景であるのでレーザーを撃てる自機を作ってみます。

とりあえず、以下のプログラムを実行してみてください。なお、今回は敵のプログラム部分は抜いてあります。

 

動作イメージがわかったところで各セクションについて説明を加えていきます。

各命令についてはHSPの命令リファレンスなどを参照してください。

 

 

//ショットフラグ用の変数

・この配列変数には、「レーザーが画面に表示されているか」のフラグが格納されます。

・上のサンプルでは配列が10ですので、画面上には同時に10本のレーザーが表示できます。

 

//画面初期化

・次フレーム描画のためにここで画面を一度まっさらな状態にしています。

 

//キー入力判定

・getkey及びstick命令でキー入力を取得しています。

・stick命令は同時押し判定が必要な時に便利です。

 

//ショットフラグを立てる

・スペースキーが押された場合にショットフラグを立てます。配列の若い方が優先されます。

・shotLimitで1フレーム中にフラグを立てられる数を1つに制限しています。

 

//自機移動

・キー入力に基づいて自機を移動します。サンプルでは上下左右ともに移動速度は4ドット/フレームです。

 

//レーザー描画

・ショットフラグに基づいてレーザーを描画します。

・サンプルではlaserLength(レーザー長)は100です。自機の前に突然長さ100のレーザーが現れるのは不自然ですから、64行目で自機からレーザーが伸びる処理をしています。レーザー長が100に達するまではレーザーの始点は自機に追従します。

・レーザーは10ドット/1フレームの速度で発射されます。

・65行目は実際にline命令でレーザーを描画しています。

・66行目ではlaserLengthが100に達したレーザーを画面右にスクロールしています。レーザ長や速度を変更する場合は、64行目のlaserLengthとlaserPosXに数値を一致させなければなりません。

・67行目では、画面外に出たレーザーのショットフラグを解除(下ろす)しています。

 

//背景スクロール

前述の通り、前回のプログラムを使用しています。

 

//画面に反映

・試してもらえばわかりますが、redraw部分がないと画面がちらつきます。

 

 

ざっと説明させてもらいましたが、不明な点などはコメント欄にお寄せいただければ可能な限りお答えいたします。

それでは今回はこの辺で。

 

 

HSP3基礎編 ループ命令

今回はHSPネタです。

以前自分が書いたコードを見ていたら、「星の多重スクロール」をさせるプログラムがありました。星といってもpsetで点を打って動かしてるだけです。横スクロールシューティングの背景でよくあるアレです。

 

仕様としては、3レイヤーで各20個の点が移動します。

そのコードがこちら。

 

 

いやぁもう長くて酷いですね。驚いたことに、なんとループを使っていません。アホかと。

 

このプログラムは配列変数の数だけ繰り替し処理を行っていますが、ループを使わず、すべてずらずらと記述してあります。大変無駄ですね。

 

ループの説明に入る前に配列変数について少し。

たとえば、arrValという変数を用意します。配列は5です。

続いて、これに値を代入します。

これで値が代入されました。

ではこれを全部足してみます。

これで画面には1+2+3+4+5の結果が表示されることでしょう。

 

この例の場合では配列が少ないのでたいした手間ではありませんが、最初にあげたプログラムのように、配列が多くなった場合はどうでしょうか。

入力するのは大変手間ですね。そこでループを使います。

今度は、arrValの配列を100として、先ほどと同様に値を1から順番に入れていきます。

ループを使うとたったこれだけです。

ここではfor~next文を用いています。2行目の意味は「i」を「0」から「100」まで「1」づつ増やせ。となります。

従ってarrVal(0)には1が、arrVal(1)には2が、というように順番に代入されていくのです。

 

ではこれを足していきます。

今度はforeach~loop文を使用しました。

arrValの配列の数だけforeach~loop間を繰り返せ、という意味になります。ここではarrValの配列は100ですから、100回繰り返されます。

cntはループした回数を表します。すなわち、1回目のループではcnt=0、2回目のループではcnt=1となります。

 

それでは、以上を踏まえた上で、最初のプログラムを書き換えてみます。

いかがでしょうか。行数は1/5となり、大幅な軽量化ができました。

基本中の基本ながら、以前の私のように容量にものをいわせたようなコードを割とよく見かけます。もういちどコードを見返してみるのもいいかもしれませんね。

 

 

余談ですが、さらにコンパクトにもできます。

配列0~19に1層目のデータを、20~39に2層目を、40~59に3層目のデータを格納させました。

もっとも、リソースが豊富な今のコンピュータ環境からいうと、容量よりも可読性の方を優先すべきでしょうね。