hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
小ワザ/アクション/基本動作 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

小ワザ/アクション

基本的な動き

 2DアクションゲームのHSPサンプルを探したのですが、意外なことにほとんど見つけられませんでした。 というわけで、実際にやってみることにしました。
横スクロール型ゲームの企画とは非連動で進めていきます。ご容赦を。

 まずは基本的な動作だけをやってみます。
アクションゲームの基本動作は、

  • ダッシュ
  • ジャンプ

と、こんなところでしょうか。
次に基本要素を考えてみます。

  • 重力
  • (地面との)摩擦
  • 床、壁との衝突

だいたいこんなところでしょう。

 これらの要素を積み込めばアクションゲームっぽい動きが再現できます。
これらの要素を取り込んだものを下のサンプルに用意しました。詳細はサンプルをご覧下さい。

結構適当なつくりになっています。(暇を見て修正します。m(_ _)m)

サンプル

hsp2.png

+  サンプル
+  サンプル [hsp3]翻訳版
+  モジュール不使用版サンプル [hsp3]

ダッシュ

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
psize = 8
px = 100.0 : py = 300-psize
vx = 0.0 : maxspeed = 6.0
repeat
    ok37 = k37 : ok39 = k39
    getkey K37, 37 : getkey K39, 39        ;←キーと→キーで操作
    if k37 { vx -= 0.1 } : if k39 { vx += 0.1 }
    if (k37^ok37&ok37) | (k39^ok39&ok39) { vx=0.0 } else { px+=vx }    ;押してる間は加速し続ける
    vx = limitf(vx, -maxspeed, maxspeed)    ;速度制限
    redraw 0
    color : boxf : color 255, 255, 255
    line ginfo(12), 300, 0, 300
    circle px-psize, py-psize, px+psize, py+psize    ;キャラクター描写
    redraw 1
    wait 1
loop

ジャンプ

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
psize = 8
yuka=480
px = 300.0 : py = double(yuka-psize)
jump = 0    ;ジャンプフラグ変数
vy=0.0
repeat
    getkey K32, 32        ;SPACEキー
    if k32&jump=0 { jump=1 : vy=-13.0 : py+=vy }
    if py<yuka-psize { py+=vy : vy+=0.3 }
    if py>yuka-psize { py=double(yuka-psize) : jump=0 }
    redraw 0
    color : boxf : color 255, 255, 255
    circle px-psize, py-psize, px+psize, py+psize    ;キャラクター描写
    redraw 1
    wait 1
loop

コメント

  • φ(.. )メモメモ -- パタパタ大王 2006-01-26 (木) 06:24:19
  • 実際作ってみると結構面倒ですね。ずいぶん長ったらしくなってしまった…。 -- GENKI? 2006-01-26 (木) 22:20:24
  • このタイプのゲームでプラグイン使うならどれがいいんでしょう?HSPDXFIX?HSPDX+α? -- GENKI? 2006-01-26 (木) 22:25:50
  • こんばんは。段々と完成に近付いていますね。勉強になっています。ところでちょっと気になるのはプレイヤーと見立てた黒くて小さい四角ですが、左方向は壁に当たるとちゃんと止まるのに右方向は壁にめり込んでるような−−; それとブロックの上に乗っていて左に進めていくとまだ乗っている部分があるけど落ちてしまいます。理由は、判定するブロックの場所をプレイヤーの一番左上の座標から決めているからだと思います。・・・、しかしだからといってそれを補う良い方法は思い浮かんでいません。(ノ><)ノ 良い考えが浮かばなければ、GENKIさんが言う通り、画面上の全ブロックと当たり判定しないといけないかもしれませんね。わたくしパタパタ大王も、GENKIさんが作っているこのサンプルとkz3さんがずっと前にアップしていた横スクロール(horizon)のサンプルを見てすばやく対応できるように準備しているところです。 -- パタパタ大王 2006-01-28 (土) 21:10:20
  • 仕様です。取り合えず、単なるサンプルプログラムなので1ドットのみをキャラクターとしています。1ドットだと画面上見にくいので右下方向に面積を広げてるだけです。サンプルは極力見やすい単純なものでないと分かりにくいですから。(とかいいながら大きいサイズのキャラクターで判定するのは、まだ出来てないんですけどね。) -- GENKI? 2006-01-28 (土) 23:12:36
  • 対策は簡単。キャラクターの四隅にひとつずつあたり判定用のドットを配置してやればOKだと思います。まだやってないんで分かりませんけどね。 -- GENKI? 2006-01-28 (土) 23:16:21
  • 今年のHSPコンテストは、あの企画とは別にアクションゲーム出してみようかなと思う今日この頃…。 -- GENKI? 2006-01-28 (土) 23:31:48
  • 頼もしいですね^^ 新しいものを作ることって楽しいですね。それ以外に何の為に学ぶのかという程に。 -- パタパタ大王 2006-01-28 (土) 23:58:01
  • ここのところGENKIさんだけがスクリプトを示してくれているという状況で、GENKIさんの基礎スクリプトが完成しそうなこの辺りで、企画を言い出したわたくしパタパタ大王もスクリプトを付け足したいところです。(一からスクリプトを組まないとやる気が出ないという?)kz3さんがずっと前に投稿していたhorizonのスクリプトとGENKIさんのこのスクリプトを融合させるべく何日か前から色々試していました。簡単に拡張できることを考えて、ユーザーによる新規命令のパラメータを何個でも受け取れて制限も緩まったHSP3.0で企画を進めていこうと考えています。(GENKIさんの昨日のサンプルを3.0に直すのに、計算の優先度が違うことに気が付かなくて時間がかかってしまいました^^;)とりあえず明日から、今日のサンプルを3.0に直して、わたくしが用意しておいた移動のアニメーション処理などと融合させて「横スクロール型ゲーム」にアップし始めようと思います。(あいかわらず長いコメントです・・・−−;) -- パタパタ大王 2006-01-31 (火) 00:11:18
  • 16*16サイズのキャラクターの場合の当たり判定サンプルのモジュール部分を整理しました。だいぶすっきりしたと思います。 -- GENKI? 2006-02-01 (水) 22:59:35
  • セルサイズよりキャラクタサイズを大きくても、もう少しまともに動くかと思ってましたが甘かったようです。横方向のことしか考えてなかった…。結構愉快な動きをしてくれます。(^ ^; -- GENKI? 2006-02-01 (水) 23:44:08
  • ここは参考になりますね。横スクロールゲーム作ってますんで( -- sora? 2006-10-23 (月) 07:12:13
  • m_ChrPos? ってなんですか? -- ジャングルサバイバル? 2011-01-13 (木) 10:29:59

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

障害ブロックとの衝突判定

障害ブロックとの衝突判定を行います。
PCは、「□」で表示していますが、判定を行っているのは□の中心点1ドットがキャラクター中心だけです。

 障害ブロック四方4面とのとの衝突判定が出来ます。

アルゴリズム

基本的な動作のアルゴリズムはこんな感じ。

  • 移動する前に、障害物が何もなかった場合の移動位置を予測します。
  • 移動先に障害物があれば、障害物があったときの行動をとります。
  • MAPは32*32で区切ったセルで作られています。(コレを考慮して判定する)
  • MAPスクロールは、ゲームの仮想空間とウィンドウ内の座標が別物である、と考えると考えやすいです。
    3Dでの3D空間とカメラの関係みたいな感じです。

 画面上の全キャラクター(ブロック1つ1つ)と当たり判定をしていては非常に時間が かかるので、判定が必要なキャラクターの部分だけで当たり判定を行います。
 ほんとうは移動前と移動予定地点を線分でつないで、その間に障害物があるかどうか判定 しないといけないんですが、とりあえず今のままでもうまく設定すれば問題にはならないでしょう。

1×1ドットのキャラクターを使ったサンプル

 キャラクターサイズを 1*1に限定して作成したサンプルを作成しました。
さすがにこれ(1*1ドット)では見えないので目立つように□で囲んでいます。□の中心の中心の1ドットが衝突判定に使っているキャラクターです。
(しかし、これじゃ画面のスクロールは上限が近すぎてまずいかな?)

↓サンプルです。280行ぐらい(コメント含)あります。
hsp2.png

+  サンプル

HSP3用をお探しの方はこちら。 [hsp3]fileModulelessForHSP3.hsp
簡素化のため、摩擦は考慮していません。

ある程度の大きさを持つキャラクターのサンプル

キャラクターが16*16サイズ(固定)の場合です。
キャラクターのイメージはこんな感じ。縦横偶数サイズなので中心座標が少しずれることに注意。

■□□□□□□□□□□□□□□■
□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□
□□□□□□□■□□□□□□□□
□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□
■□□□□□□□□□□□□□□■

四つ角それぞれを、当たり判定用のセンサーとしています。
この判定方法の欠点は、セルのサイズより大きいキャラクターを作ると、当たり判定が正常に動作しなくなることです。
といってもある程度は機能するはずです。大きくても大丈夫だと思いますが、セルサイズとの比があまり大きくなり過ぎないように注意が必要。

それにしてもマイナスのときの処理がかなりいい加減…もっとスマートなやり方ないですかね。どう考えたらいいのやら…。

hsp2.png

+  サンプル

また、公式掲示板の記事「ジャンプアクションゲームの当たり判定がうまくいかない」にDrip?さんによるスクリプト(HSP3)が掲載されています。


添付ファイル:
filebasic2.hsp
656件 [詳細]
filebasic.hsp
780件 [詳細]
filebasic.as
665件 [詳細]
fileModulelessForHSP3.hsp
918件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2013-06-27 (木) 23:25:21 (163d)