跳躍制御ジャンプ

ジャンプキー(下記のプログラムではスペースキー)を押して居る時間と跳躍距離が相関するジャンプで有る。下限に達する迄は、ジャンプ中にジャンプ(更に上昇)しても良い為、ジャンプキーが押されて居る間、上下の移動速度(下記のプログラムでは変数Ac)を徐々に減少(デクリメント)させ(但し、下限を設けないと、際限も無く高く跳ぶ)、押されて居なければ、降下フラグ(下記のプログラムでは変数Dn)を立てゝ、其れ以上ジャンプ出来ない様にする(下限に達した場合も同じ)。
上昇中も下降中も共に、重力加速度の影響を受けるので、上昇中も下降中も、上下の移動速度(下記のプログラムでは変数Ac)に重力加速度(本来は9.80665m/s2で有るが、其れらしく観える値を使用する)を加え(下記のプログラムでは0.7に仕た)、キャラクタのY座標(下記のプログラムでは変数Cy)に加える。此れに依り、上昇は徐々に減速し、下降は徐々に加速する。
此処では、ダッシュキー(下記のプログラムでは左シフトキー)を放しても、直ぐに初速度に戻らず、慣性が働く様に仕て居る。亦、移動中でない時にマントが靡いて居るのは不自然なので、右移動も左移動も仕て居ない時は、キャラクタ画像の何番目の画像を使用するかを示す序数(下記のプログラムでは変数St)を初期値の0に戻して居る。
此のプログラムでは、キャラクタを、左右の矢印キーで左右に移動させて、スペースキーでジャンプさせて居る。亦、左シフトキーで移動速度を速めて居る(所謂Bダッシュ)。猶、無限ループを抜けるには、エスケープキーを押す。
キャラクタ画像を下記に示す(調子に乗って、マントマリコも描きました)。

| Visual Basic 2005/2008/2010 |
Imports System.Runtime.InteropServices
Public Class jump
<DllImport("user32")> Shared Function GetAsyncKeyState( _
ByVal vKey As Keys) As Short
End Function
Private Bm, Bp As Bitmap
Private Gb, Gf As Graphics
Private Sub jump_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Dim P As String = Application.StartupPath
If Not P.EndsWith("\") Then P &= "\"
Bm = New Bitmap(P & "map.gif")
Bp = New Bitmap(P & "mariko2.gif")
With picDisp
.BackgroundImage = New Bitmap(.Width, .Height)
.Image = New Bitmap(.Width, .Height)
Gb = Graphics.FromImage(.BackgroundImage)
Gf = Graphics.FromImage(.Image)
End With
Gb.Clear(Color.LightBlue)
Gf.Clear(Color.Transparent)
For I As Integer = 0 To 639 Step 32
Gb.DrawImage(Bm, New Rectangle(I, 336, 32, 32), New Rectangle(384, 192, 32, 32), _
System.Drawing.GraphicsUnit.Pixel)
Gb.DrawImage(Bm, New Rectangle(I, 368, 32, 32), New Rectangle(384, 192, 32, 32), _
System.Drawing.GraphicsUnit.Pixel)
Next
End Sub
Private Sub btnStart_Click(sender As System.Object, e As System.EventArgs) Handles btnStart.Click
btnStart.Enabled = False
Call Game()
btnStart.Enabled = True
End Sub
Private Sub Game()
Dim Cx As Single = 304.0F ' キャラクタX座標【Charactor X】
Dim Cy As Single = 272.0F ' キャラクタY座標【Charactor Y】
Dim Sp As Single = 2.0F ' 左右移動速度【Speed】
Dim Ac As Single = 0.0F ' 上下移動速度【Acceleration】
Dim Dr As Integer = 0 ' 方向(0:左向き、1:右向き)【Direction】
Dim St As Integer = 0 ' 表示キャラクタ(0〜3)【State】
Dim Fl As Boolean = False ' 左移動中【Left Move Flag】
Dim Fr As Boolean = False ' 右移動中【Right Move Flag】
Dim Jp As Boolean = False ' 上昇【Jump】
Dim Dn As Boolean = False ' 下降【down】
Dim Ks As Integer = 0 ' キー状態【Key State】
Dim Cnt As Integer = 0 ' ループカウンタ
Dim Tm As DateTime ' タイマカウント(VSYNC相当)
Do
Tm = DateTime.Now
' Quit
If GetAsyncKeyState(Keys.Escape) < 0 Then
Exit Sub
End If
' Dash
If GetAsyncKeyState(Keys.LShiftKey) < 0 Then
Sp += 0.5F : If Sp > 10.0F Then Sp = 10.0F
Else
Sp -= 0.5F : If Sp < 2.0F Then Sp = 2.0F
End If
' Left Move
If GetAsyncKeyState(Keys.Left) < 0 Then
Fl = True : Dr = 0 : Cx -= Sp : If Cx < 0.0F Then Cx = 0.0F
Else
Fl = False
End If
' Right Move
If GetAsyncKeyState(Keys.Right) < 0 Then
Fr = True : Dr = 1 : Cx += Sp : If Cx > 608 Then Cx = 608
Else
Fr = False
End If
' Jump
If Not Dn Then ' 落下中でなければ
Ks = GetAsyncKeyState(Keys.Space)
If Ks < 0 Then ' キーが押されて居れば
Jp = True : Ac -= 2 : If Ac < -10 Then Ac = -10 : Dn = True
Else ' キーが押されて居なければ
If Jp Then Dn = True : Jp = False
End If
End If
' While Jump and Drop
If Jp OrElse Dn Then
Ac += 0.7
Cy += Ac
If Cy < 0 Then
Jp = False : Dn = True
End If
If Cy > 272.0F Then Cy = 272.0F : Jp = False : Dn = False : Ac = 0.0F
End If
' Stop
If Not (Fl OrElse Fr) Then St = 0
' Disp Caractor
Gf.Clear(Color.Transparent)
Gf.DrawImage(Bp, New Rectangle(Cx, Cy, 64, 64), New Rectangle(St * 64, Dr * 64 + 256, 64, 64), _
System.Drawing.GraphicsUnit.Pixel)
picDisp.Refresh()
' Loop Counter
If Fl OrElse Fr Then Cnt += (Sp + 1)
If Cnt > 10 Then St += 1 : Cnt = 0 : If St > 3 Then St = 0
Do
Application.DoEvents()
Loop While Tm.AddMilliseconds(50) > DateTime.Now
Loop
End Sub
End Class
|