Profile

アメリ

Author:アメリ
キャラ紹介

line
カテゴリ
AIR (1)
Pos (1)
Var (1)
FAQ (1)
line
不許カウンター
line
最新記事
line
最新コメント
line
最新トラックバック
line
月別アーカイブ
line
sub_line
カレンダー
04 | 2017/05 | 06
- 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
計算

計算順序
 四則演算は+-*/です。剰余は%です。**がべき乗です。
左側から計算していきます。%*/を計算した後に+-の計算が行われます。
特に気をつける事は無いと思いますが剰余と他の演算子を繋げる場合は括弧で括った方が後々安全です。
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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。