2015年10月7日水曜日

HSPで作っているゲームでキャラが動くようになったよ!

ノーベル賞すごいね!
昨日と今日と続けて日本人がノーベル賞に選ばれていて、ニュースが楽しい。
世界の多くの人類や家畜を救う研究とか知らなかっただけですごい人が日本にいるんだなぁ。
ニュートリノに重さがあったとか、その分野の人にとっては大ニュースなんだろうなぁ。
ヒッグス粒子が重さの粒子とか聞いた気がするけど、それと関係あるのかな?

科学番組は好きだけど、
結局なんとなくしかわからない SakuraCrowd です。₍₍ (ง ˘ω˘ )ว ⁾⁾

進捗報告


先月下旬から作っているゲームなんですが、
マップの上をちょこまかとキャラが移動する仮組みを作ることができました!
ヽ( ´¬`)ノ ワ~イ !!


やしの木とかの前景にはキャラが隠れるようにしました。
あと、おおざっぱですが当たり判定をいれて、障害物がある場所は通れないようにしています。
移動は上下左右にななめを加えて8方向に対応しました。

パソコンもソフトウェアも進化しているらしく、高速化を意識していない処理でもさくさく動きます。ヽ( ´¬`)ノ ワ~イ !!
とはいっても、あからさまに無駄な処理はしないように注意しながら作りました。

おおざっぱな流れをいうと、

  1. 背景画像を描く
  2. キャラクタを描く
  3. 前景画像を描く
  4. 矢印キーの入力を調べて、キャラクタの向きと位置を変えたりする。
  5. 一定間隔でキャラクタのアニメーションのフレームを切り替える

この繰り返しです。

キャラクタは先日のブログに書いた方法で、パーツを重ねて描いています。
前景画像もキャラクタと基本的な処理は同じです。

入力処理


入力処理についてだけ、新しく追加したのでコードを抜粋します。

// 矢印キーにより移動させる
stick key, 15
dx = 0: dy = 0
if key&1 : dx -= 8
if key&4 : dx += 8
if key&2 : dy -= 8
if key&8 : dy += 8
if (dx != 0 or dy != 0) {
ScSpriteMoveBy IDX_SPRITE0, dx, dy, 1, idxPartAtariMap
}
await 33

stick という標準命令で矢印キーの入力状態を取得して、上下左右ごとに押されていたら移動量を変化させています。

ScSpriteMoveBy は自作の命令です。
当たり判定をして、障害物がない場合は指示されたとおりに移動します。


移動のときに進行方向を向くようにしています。

stick の第2引数


stick の 15 という引数は、押しっぱなしを入力として受け取るかを決めるマスク値です。
stick key, 15 だと矢印キーを押しっぱなしで、キャラクタが移動します。
stick key, 0 だと矢印キーを連打して1歩ずつ移動させないといけません。

stick では、ビット単位で入力の有無を表しています。
下位1ビットが左、2ビットが上、3ビットが右、4ビットが下です。

15 はバイナリだと 00001111 となり下位4ビットが全て 1 の状態です。
つまり、上下左右の矢印キーについては、押しっぱなしのときに入力を受け取る設定です。

stick は通常は押された瞬間しかビットを1にしません。
押しっぱなしだと、押された瞬間以外はビットは 0 です。
これが、マスクを指定すると、それに対応したビットは、押しっぱなしの間でもずっとビットが 1 になり、押されていることがわかります。

そういえば stick のほかにも2つほど便利な命令を見つけました。

便利な命令 await


入力処理にもでてきている await という命令は、 wait と似ていて指定した時間だけ待機します。

便利な点は、前回の await 終了時点からの経過時間を計測することです。
wait では wait 33 とすると呼び出しから 330 ミリ秒待ちます。

1回目の await が終わった後、処理に 15 ミリ秒かかったとします。
その後 2 回目の await 33 とすると 33 - 15 = 18 ミリ秒だけその場で待機します。
これにより FPS を簡単に管理することができます。
それと await は wait より 10 倍精度が高く指定でき、 1 ミリ秒単位で指定できます。

便利な命令 redraw


もうひとつの便利な命令は redraw です。
たくさんの描画処理を直接スクリーンにすると、画面がちらついて表示されます。
そのため、バッファに描いてから、完成したバッファの画像をスクリーンに転送するダブルバッファリングなどがあります。
しかし、 redraw を使うことでダブルバッファリングをしなくてもちらつきを防ぐことができます。

具体的には、
  1. redraw 0 // スクリーンに描画処理を反映しない
  2. 任意の描画処理
  3. redraw 1 // スクリーンに描画処理を反映する
というふうに、ちらついてしまう描画処理の間に redraw をはさみます。
redraw は gsel で選択しているスクリーンのみが対象になるので、 redraw の前に gsel でスクリーンの番号を指定したほうがよいです。

予定


次はマップをオートスクロールしたいと思います。

ハロウィン期間中にリリースしたいけど
絵も実装もまだぜんぜん足りないよおおお。。゚(゚´Д`゚)゚。
なるようになるか₍₍ (ง ˘ω˘ )ว ⁾⁾

0 件のコメント:

コメントを投稿