ページ 11

absについて

Posted: 2010年4月03日(土) 09:39
by wing
ネットで当たり判定を検索していたら、if文の中に
abs(ch.y > *Y - CHIP_SIZE/2 - 16.0f)
というのがありました。
ch.h, *Y, CHIP_SIZEは自分のゲームにあわせてあります。

absは初めてだったのでネットで調べました。
分からないのは、ch.y > *Yです。 足し算や引き算なら分かるのですが、
ch.y > *Y のような不等号が入っていることです。

そのまま使っているんですが、うまく動いています。

どなたか解説をお願いします。
VC2008EEを使っています。

Re:absについて

Posted: 2010年4月03日(土) 10:23
by Ma
私の結論から言うと、absを使う理由が分からないです・・・。
私よりもっと詳しい人の見解がほしいですね。

あと、Yの型がなにかおしえてください。
もしくは、そのサイトへのリンクがほしいところです。


以下、私の分析。

比較演算子のほうが加法演算子より優先度が低いので、
abs 関数の中身は

ch.y > (*Y - CHIP_SIZE/2 - 16.0f)

こうなるかと思います。

で、Y は、なんらかの値のポインタだとすれば、
比較演算子の結果は、0 か 1 になるはずです。


それを、
abs関数の引数に渡しても
0 か 1 になるだけなので、何もかわりません。

最後にif文に渡して、条件分岐。

Re:absについて

Posted: 2010年4月03日(土) 11:41
by wing
>Maさん、ありがとうございます。

元のコードですが、掲示板が閉鎖されているので許可は取ってありませんが、
もともとオープンにされているのでたぶん大丈夫だと思いますので。
lift3=($Mychar.y>y && $Mychar.vy<0 &&
  abs($Mychar.x-x)<blockwidth-7 && abs($Mychar.y-y)<blockheight);
  
  lift4=(abs($Mychar.x-x)<blockwidth-7 && $Mychar.y<y &&
  abs($Mychar.y>y-blockheight/2-16) && $Mychar.vy>=0);

..........
  if(lift3==TRUE){   //自機の上にリフトがある場合
    $Mychar.vy=0;
    $Mychar.y=y+blockheight;
  }  
  
  if(lift4==TRUE){   //自機の下にリフトがある場合
    $Mychar.y=y-blockheight/2-16;
    $Mychar.jmp=0;
    $Mychar.vy =0;
キャラとリフトの当たり判定です。*YはリフトのY座標です。
どちらも画像の中心の座標です。
プログラムが思ったとおりに動いているので疑っていなかったんですが、
lift3とlift4をよく見比べていたら、もしかしたら間違っているんじゃないかと思って、

abs(ch.y > *Y - CHIP_SIZE/2 - 16.0f)を
abs(ch.y - *Y) < CHIP_SIZE としたところ、やはり同じようにうまく動きました。

absを良く知らないので、さっきまでは、不等号があってもいいのかなと思っていたんですが、
絶対値を求めているわけですから、やはり間違いなのでしょうか。
(今までは、作者の高度なテクニックだと思っていたんですが)

Re:absについて

Posted: 2010年4月03日(土) 11:46
by たかぎ
言語不明なので何ともいえません。

C++であれば、ch.y、Y、CHIP_SIZEのそれぞれの型によって、どう振る舞うかは変わってきます。
absも各演算子も多重定義されているかもしれず、これだけの情報では何もわかりません。

Re:absについて

Posted: 2010年4月03日(土) 11:49
by たかぎ
> もともとオープンにされているのでたぶん大丈夫だと思いますので。

それはとんでもない誤解です。
まあ、今回は引用の範囲なので大丈夫だとは思います。

Re:absについて

Posted: 2010年4月03日(土) 12:24
by wing
>たかぎ様、ありがとうございます。
著作権のことは考えたんですが、商用でもないし、ごく一部なので
作者様もおおめに見てもらえるかと思いました。
今後は気をつけます。

たかぎさんのニュアンスでは、absに不等号が含まれることもある、と
解釈させていただきます。

正しいコードであることが分かればいいのです。
あとは解釈できないだけですから、じっくり考えてみたいと思います。

元のコードはPythonだと思われます。
私は、独学で、龍神録の館でプログラムを勉強し、それが分かる程度です。
VC2008EE, DXライブラリで趣味でゲームを作っています。

Re:absについて

Posted: 2010年4月03日(土) 12:32
by Ma
$ってことは、、、たぶんPerlの話だったんですね…。
Perl についてはあまり詳しくないので、間違った発言するかもしれません。

>*YはリフトのY座標です。

最初にかいたように
(>あと、Yの型がなにかおしえてください。 )
それが何を意味するのか聞いたのではなく、『型』を聞いいていたんです。
ソース見てみるとYにあたるblockheightはint型の数値かな?


ソースを見たところ、最初の質問内容と類似しているのは
abs($Mychar.y>y-blockheight/2-16)
ここでしょうかね。
ここのことを聞いていると解釈しますが、正しいでしょうか?


とりあえず、absはずして本来の動作をするかどうかチェックしてもらえますか?
なんとなくですけど、それでも動作しそうな気がする…。


それでも大丈夫だったなら、そのページの著者のミスの可能性もありますね。

Re:absについて

Posted: 2010年4月03日(土) 12:44
by たかぎ
> たかぎさんのニュアンスでは、absに不等号が含まれることもある、と
> 解釈させていただきます。

そういうことではありません。

> 元のコードはPythonだと思われます。

多分違いますね。

> $ってことは、、、たぶんPerlの話だったんですね…。

私はパッと見、PHPかと思いました。

Re:absについて

Posted: 2010年4月03日(土) 13:05
by たいちう
ググって見たところ、言語は「Tonyu System」というものではないかと思われる。
http://ja.wikipedia.org/wiki/Tonyu_System

で、ここからダウンロードできるEvent.tonyuというファイルのようだ。
http://www.tonyu-arpg.com/tonyu_sample/8-1.html

この言語のことは全く知らないけれど、間違いでしょう。
サイトの管理者に問い合わせてはどうでしょうか。
2年ほど更新のないサイトみたいですが。

Re:absについて

Posted: 2010年4月03日(土) 13:11
by wing
>Maさん、どうもありがとうございます。
Perlでしたか。Pythonなどといい加減なこと書いてすいませんでした。

*X,*Yは222とか198とかの値が入っているので、たぶんint型だと思います。

abs($Mychar.y>y-blockheight/2-16) このコードのことです。
if(abs(ch.x-*X) < CHIP_SIZE - 7.0f && ch.y < *Y &&
  /*abs*/(ch.y > *Y - CHIP_SIZE/2 - 16.0f) && ch.vy >= 0.0f){
  ch.y = *Y - CHIP_SIZE/2 - 16.0f;
自分なりに使えるようにしたコードですが、absをコメントアウトしても
同じに動きます。
私は、ch.y も *Yも floatを使っています。
(画像の中心を座標にするためDrawRotaGraphFを使っているので)

Re:absについて

Posted: 2010年4月03日(土) 13:17
by imoinu
こんにちは、いつもは見ているだけなのですが、気になったので、書き込みします。

>abs($Mychar.y>y-blockheight/2-16)
これが書いてあるサンプルをダウンロードしていました。
これ、TonyuSystemという、ゲーム作成ツールで使用できる、リフトの移動を記述したスクリプトです。
下のサイトの、サンプルプログラムのその他のリフトの項目にありました。

http://www.tonyu-arpg.com/

Re:absについて

Posted: 2010年4月03日(土) 13:33
by wing
>たいちう様、ありがとうございます。
サイトはそのとうりです。

マリオ風ゲームを作っていて、そのサイトを参考にリフトを
実装できたんですが、このことだけがずっと気になっていました。

ネットでプログラムを勉強しているので、書いてあることはすべて
疑うことはありませんでした。
エラーもでなかったので、
あのコードになにか特別な意味があるのかと思ってそのまま使っていました。

でもよく考えると、キャラとリフトの上下左右の当たり判定ですから、
そっくりそのまま引用しなくてもそれほど難しいものではありませんね。

私もあそこは間違っていると判断し、自分なりに書き直してみます。

Re:absについて

Posted: 2010年4月03日(土) 13:53
by wing
>imoinuさん、ありがとうございます。
imoinuさんも見ていましたか。
サイトは、おっしゃるとおり
アクションゲーム・アクションRPG ゲームプログラム制作解説、です。

C,C++だけではサンプルがほとんど見つからないので他の言語も
参考にしました。(意外と読めました)

参考にしたファイルは、Tonyu Systemをダウンロードして
リフト1のページでサンプルをダウンロードして、
Tonyuを起動してサンプルを読み込まなければならないので、
たいへんなのであえてリンクを書きませんでした。

それでもずばりサイトを当てるとはおそれいりました。

Re:absについて

Posted: 2010年4月03日(土) 13:53
by たかぎ
> 私もあそこは間違っていると判断し、自分なりに書き直してみます。

多分間違いでしょうね。

私は最初、ベクトルや複素数の計算であれば、absが意味を成す可能性もあるので、型や多重定義の状況がわからないと判断がつかないと指摘したわけです。
当たり判定とのことなので、複素数はないと思いますが、ベクトルなら十分考えられますので。

Re:absについて

Posted: 2010年4月03日(土) 14:23
by wing
>たかぎ様

>多分間違いでしょうね。

たかぎさんにそう言っていただけるとありがたいです。
ありがとうございました。

Re:absについて

Posted: 2010年4月03日(土) 15:43
by たいちう
> >たいちう様、ありがとうございます。
> サイトはそのとうりです。

最初から書きましょうよ。その方が話が早いし。


> ネットでプログラムを勉強しているので、書いてあることはすべて
> 疑うことはありませんでした。

その言葉どおりだとすると、ネットを使う姿勢として非常に問題があります。
書いてあることに真実が含まれることもある、程度に思ってください。

Re:absについて

Posted: 2010年4月03日(土) 16:07
by たかぎ
> > ネットでプログラムを勉強しているので、書いてあることはすべて
> > 疑うことはありませんでした。
>
> その言葉どおりだとすると、ネットを使う姿勢として非常に問題があります。
> 書いてあることに真実が含まれることもある、程度に思ってください。

ネットに限らず、世の中のあらゆる情報は必ずしも真実とは限りません。
特にテレビは嘘だらけですので要注意です。新聞も然りです。
必ず複数の情報をまったく別のルートから入手し、比較検証する姿勢が大切であるとともに、可能な限り一次情報を調べることが大切です。

今回の場合は、その一次情報にあたっているわけですが、それ自体が間違っていることもあるわけです。
物事の真贋を見分ける目を養う必要があるでしょうね。

Re:absについて

Posted: 2010年4月03日(土) 21:25
by wing
皆さん、ありがとうございました。
ずっと気になっていたことが解決しました。