Profile

アメリ

Author:アメリ
キャラ紹介

line
カテゴリ
AIR (1)
Pos (1)
Var (1)
FAQ (1)
line
不許カウンター
line
最新記事
line
最新コメント
line
最新トラックバック
line
月別アーカイブ
line
sub_line
カレンダー
09 | 2011/10 | 11
- - - - - - 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
・AhojinGod / キャラ紹介記事 Characters

リンクの保管庫からdownloadしてください cns 0.37.6
download sff 0.37.0

・ワイド対応の修正
・ライフバー表示を滑らかに減る様に修正。
・1-4Pで希に勝利判定が出なかった不具合を修正。
・sprpriorityの調整。

 見た目の細かい部分を修正しました。
以前の更新で色々倒せる様になったので動画でも上げようかと思いましたが鑑賞動画を作っています。
そろそろアップできると思いますが・・

スポンサーサイト
line
・AhojinGod / キャラ紹介記事 Characters

リンクの保管庫からdownloadしてください cns 0.37.4
download sff 0.37.0

・TeamModeがSingle以外の時にも対応。
・スポンジ状態の調整。
・妖夢の出る位置を修正。

タッグは一応対応してあったのですがターン戦にも対応しました。
ターン戦はIDが変な値になるので少し困ります。

 気になったのはターン戦だと最大ライフが減ったりするので内部ライフが1000に固定されている様なキャラクターだと500以下にならないと反映されない事がありました(Leviathanとか)。耐久力はそのままでも表示を最大ライフに合わせればそれなりに見えると思いますがライフが増えた時も考えると少し手間ですね。
 ターン戦では最大ライフが減った状態でラウンド2に切り替わる瞬間辺りで一瞬だけ元の最大ライフ、つまり現在の最大ライフの2倍の値が見えたりするのも気になりました。


ケオオ・・・
間違えて一個消したからずれてるんですけお・・・
line
・AhojinGod 0.37.2a / キャラ紹介記事 Characters

リンクの保管庫からdownloadしてください cns 0.37.2a
download sff 0.37.0

・勝利演出が固定になっていたのを修正。

直す所を間違えて勝利演出自体が出ていなかったので修正しました。
line
・Hitdef
 当たった時の定義(hit define)です。Reversaldefで反撃されるのもHitdefです。また、Projの威力等の設定もHitdefのパラメーターを書いて行います。
 Hitdefを有効にする為には movetype = A である必要があり、最低でも2フレーム必要です(1フレームのステートだと次のステートがmovetype=Aでは無い事がある為)。Projctileの場合は関係ありませんがmovetype = Aにしておかないと攻撃中と言う事がわかりません。

・必要な事
 sff(画像をまとめた物)に画像の登録。
 air(アニメーション)の作成。ここで画像の指定、当たり判定(Clsn2)と攻撃判定(Clsn1)を作ります。
 cns(動作定義)の作成。新しく飛び道具を出すステートを作るのであれば[statedef 番号]を作成してtype =Hitdefで当たった時の設定をします。
 cmd(入力手順)の作成。[command]でコマンドを作って[statedef -1]より下にtype=ChangeStateを足して作ったステートに移動させます。

ここまでの作業が完了するとコマンド入力するとキャラクターが作ったステート(状態)に変わって(ChangeState)Hitdefが設定されて(type = Hitdef)アニメーションが終わる(AnimTime = 0)と立ち状態([statedef 0])に戻る(ChangeState、value=0)、と言う具合になります。手順さえわかれば後は実際に作るだけですね。


 Hitdefは様々な設定が出来ます。主に威力の設定、当たった時の設定、吹き飛びの設定です。大抵は初期値でも構いませんが後々の事を考えて次の値は必ず入れておきましょう。値は変更しても構いません。

fall.yvelocity = -4.5
yaccel = .35

 それでは各値を見ていきましょう。


・必須項目
 attr = 属性1, 属性2
攻撃属性で必須です。属性はS=立ち、C=しゃがみ、A=空中の状態とN=通常、S=特殊、H=超強いとA=打撃、T=投げ、P=飛び道具を合わせたのを設定します。

 attr = S, NA
 attr = S, NT
 attr = C, SA
 attr = A, SA

 こんな感じです。type = Hitdefの場合ではP=飛び道具の設定はしないのでAとTだけになります。
また、Reversaldefが可能な属性もAとTだけです。

 必須はこれだけです。

・type = Hitdef
 さてでは全パラメーターを見ていきましょう。数値が入っているのは省略時の初期値です。
数値が入っていない物はairだとgroundを参照する様に大抵が別の値を参照する形式になっています。
また、数値が入っていない物の中には不意に設定しない方が良い値もあります。

 細かい事はmugendocsState controller referenceをご覧下さい。
Ctrl+DデバッグモードにしてCtrl+Cを押して判定枠の表示を利用しましょう。

 セミコロンでコメントアウトしてある物は通常は不要です。声に出しながら一つずつ読んでみましょう。

type = Hitdef
attr = S, NA
hitflag = MAF
;guardflag =
affectteam = E

animtype = Light
;air.animtype =
;fall.animtype =
priority = 4
damage = 0, 0

pausetime = 0,0
;guard.pausetime =
sparkno = 5
;guard.sparkno =
sparkxy = 0,0
hitsound = 5,0
guardsound = 6,0

ground.type = High
;air.type =
ground.slidetime = 0
;guard.slidetime =
ground.hittime = 0
;guard.hittime =
air.hittime = 20
;guard.ctrltime =
guard.dist = 90
yaccel = .35

ground.velocity = 0
;guard.velocity =
air.velocity = 0,0
;airguard.velocity =

;ground.cornerpush.veloff =
;air.cornerpush.veloff =
;down.cornerpush.veloff =
;guard.cornerpush.veloff =
;airguard.cornerpush.veloff =
;airguard.ctrltime =

;air.juggle = 0
;mindist =
;maxdist =
;snap =

;p1sprpriority = 1
;p2sprpriority = 0
;p1facing =
;p1getp2facing = 0

;p2facing =
;p1stateno =
;p2stateno =
;p2getp1state =
;forcestand =

fall = 0
;fall.xvelocity =
fall.yvelocity = -4.5
;fall.recover = 1
;fall.recovertime = 4
;fall.damage = 0
;air.fall =
;forcenofall =

;down.velocity =
;down.hittime =
;down.bounce =

;id = 0
;chainID = 0
;nochainID = -1
;hitonce = 1
;kill = 1
;guard.kill = 1
;fall.kill = 1
;numhits = 1

;getpower = ,
;givepower = ,

;palfx.time =
;palfx.mul = ,,
;palfx.add = ,,

;envshake.time =
;envshake.freq =
;envshake.ampl =
;envshake.phase =
;fall.envshake.time =
;fall.envshake.freq =
;fall.envshake.ampl =
;fall.envshake.phase =


 凄い沢山ありますね。目眩がしそうですがProjの場合も同じように設定するのである程度は理解しておかないとメチャクチャになってしまいます。
 下の方はfallやshakeで通常は使わないので取り除くと綺麗になります。

type = Hitdef
attr = S, NA
hitflag = MAF
;guardflag =
affectteam = E

animtype = Light
;air.animtype =
;fall.animtype =
priority = 4
damage = 0, 0

pausetime = 0,0
;guard.pausetime =
sparkno = 5
;guard.sparkno =
sparkxy = 0,0
hitsound = 5,0
guardsound = 6,0

ground.type = High
;air.type =
ground.slidetime = 0
;guard.slidetime =
ground.hittime = 0
;guard.hittime =
air.hittime = 20
;guard.ctrltime =
guard.dist = 90
yaccel = .35

ground.velocity = 0
;guard.velocity =
air.velocity = 0,0
;airguard.velocity =

air.juggle = 0
fall = 0
;fall.xvelocity =
fall.yvelocity = -4.5

 この中で最初に変更する所と言えばpausetime、hittime、slidetimeでしょう、それとdamageをちょっと設定すれば攻撃の完成です。簡単な攻撃とは言え弄れる部分は多いです。基本的にgroundの値をair等が初期値とするので(補正がかかりますが)コメントアウトしてあって値が入っていない部分は入れなくても問題ありません。

 pausetimeは自分と相手が止まる時間、hittimeはpausetimeが終わった後に食らい状態で動く時間になります。pausetime+hittimeが相手が食らっている時間になります。guard系の時間も重要ですので計算してしっかり作りましょう。自キャラ同士でDisplayToClipboardを使ってstateno、hitpausetime、hitover辺りを表示させておきましょう、ignorehitpause=1をつけるのを忘れずに。

 Hitflagとguardflag、それにguard.distは重要です。guardflagとguard.distは変に設定するとガードできない攻撃になるので注意しましょう。設置系の攻撃の場合はguard.distが長すぎると相手がずっとガードしてしまったりするので適度な値にしましょう。statetypeとHitflagは揃えましょう。

 自分の作ったsparkやsoundを使う場合は数字の前にSをつけます。別のステートコントローラーに逆の物もあったような気がしますが・・。

 もしも上手くいかないのであれば次の部分を確認しましょう。

・アニメーションに攻撃判定がついているか。Clsn1
・[statedef ]で movetype = A になっているか(デバッグだとmovetype=1)。
・有効なTimeで実行しているか(アニメーションのTime以内かどうか)。
・Hitdefを実行した直後に movetype = A 以外になっていないか、実行直後に他のステートに移動したりしていないか。

 こんな所でしょうか。trigger1 = 1の様な条件にすると1フレーム毎に攻撃が更新されるので何回も当たってしまいます。一度実行したら movetype = A である間は有効なので一回だけ実行する様にしましょう。

・affectteam
 affectteamは攻撃対象を指定します。E, B, F (enemy 敵, both 双方, friend 味方)です。特にヘルパーから自分に当てる場合は projectile では無い必要があります。partner にも当たります。指定しない場合は affectteam = E になります。

・air.juggle
 air.juggle値は空中で当たった際に際限なく当たらない様にする為の値です。初期値は0です。
空中でのHit時に加算されて(多分 statetype = A)キャラクター設定の[data]辺りにあるjuggle=15と言うのを越える場合に当たらなくなります。
永久コンボを防ぐならjuggle最大値の半分以上の値(最大15なら8)や最低でも1を設定しておけば大丈夫だと思います。

・target
 ターゲットは攻撃を当てたままの状態(movetype = A)で相手が movetype = H の時に取得できます。
但し、当てた瞬間は相手の状態に因らず取得できます。Reversaldefはそのままの状態であれば相手の状態に因らず取得できます。
 NumTargetを使ってターゲットが居るか確認してから使いましょう。

trigger1 = NumTarget != 0
trigger1 = target,stateno != 3002

 Redirectの項目を参照。

・hitdefpersist
 hitdefpersistは[statedef ]につける設定値で通常はステートが変わると途切れるHitdefを引継ぎ持続させるかどうかを設定できます。指定しない場合は hitdefpersist = 0 となりステートが変わった時点でhitdefの効果がなくなります。


line
・AhojinGod 0.37.2 / キャラ紹介記事 Characters

リンクの保管庫からdownloadしてください cns 0.37.2
download sff 0.37.0

・fall.velocity = .35を削除。
・本体Hitdef時の動作を少し修正。
・1-4Pで1020ステートから出られなくなる不具合を修正。
・1-4Pでライフが減ったままになる状態を修正。
・1-8Pで勝利演出が固定になっていたのを修正。

1-4Pでずっとマケドニアを出したまま画面を動き続ける不具合を修正しました。

たまに八百長になっている気がする。
line
cnsとsffを分けました。アホジンとアホジン神のsffは共通です。
以前の様にフォルダの中に入ってないので適当なフォルダに入れてください。

・Ahojin 0.37.0 / キャラ紹介記事 Characters

リンクの保管庫からdownloadしてください cns 0.37.0
download sff 0.37.0

・画面幅の変数化。var(49)
・ワイド対応の修正。
・ワイド時にカットインをキャラクター位置に出す様に修正。
・ワイド時にツリーが出現する位置を前方に出すと相手の位置に出る様に修正。
・重力加速度の設定
fall.velocity = .35
fall.yvelocity = -4.5
yaccel = .35
・大ちゃんのアニメと軌道の修正。


・AhojinGod 0.37.0 / キャラ紹介記事 Characters

リンクの保管庫からdownloadしてください cns 0.37.0
download sff 0.37.0

・画面幅の変数化。var(49)
・ワイド対応の修正。
・ワイド時にカットインをキャラクター位置に出す様に修正。
・ワイド時にツリーが出現する位置を前方に出すと相手の位置に出る様に修正。
・重力加速度の設定
fall.velocity = .35
fall.yvelocity = -4.5
yaccell = .35
・大ちゃんのアニメと軌道の修正。
・sprpriorityの修正。
・1-4P時に高カラー用の状態変更が使われない様に修正。
・NUEFOが全部出ていなかったので修正。
・1-4P時にけいおん先生が出せなかった不具合を修正。

Cus-hina-sandbag 1.7 / キャラ紹介記事 Characters

リンクの保管庫からdownloadしてください 1.7

・カラー分けの準備。

 7-10Pにライフ管理を入れて1-6Pと分ける予定です。なのでダウンロードしなくても大丈夫です。


・予定
 前回の更新で見た目が変になっていた部分が直ったと思います。
フォルダを作ったのは元々同じsffを使っているのと共通ファイルとして使いたいので見やすくする為に変えました。


 今までは手抜きでアホジン神の1-4Pも高カラー用の判定をしていたのですが、カラー判定を入れた為動いてなかったりしたのが解消されました。そう言えば5-8Pは使った事がないけどどうなんでしょう。1-4Pは最初の頃に調整したのとアーマーなので硬さを戻して半分にしようかなと少し思っています。


・ワイドの確認

 Localcoord別にdefファイルを用意しておくと楽です。
本体も幾つか用意しておけばmugen.cfgを変更せずに起動するだけで済みます。
キャラクターは一カ所で管理した方が変更が楽です。
line

リンクの保管庫からdownloadしてください
・AhojinGod 0.36.8 download
/ キャラ紹介記事 Characters

・一定時間相手のライフが減らない場合にHitdefを使う様になりました。
・ライフが突然減った様に見えるのを修正。
・ワイド対応の修正、変数化。

 調整はしていませんが表示関係を全体的に変更したので更新しました。でも見た目は変わりません。
line
・GameWidth

 基本はワイド対応なので他の方法でも構いませんが、先ず別の項目を説明しておきます。
Hitdef(Projectile)には次の値を入れておきましょう。

fall.yvelocity = -4.5
yaccel = .35

 この2つは初期値がLocalcoordで変化してしまうのですが、4:3の初期値(上記)を入れておくと期待通りに動くので必ず全てに設定しておきましょう。勿論自分で決めた値でも構いません、とにかく設定してある事が重要です。詳しくはリンクの「気まぐれ猫(新MUGEN)」の方のブログを見て下さい。localcoordについては私の頁を見て下さい。

 さてでは画面の幅を取得するmugen1.0のトリガーの変わりです。-3,-2,-1ステートに入れておけばどこでも使えます。ただ、-1で使う事は多分無いと思いますが、通常はコマンド受け付けして-1ステートからChangeStateするので入れておかないと他のステートの開始時点で効果がありません。


 改良しました。
GameWidth = floor(screenpos x - pos x)*2

左端からの距離から中央からの距離を引いて画面の半分の距離を出して2倍にしています。
pos は浮動小数点を返すので一応floorしています。localcoord が奇数になっているキャラは ceilの方が良いかもしれません。


・単純なワイド対応
scale = 1*(var(49)/320.0),1*(var(49)/320.0)

 1が基準となる倍率です。小数点を含まない式にすると426/320は1になってしまいます。元々426用の幅で作ってあれば拡大する必要が無いので大丈夫です。使い方次第ですね。

 Ahojin1x4 のワイド対応は p1 と left で色々な方法でやっているのでこういう風にしたいみたいなのがあれば参考にしてください。leftでやっているのは主に挑発と勝利時の表示です。


・画面幅を取得する為にヘルパーを使う
 helpertype = normal のヘルパーを postype = right で出すとカメラは移動せずに画面端に出ます。この位置は pos x で言うと 画面中央から半分になり、screenpos x だと 画面幅(GameWidth)になるので parentvarset でプレイヤーに設定します。screenpos は画面左上基準なので右端は常に画面端となります。

;---------------------------------------------------------------------------
; state for Helper to get GameWidth.
;---------------------------------------------------------------------------
[statedef 4999]
anim = 4999; or 0

[state , set GameWidth in player variable]
type = parentvarset
trigger1 = time = 0
var(49) = ceil(screenpos x)

[state , DestroySelf]
type = DestroySelf
trigger1 = time = 0

[state , ChangeState for player]
type = ChangeState
trigger1 = !IsHelper
value = 0

;---------------------------------------------------------------------------
; States that are always executed (use statedef -2)
;---------------------------------------------------------------------------
[statedef -2]


[state -2, call helper to get GameWidth]
type = helper
trigger1 = var(49) = 0
type = normal
id = 4999
postype = right
pos = 0,0
stateno = 4999
supermovetime = 1
pausemovetime = 1

出したヘルパーは必要ありませんし1㍉でも動いたら値が変わってしまうので DestroySelf で消しておきましょう。

 縦幅は下端に出せないのとステージの高さも不定ですしヘルパーでは無理です。どうしてもやりたいならprojectile をゆっくり下に飛ばしてみましょう。縦に並べるとか。


・カットインをキャラクターの位置に表示する。
 ワイドを越えた画面に対応。
;facing = facing
postype = p1
pos = (var(49)>426)*floor(pos x*(pos x)/var(49)-abs(floor((pos x)/var(49)*320)))+(var(49)<=426)*floor(-pos x),120-floor(screenpos y)

 登録してある画像が左上揃え(left用)ではなくてキャラクター中心揃え(p1用)の場合です。
画面端に寄っても端っこで切れずに止まります。facingは反転させたくない場合に使ってください。
アホジンのcnsからvar(49)を検索すれば幾つも見つかると思うので参考にしてください。

 普通はleftにしてremovetimeとbindtimeを同じにして固定させます。横に伸ばさない場合はこんな感じで。
triggerall = facing = 1
trigger1 = Time = 0
facing = facing
postype = left
pos = (screenpos x>426/2)*floor(screenpos x-426/2),0

 右端から出す場合
triggerall = facing = -1
trigger1 = Time = 0
facing = facing
postype = right
pos = (screenpos x<var(49)-426/2)*floor(screenpos x+426/2-var(49)),0

 こうすると端固定ではなくキャラの位置に合わせた場所に出ます。この式は画像の大きさが426の場合で426を越えると画面より小さくなるので移動する様になります。
アホジンの中身が最新版で色々使い分けているので参考にしてみて下さい。
 背景を真っ黒にしたい様な場合はleft側だけでscaleを変更して画面の幅に拡大するだけで大丈夫です。キャラクターのカットインの場合は端っこから出すよりキャラの位置基準の方が良いと思いますが色々試してみてください。
 また、velを調整して移動させる方法もあります。画面外まで移動させたい場合はboundを設定しておけば画面外で勝手に消えます。


-------------------- おまけ --------------------


・stageのBound固定(15,15)の場合に幅計算で出せる式。


[state -2, GameWidth]
type = varset
trigger1 = RoundState > 0
trigger1 = var(49):=FrontEdgeDist+BackEdgeDist+31
trigger1 = var(49):=var(49)+(var(49)>320+1)*floor(1+(var(49)-320+31)/10)
var(49) = var(49)+(var(49)%10)*(1-2*(var(49)%10<5))
ignorehitpause = 1

 どうしてBoundが統一されていないのか。取得できない値が多い過ぎるすぎる・・・
line
・helpertype=normalとplayer
 最も簡単なヘルパーの出し方は次の通りです
[State ]
type = Helper
trigger1 = 1

 mugendocを見るとわかりますがHelperに必須パラメーターは無いので指定した場合の動作は様々です。
 上記だと最大数までノーマルヘルパーがプレイヤーの位置に出現します。何も指定していないのでプレイヤーと同じ動きをします。ヘルパーにはノーマルヘルパーとプレイヤーヘルパーがあります。違いは次の通りです。
・helpertype = normal
 基本的に画面外に出られる。keyctrl=0
・helpertype = player
 基本的には画面の中を動く。keyctrl=1。カメラがついてくる。[statedef -2]を読み込む。

 大体はこんな所です。デバッグ文字を見るとわかりますが勝手にキャラクターの名前がついています、しかしヘルパーのname部分はゲーム内で参照できないのでname="演出用ヘルパー"の様な判定は出来ません。nameはdefファイルの部分を参照するだけです。

 ノーマルヘルパーは出すとその場に止まります。
 プレイヤーヘルパーを自在に動かしたい場合はctrlをステート内や-2ステートで0にして個別に動かす必要があります。

 ヘルパーを消す時はエラー落ちしない様にExplodを消してから消しましょう。また、同じヘルパーをそのフレーム内で出したり消したりするとエラー落ちするので気をつけましょう。

 と言うわけで実際にはこんな感じになります。
[state , call helper]
type = Helper
trigger1 = !IsHelper
trigger1 = NumHelper(1600) = 0

helpertype = normal
name = "kfm"
id = 1600
pos = 0,0
postype = p1
facing = 1
stateno = 1600
keyctrl = 0
ownpal = 0
supermovetime = 0
pausemovetime = 0
size.xscale = 1
size.yscale = 1
size.ground.back = 15
size.ground.front = 16
size.air.back = 12
size.air.front = 12
size.height = 60
size.proj.doscale = 0
size.head.pos = -5,-90
size.mid.pos = -5,-90
size.shadowoffset = 0

 size関係はヘルパーの設定になるので最初はプレイヤーキャラの[data]部分と同じ値を入れておきましょう。
 state 1600は自分で作る必要があります。Hitdefで攻撃したり攻撃を食らうヘルパーの場合はhitoverrideをつけておいて食らいステートに移動させないとプレイヤーの食らいステートに移ってしまいます。

 必須項目はありませんが全部の値を指定しておくようにしましょう。
line
・書式
 注意しておく事と言えば全て小文字で書く事です。大文字はdocsで説明されている以外の部分を大文字にすると判別できません、よって全部大文字で書くとそんな単語は知らないよと言われてしまいます。特に、変数の代入でSysFVarをSysfVarにしてしまうと代入されずに素通りしてしまいます。単語のタイプミスが多い人はこう言った事態を防ぐために出来るだけ小文字で書く方が安全です。
 winmugenでは一行の文字数が256文字までと言う制限があるのでそれを越えてしまうと読み込み時にエラーになります。
 ;半角セミコロンから先はコメントです。注釈をかけます。
 表示上改行されている場所がありますが行の途中で改行は出来ません、改行するとその部分でその行は終わりになります。
 コメントだからと言って定義 [ ] がある行に日本語を使う場合は短めにするか避けましょう。

 今ここを見ている方は必要な知識が足りないと思います。リンクの mugendocs を開いて読んでください。
全てを読んでおかないとらゆる場所で引っかかります。
 mugenwiki は winmugen つまりベータ版の時の情報なので古いのと間違いがそこそこあるので差分部分以外は特に読まないでください。

・ステート定義
mugendocsCNS Formatを読みましょう。

 ステートの定義は [statedef ステート番号] です。
[statedef 1000]

[state ]
type = null
trigger1 = 0

 最低限だとこれだけあれば大丈夫ですが普通は[statedef ]にもっと指定します。

[statedef 1000]
type = S
movetype= A
physics = S
velset = 0,0
anim = 1000

ctrl = 0
poweradd = 0
juggle = 4
facep2 = 0
hitdefpersist = 0
movehitpersist = 0
hitcountpersist = 0
sprpriority = 1

[state ]
type = null
trigger1 = 0

 ここからデフォルト値で良くて使わない物を除くと

[statedef 1000]
type = S
movetype= A
physics = S
velset = 0,0
anim = 1000

ctrl = 0
poweradd = 0
juggle = 4
sprpriority = 1

[state ]
type = null
trigger1 = 0

 これで問題ありません。sprpriorityは通常は1です。


・ステートコントローラー
 普通はこんな感じだと思います。
[state SAMSARA]
type=varset
trigger1=!IsHelper
trigger1=Time=0
var(20)=1

 若しくは
[state 1100, usecount]
type = varset
trigger1 = !IsHelper
trigger1 = Time = 0
var(20) = 1

 ここで、タブを4文字にして次の様にすると綺麗になります。
[state 1100, 使用回数を1にする]
type        = varset
trigger1    = !IsHelper
trigger1    = Time = 0
var(20)     = 1

 しかしもっと長い文字列もあるので合わせるとしたら次の位置でしょうか。
[state 1100, 投擲 必須不足]
type            = Projectile
trigger1        = NumProjID(1100) = 0
trigger1        = Time = 0
projid          = 1100
projsprpriority = 3                     ;通常の位置

 個人の主観に依るでしょうが、後で見やすい方が良いと思います。

・persistent と ignorehitpause
persistent と ignorehitpause は全てのステートコントローラーに対して指定できます。ignorehitpauseは初期値が0で、ignorehitpause=1にするとhitpause中でも有効になります。persistentは初期値が1で、persistent=0だとそのステートに居る間は一回しか実行されません。persistentは初期値が1になっていますが、hitpause中に[statedef -2]でChangeStateしたステートには[statedef -2]で再度ChangeStateできません。但し、persistent=2やpersistent=3の場合は動作が異なります。

・トリガー
 これと
trigger1 = NumProjID(1100) = 0 && Time = 0 && Random < 30 || NumProjID(1100) = 0 && Time = 12 && Random < 50

 これは同じです
trigger1        = NumProjID(1100) = 0
trigger1        = Time = 0
trigger1        = Random < 30
trigger2        = NumProjID(1100) = 0
trigger2        = Time = 12
trigger2        = Random < 50

 この場合は同じ部分があるのでtriggerallで纏められます
triggerall      = NumProjID(1100) = 0
trigger1        = Time = 0
trigger1        = Random < 30
trigger2        = Time = 12
trigger2        = Random < 50

 こういう書き方も出来ます。
trigger1 = NumProjID(1100) = 0 && (Time = 0 && Random < 30 || Time = 12 && Random < 50)

 左から読むので上記の4種類のトリガーは全て同じになります。
但し一行の文字制限が256文字なので、それを越えない様に注意する必要があります。
一行で書いた方が処理としては少なくなります。

・注意点
 MUGEN1.0以降では、trigger1の順番が滅茶苦茶でも実行されますが、上から順に実行されます。数字の順番にはならないので今まで通りに書きましょう。

triggerall = 0
triggerall = 1
trigger1 = 1
trigger1 = 1
trigger2 = 2
trigger2 = 2
trigger3 = 3
trigger4 = 4


・式
var(9)=var(9)+1
var(9) = var(9)+1
var(9) = var(9) + 1
var(9)                  = var(9)+1
var(9)                  = var(9) + 1

 条件式も入れられます。計算順序の都合で括弧で括る必要があり、結果は1か0です(真か偽)。
var(9) = var(9) + 10*(var(20) = 1 && Time = 0)

(var(20) = 1 && Time = 0)が1か0になります。
特に意味のある式ではないので気にしないでください。

 浮動小数点になるpos系の値を使った場合はfloor(切捨て),ceil(切り上げ)するのを忘れない様にしましょう。
var(9) = floor(pos x) + 30 + floor(Time*2.5)
var(9) = floor(pos x + 30 + Time*2.5)
var(9) = pos x + 30 + Time*2.5                ;これだとエラーになる。

 エラーになる場合でもvarに入れる場合はexpression truncatedと表示されて小数点以下が切り取られるだけですが、var以外のoffset等の設定値に入れる場合はそのステートコントローラーを実行した際にエラーのダイアログボックス表示が出てMUGENが落ちます。
 floorで切り捨て、か又はceilで切り上げは忘れずに。


・コメント
 半角セミコロンから右は説明書きになり、行末まで有効です。行の途中からでもコメントになります。

line

リンクの保管庫からdownloadしてください・AhojinGod 0.36.6 download
/ キャラ紹介記事 Introduction

・状態変更の不具合を修正。

 後で変更する予定ですがHitdefの不具合を見つけたので取りあえず修正しました、調整はその時にでも。
今回から上の顔アイコンにダウンロードリンクを追加しました。
line
3キャラ更新(カス雛さんの修正)

・アホジンゴッドに追加した勝利演出の「けお!」がいつの間にか無くなっていたので修正しました。
・カス雛さんの修正をしました。

他の部分は変更なしです。

Ahojin0.35.0
・「けお!」のアニメの移動。
・カス雛さんの修正。

AhojinGod0.36.4
・「けお!」が消えていたので修正。
・カス雛さんの修正。

Cus-hina-sandbag1.6
・ヘルパーの動作を修正


操作とかはキャラ紹介記事や付属のtxtを見て下さい。

line
AhojinGod 0.36.2 状態変更の不具合を修正。

・AhojinGod アホジンゴッド 0.36.2
 nicovideo.jp/mylist

・状態変更の不具合を修正。
・Hitdef関連の修正。
・Proj制限の修正

 全体的に修正しました。
line
AhojinGod 0.36.0 Hitdefが全然出ていない不具合を修正

・AhojinGod アホジンゴッド 0.36.0
 nicovideo.jp/mylist

・本体Hitdefが全然出ていなかったので修正。
・本体Hitdefになっていなかった部分を修正。
・動かなくなる不具合を修正。

 いつからかHitdefの効果が薄くなった感じはしていたのですが、全然出ていなかった事が判明したので修正しました。但し、まだちゃんと動かしている訳ではないのでたまに止まったりします。
line
AhojinGod 0.35.8 全体的に調整しました

・AhojinGod アホジンゴッド 0.35.8
 nicovideo.jp/mylist

・本体Hitdefの調整。
・Proj制限の調整。

本体Hitdefの調整とスポンジ状態だと表示が減ってしまうので見た目を保てるように修正しました。
多分誰も気にならないと思いますがHitdefの方で判定が上手くいかない事がまだ少しあるので修正予定です。
今まで使わなかった場合でも条件次第で使う様にしたのですが、アップしたのはなっていないみたいです。


どうなっているんですけお・・
line
計算

計算順序
 四則演算は+-*/です。剰余は%です。**がべき乗です。
左側から計算していきます。%*/を計算した後に+-の計算が行われます。
特に気をつける事は無いと思いますが剰余と他の演算子を繋げる場合は括弧で括った方が後々安全です。
var(9) = (Random%10)*10


整数と小数
 1割る2をすると幾つになるでしょうか?
var(9) = 1/2 - 1
この式の結果は-1になります。

何故かと言うとどこにも小数が使われていないので整数で計算されるからです。
小数の結果を出したい場合は小数を含む計算にしないといけません。

この場合だと1/2=0.5にしたい時もあるので次の様にします。
fvar(9) = 1.0/2 - 1
fvar(9) = 1/2.0 - 1

変な値になっていないかDisplayToClipBoardで確認しましょう。


ビット演算
 & | ^の3つがビット演算です。ビット演算は特殊で2進数同士の論理和等を求めると言うのが計算の仕組みです。浮動小数点(fvar)には使えません。mugendocsCNS Formatに書いてありますのでちゃんと読みましょう。そこら中で書いてるし読んでるよね・・・

 | は論理和,ORを求めます。どちらか一方にある部分を取り出します。
 & は論理積,ANDを求めます。2つの値の共通部分を取り出します。
 ^ は排他的論理和,XORです。どちらかに無い部分(共通しない部分)を取り出します(1にします)。
 ~ は否定,NOTです。0は1に、1は0になります。
NOTはWikiに説明が書いてありますが、何故かMUGEN1.0でも登録されていないので使えません!何コレー

変数に値を詰め込みたい場合は良いと思います。これとは別に桁数毎に入れる方法もあります。
但し、2進数がわからないと実際に使えないので検索して勉強しましょう。

 ちなみに計算順序が条件判定 = や != 、その他の計算よりも後になるので、実際に使う場合は括弧で括らないと期待した順番で計算されないことがあります。式の書き換えでバグになる可能性もあるので、ビット演算以外の計算が混じる場合は条件判定が無くても出来るだけ括弧で括っておきましょう。

論理和を取るので代入するだけであれば trigger1 = 1 で構いませんが、普通の計算風に書くと
(代入ではない式だったので直しました)
[state , varset &1]
type = varset
trigger1 = (var(59) & 1) = 0    ;
1bit目に値が入っていない場合
var(59) = var(59) | 1

和と言ってもどちらかのビットに 1 があったら 1 になると言うだけなので trigger1 = 1 の場合でも 1 + 1 = 2 の様にはなりません。
また、積は 1 と 1 の場合にだけ 1 になりそれ以外は 0 になる、つまり共通点を出すと言う事になります。


逆にビットを消したい場合は

[state , varset ~1]
type = varset
trigger1 = 1
var(59) = var(59) & (~1)                ;
これはNOTなので使えません
var(59) = var(59) & (2147483648 - 1)    ;1を消したい場合。
var(59) = var(59) & floor(2.0**31 - 1)  ;1を消したい場合。上と比べると無駄な計算になりますが浮動小数点で行いましょう。浮動小数点のまま-1してからfloorしないとmugen1.0でINT_MAXエラーが出ます。

こうすると1ビット目、つまり1が入っている場合になくなります。
別の見方で言うと奇数の場合に偶数になります。

この式は否定した値との論理積を取っているので trigger1 = var(59)&1 != 0 等の条件式は不要です。但し正と負のビット演算の場合は結果がわかりづらいので最初からabs()を使って符号を揃えると良いと思います。

 此の様に、ビット演算にするとtrigger1で値が入っているかを判断する必要はありません。

 注意点はこんな所です。XOR の使い方を調べると簡単に色々出来る事がわかると思います。1,4,16,32 と数字で指定する方が高速ですがビットの位置を変更したい場合にたまに困ります。

計算出来ない
 一行の文字数が256文字になると行末を認識できなくなってその行は基本的に読み込みでエラーになります。
MUGEN1.0では文字数制限が変わったのでもっと長い式でも大丈夫ですが互換性が無くなります。
 小数の結果が欲しいのに整数で計算をしている場合も値が合わなくなると思います。
 0で割っている、浮動小数点で剰余を求めようとしている、主に変数で除算をした場合になります。

0除算は回避方法があります、変数が0の時は計算をしないか別の計算式を使うと回避できます。

[state , zero divide]
type = varset
trigger1 = var(9) = 0
fvar(8) = 0

[state , none zero divide]
type = varset
trigger1 = var(9) != 0
fvar(8) = 1.0/var(9)

代入式 := を使うと

[state , none zero divide or skip zero divide]
type = varset
trigger1 = fvar(8):=0 || var(9) != 0
fvar(8) = 1.0/var(9)


これとは別に代入式に条件式を使う事で一行で書けます。

[state , alternative]
type = varset
trigger1 = 1
fvar(8) = (var(9)=0)*0 + (var(9)!=0)*(1.0/var(9))

後者の選択式の方は一行で幾つも書けてステートコントローラーも一個で済みます。
但しその分長くなるのでバグが増えそうなのとWinMUGENでは一行は256文字までなので気をつけましょう。


べき乗の計算 (**)
 べき乗の計算は結果がずれるようなのであまりお勧めできません、と言いたい所ですが実は方法があります。
アホジンゴッドのcnsを覗くと普通にべき乗を使っています。しかし注意する点が一つだけあります、
それは何かというと浮動小数点で計算を"させる"と言う事です。
 浮動小数点自体にも限界はありますが、整数のべき乗を求めたい場合には問題が起きません。
最大値は次の値です。
var(9) = floor(2.0**31)-1

2.0**31をそのままvar(9)に入れると浮動小数点から整数に変換する都合で-2**31になります、
なのでfloorを使ってから-1しています。floor(2.0**31)は最大値ですが計算している都合でそのまま入れると同様に値が変換されてマイナスになる事があります。この様に、正確に扱わないと途中で値が変になる可能性があるのでDisplayToClipBoardで確認してから使いましょう。

但し浮動小数点は8桁になる辺りから値を正確に表せなくなり誤差が出始めるので
結果を浮動小数点で求めたい場合はこの限りではありません。

でも、計算しないで値を直接書いた方が安心の様な気がしますね


デバッグでエラー文字列が出続ける (EXPRESSION TRANCATED)
 varに小数の結果を入れようとしている場合。但し動作はします。posへの代入は整数ですがposはvelを扱う都合で小数なのでpos x, pos yは小数を返す場合があります。因ってfloorしないといけません。
var(9) = floor(pos x)
pos = floor(enemynear, pos x), floor(enemynear, pos x)

特別な理由がなければ pos と書いたら直ぐに floor で囲みましょう。


式を短くしたい
 まずは図(グラフ)を書いて数式にしてみましょう、直線なら簡単です。しかし直線でも曲線でもない様な物は見た時の分かり易さを考えると値を1個ずつ=等号で判定した方が良さそうです。変な形をしていても規則性があれば式にする事は出来ると思います。

line
line

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