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

慣性を導入した移動

レースゲームの特色とも言える慣性を実装するための方法を解説します。
レースゲームに特化して解説しますが、アクションやシューティングなどのジャンルにも応用できると思います。

慣性とは

慣性とは力を受けない限り物体の運動状態が(慣性系に対して)変化しない性質です。 現実世界の運動には必ず慣性が働くので、リアリティのあるゲームを作成する上で慣性は非常に重要です。

一般的なレースゲームではアイテムなどの例を除いて

  • タイヤと道路間の摩擦力
  • アクセルによる力
  • ブレーキによる力
  • コースや他の車から受ける力

を受けない限り車の速度が変化しないようになっています。

しかしゲームプログラムでこれらの力の計算を厳密に行うのは無駄な場合が多いので、適宜近似した式を用いることをお勧めします。

基礎知識

慣性を導入するにあたって必要な知識をまとめました。より詳しいことは物理のおおまかな話などを参照してください。

速度
1フレームあたりの位置の移動量。メインループが1回実行されると10ピクセル移動する物体の速度は10[px/f]。
平面上で運動する物体なら、物体の速度は2方向に分解できる。通常レースゲームではX方向とY方向に分解する。
加速度
1フレームあたりの速度の変化量。メインループが1回実行されると速度が2ピクセル減少する物体の加速度は-2[px/f/f]。

実装方法

慣性を導入しない場合はstickgetkeyで取得したプレイヤーの入力をそのまま速度として使えば良かったのですが、 慣性を導入する場合はプレイヤーの入力は加速度に反映させる必要があります。

速度はこの加速度をフレームごとに加算することで決定されます。

サンプルスクリプト

摩擦力の計算やアクセル・ブレーキなどの概念を取っ払った、近似的な慣性を実現したサンプルスクリプトです。
ゲームプログラムではこうした近似で充分役に立ちます。

↑キーを押している間だけ加速し、押していない場合は減速します。 速度はlimitf()関数によって上限および下限が決められています。
#constで定義されている数値を変更して色々と試してみてください。

filesample.hsp
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
!
 
 
 
-
|
|
|
|
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
/* 操作方法
	[Up]          : 加速
	[Left][Right] : 旋回
*/
 
#const PI 3.14159
 
#const AREA_X        320    // 走行エリアの広さ(横)
#const AREA_Y        320    // 走行エリアの広さ(縦)
#const GRID_DISTANCE 32     // グリッドの間隔
#const GRID_NUM_X    11     // グリッドの本数 (= AREA_X / GRID_DISTANCE + 1)
#const GRID_NUM_Y    11     // グリッドの本数 (= AREA_Y / GRID_DISTANCE + 1)
#const CAR_SIZE      12     // 車の長さ
#const ACCELERATION  0.1    // 加速度
#const ANG_SPEED     0.1    // 角速度
#const MAX_SPEED     3.0    // 最高速度
#const AWAIT_TIME    16
 
*init
    screen 0, AREA_X, AREA_Y, 0
    title "慣性を導入した移動"
 
    carX = 10.0 : carY = 10.0   // 車の座標
    carT = PI / 4               // 車の向き
    carSpeed = 0.0              // 車のスピード
    needToDraw = 1              // 描画し直す必要性がある場合は1
 
*main
    gosub *move                 // 車の移動
    gosub *draw                 // 車とグリッドの描画
    await AWAIT_TIME
    goto *main
 
*move
    stick key, %111             // ←↑→が非トリガータイプキー
    gosub *moveCar              // 車の移動
    return
 
*moveCar
    // ■ このサブルーチンが今回のポイント!
 
    // 速度の決定。↑を押せば加速、押さなければ減速
    // "(key & 2) - 1"は↑を押した時は2 - 1 = 1、
    // ↑を押していない時は0 - 1 = -1になる
    carSpeed = limitf(carSpeed + ACCELERATION * ((key & 2) - 1), 0.0, MAX_SPEED)
 
    // 速度がゼロより大きい時は、方向転換を施した上で移動する
    if carSpeed > 0.0 {
        // 方向転換
        carT += ANG_SPEED * ((key & 1) - (key >> 2 & 1))
 
        // 移動(画面からはみ出さないようにlimitf()関数を使っている)
        carX = limitf(carX + carSpeed * cos(carT), 0, AREA_X)
        carY = limitf(carY + carSpeed * sin(carT), 0, AREA_Y)
 
        needToDraw = 1  // 車が移動したので画面を描画し直す必要がある
    }
    return
 
*draw
    if needToDraw {
        redraw 0
        color : boxf
        gosub *drawGrid
        gosub *drawCar
        redraw 1
        if carSpeed == 0.0 : needToDraw = 0
    }
    return
 
// グリッドを描く
*drawGrid
    color 0, 0, 255
    repeat GRID_NUM_Y
        y = cnt * GRID_DISTANCE
        repeat GRID_NUM_X
            x = cnt * GRID_DISTANCE
            line x, AREA_Y, x, 0
            line AREA_X, y, 0, y
        loop
    loop
    return
 
// 車を表示
*drawCar
    color 255
    pos carX, AREA_Y - carY
    line carX - cos(carT + 0.2) * CAR_SIZE, AREA_Y - (carY - sin(carT + 0.2) * CAR_SIZE)
    line carX - cos(carT - 0.2) * CAR_SIZE, AREA_Y - (carY - sin(carT - 0.2) * CAR_SIZE)
    line carX, AREA_Y - carY
    return

コメント


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

添付ファイル:
filesample.hsp
479件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-09-05 (水) 12:48:37 (2286d)