Profile

アメリ

Author:アメリ
キャラ紹介

line
カテゴリ
AIR (1)
Pos (1)
Var (1)
FAQ (1)
line
不許カウンター
line
最新記事
line
最新コメント
line
最新トラックバック
line
月別アーカイブ
line
sub_line
カレンダー
06 | 2017/07 | 08
- - - - - - 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 - - - - -
line
検索フォーム
line
リンク
line
RSSリンクの表示
line
QRコード
QR
line
ブロとも申請フォーム

この人とブロともになる

line
sub_line
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
line
 velはfloat型で様々な影響を受けます。ステートが変化した場合にvelを移すのは各statedefのvelset=vel x, vel yで良いのですがそれ以外の方法だと問題になる場合があります。変数に値を格納して必要な時に取り出す方法もありますがいつ設定するかと言うのが問題になります。

摩擦
velocityはx方向に於いて[Movement]の以下の値の影響を受ける。yについては分かり易いと思うので取りあえず省略。
[Movement]
stand.friction = .85 ;Friction coefficient when standing
crouch.friction = .82 ;Friction coefficient when crouching

この値が乗算される。つまり、通常は地面に接している状態だと設定した速度よりも落ちる。
[Velocity]
jump.fwd = 2.5 ;Jump forward Speed (x, y)
上記の場合にphysics=Sでvelを与えても*.85されてしまう。

 また、physicsがS,Cの場合には1.0以下のvelの影響を受けない様になっています。これを回避するにはphysicsをAにして尚且つジャンプ状態の制御をする必要があります。然るべき設定を行わないで地上でphysicsをAにしても着地してしまうので52番のステートに移ってしまいます。

; Jump Land
[Statedef 52]
type = S
physics = S
ctrl = 0
anim = 47

 これを防ぐにはphysics=Sでpos yを-1以下に設定して空中に設置し地上に立っている様に見せる方法があります。地上で擬似的な動作をする為にはposをfvarで計算して整数部分が増減(変化)したらposを加算する処理が必要です。また、physics=Aの時にpos yが0以上になると自動的に着地処理が行われるので着地前に余裕を持ってphysicsを設定する必要があります。
 physics=Sでpos y=-1であれば高さが1変わるだけなので特に問題は出ないと思いますがステートの終了時にposを0に戻すべきで、また食らった場合を考慮すると食らった瞬間にpos yが変化せず-1のままでvel yが0であればpos yを0にする様な処理が必要です、そして相手のステートに入った場合を考えてposを設定するかどうかを決めなければなりません。コモンステートの食らい状態で設定すれば問題ないのでしょうが、相手のステートから戻ってきたらと言う形で条件を入れる必要が出てくるかと思います。

摩擦によるvelの打ち消し
 普通のキャラはstand.friction>crouch.frictionなのでxについてはこの式が当てはまります。
velset = 1/const(movement.crouch.friction)-0.1,0
この式はvelの初期値が1を下回る設定と言う意味です。地上での摩擦は1未満の値を打ち消しますのでこの値を設定してもステートの終わりには0になります(但し、効果はあります)。これは常にveladdした場合も同様で1未満のvel xを設定した場合はvelが1フレーム毎に0になりposaddでx=1をしているのと等しくなります、そう言った状態になると事実上vel xが増えない事になります。
 しかし注意点があります。velset=0.1,0とした場合には動かない様に思えますが実は0.1ずつ加算されているのです。つまり一回では動かないだけで内部的には浮動小数点で管理されていると言う事です。次の様な実験をしましたstate 0にveladdを置いてみて移動するかどうかを調べました。その時のxの値は以下の3つです。

x = 0.016
x = 1/60
x = 0.00166

そんな馬鹿なと思うかも知れませんが浮動小数点で表記した方は動きましたが除算表記の方は動きませんでした。これは整数同士の除算だと整数が返る様になっているからです、そうしないと整数から整数の変数に入れる時に問題がありますので。結果的に1/60は0になっているのでそもそも動きません、しかし除算表記でも次の様にすれば動きました。

x = 1/60.0

紹介はしませんが以前色々やった時に似た様な現象があり、それに近いです。つまりこういう表記をすればとても微妙なvelも設定できると言う事です。でも何フレームか毎にpos xに足すと言うのと余り変わりませんね。


相手キャラとの衝突
 playerpushが設定されているプレイヤーと接触すると移動速度が落ちますがvelは変化しません。押し出し中も同じ速度を保ちたい場合は現在のvelを(1+(P2BodyDist x=0))の様にして倍にする必要があります。

摩擦によるvelの変化、veladd
 地上(pos y>=0)では摩擦の影響を受けます。具体的にはvel xが1以上の場合にfrictionの値が乗算されます、なのでveladdはvelsetと違い1フレーム毎に値がぐにゃっと変化していきます。

[statedef]velset=1,0
[veladd]x,y=1,0 ;(毎フレーム)

この時、
Time=0, vel x=1
Time=1, vel x=1.7
Time=2, vel x=2.295
Time=3, vel x=2.80075

1ずつ加算されればTime=3の時にvel xは4となるはずですがなんと2.80075になっています。これから解る様に地上ではvelsetとveladdでの結果が基本的に異なります。


Physics=N
さて、長々と説明してきましたがもっと根本的な解決策があります。
[statedef 0]
type = S
movetype= I
physics = N
ctrl = 1

[state 0, All states must have at least one state controller]
type = null
trigger1 = 1

こんな感じのステートを作ってやると(これだと立ち状態の変更になりますが)すぐわかります。
取りあえず最低限のステコンを一個起きました。どうなるでしょうか。(animは後で指定してみてください)

この状態でジャンプやダッシュを行うとその後ステート0に移動してニュートラルの状態になります。ニュートラル状態では先程説明した摩擦等が無いので無重力状態と同じになります。

[state 0, up]
type = velset
trigger1 = time = 30
y = -1

[state 0, down]
type = velset
trigger1 = time = 60
y = 1

さて、続いてこの2つをおいてみましょう。どうなるでしょうか。

こうすると30フレーム後に上に上がりだして60フレーム後に下がり出します。
そしてそのまま着地処理もされずに画面の下へ真っ直ぐ進んでいきます。
statetypeをAに変更しておいても着地しないので地面の下へめり込んで画面外へ消えて行ってしまいます。
この様に、Nutral状態だと地面と言う物がなくなる様です。

これなら自由に動かせそうですね。地上で滑らすのも簡単ですが今度は止まらないので注意が必要です。
それと普通のステートはvelset=0,0を設定していると思いますが、これをしてしまうとvelが維持されないので注意しましょう。

何れの方法にしてもある程度の制御は必要になります。
スポンサーサイト
line
line

line
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。