ページ 1 / 1
箱型のポリゴンの反射
Posted: 2009年7月09日(木) 15:52
by LUNA
月曜日に出された勉強会の宿題で箱型のポリゴンの当たり判定を作れといわれ、作ってみたのですが、隅の当たり判定がおかしく、提出したら先生に「おまえプログラマーにすら向いていない」と勉強会のクビを宣言されてしまいました。
直そうとはしてみたのですが正直、四辺それぞれの当たり判定をどう考えればいいのか混乱してきてしまいます。だれかヒントをください。
プログラムの内容は
・正方形のポリゴンが2つある。
・ひとつは自分で操作でき、もうひとつは勝手に移動する。
・勝手に移動するポリゴンのほうは画面隅もしく自分の操作するポリゴンに接触すると反射する。
です。
先生から届いたメールには、
「すり抜けることが時々あるみたいですが・・・
これで、「完成」と言えるのでしょうか?
このソースを自信を持って「完成」と言うのであれば、あなたはプログラマーに向いていません。
ゲームプログラマーは細かいバグですら許されません。
私の個人的な意見ですが、プログラムを見る限り、プログラミングのセンスを感じません。
まずは自分が記述したプログラムの意味をしっかり理解してください。
プログラムの意味を理解していれば、次のようなコードは記述しないと思います。
if(Blockswitch==false){
Block.center.x += 3;
}else if(Blockswitch==true){
Block.center.x -= 3;
}
このままではゲームプログラマーどころか、プログラマーさえなれないと思います。」
と、書かれていました。やっぱりプログラムは頭のいい人間にしか触れない高貴なものなんですかね・・・
自分に対する自身が無くなってきました・・・
Re:箱型のポリゴンの反射
Posted: 2009年7月09日(木) 15:53
by LUNA
すみません書き忘れました
「このプログラムはDirectXを使用しています。」
Re:箱型のポリゴンの反射
Posted: 2009年7月09日(木) 16:29
by dic
物理的計算は3Dなんで私にはわかりませんのでなんとも言えないですが
先生のセンスとは何なのか考える必要があると思いますのですが、私が言えることといえば
ハンガリアン記法を利用するという手があります
http://ja.wikipedia.org/wiki/%E3%83%8F% ... 8%E6%B3%95
変数に規則性がなかったので、読みにくかったです
次に
LPDIRECT3DDEVICE9 d = g_pd3ddev; // 変数名を簡略化
とありますが、これは片方の参照が無効になった場合、残りの片方はまだ、その無効になった
領域を指してるというバグの温室になりやすいです
次に
void InitTLVer(POBJ2D obj)
void SetTLVerPos(POBJ2D obj)
void SetTLVerColor(LPTLVERTEX v , D3DCOLOR c, int point)
の関数に関してですが、ポインタを渡してないので、コピーをただ上書きしてるだけです
動いているとしたら、たまたまだと思われます
私も専門学校に行きプログラムの勉強をしてましたが、同じことを言われました
しかし、卒業後も独学にて、ゆっくりではありますが製作しています
というより、これ以上、その先生からは何も得られなかったので学校に行きませんでしたがw
先生を変えるという手段も LUNAさんにはあるので、自分に合った先生を選ばれることを
した方がいいです
すり抜けるという現象は
http://www.play21.jp/board/formz.cgi?ac ... &rln=36294
を参考にされるといいです
Re:箱型のポリゴンの反射
Posted: 2009年7月09日(木) 16:48
by ねこ
とりあえず言葉の解釈としては
<すり抜けることが時々あるみたいですが・・・ これで、「完成」と言えるのでしょうか?
<ゲームプログラマーは細かいバグですら許されません。
これに対して
<このソースを自信を持って「完成」と言うのであれば、あなたはプログラマーに向いていません。
こういう言葉を発してるわけですが
向いてるかどうかはおいといて、バグを残したまま完成とするのはまず許されません。
この場合の「プログラマー」を会社等に勤めて居る人として解釈するなら
バグの起こるプログラムをお客様に提出する事になります。
お客様は何百万というお金を払ってプログラムを求められるわけなので
それだけ大金を払って動かない・よく落ちるプログラムを渡されたら、その時点で信頼を失います。
ゲームだって、7,8000円出して買ったゲームソフトが頻繁にフリーズなんてしたらその会社の製品を次に買う気起こらないでしょう?
そういう意味で、バグってのはプログラマにとって潰しきらなくてはならない怨敵なのです。
それを残したまま「完成!」と言ってしまえばきつい言葉を頂いても仕方ないです。
ただ直らない事でもないしもうちょっと言葉選べよ、とは思いますねw
<やっぱりプログラムは頭のいい人間にしか触れない高貴なものなんですかね・・・
これ言うときっともっと怒られますよw
プログラムは言語の基礎からアルゴリズム、システム設計と様々な要素の集合体です。
そんな簡単に扱えるもんでもないですし、多くのプログラマは相応の努力を「年単位」で積んでいます。
「頭のいい人間」ってのは「それだけの努力をした人」なのであって、人より基礎能力が優れてるわけではありません。
Re:箱型のポリゴンの反射
Posted: 2009年7月09日(木) 16:51
by 御津凪
私からはひとまずメールの文面に記載されているソースについて言及します。
真偽値はご存知ですか?
true(真)と false(偽)しかない型に対し、ソースに書かれているような双方の条件を書くのは無意味です。
このコードでも動作はしますが、大体のプログラマは(構文・型などの意味を理解していれば)この文を、
if(!Blockswitch){
Block.center.x += 3;
}else{
Block.center.x -= 3;
}
のようにするか、あるいは、
Block.center.x -= Blockswitch ? 3 : -3;
と書きます。
そのほうが見た目にもすっきりします。
先生は、
> 私の個人的な意見ですが、プログラムを見る限り、プログラミングのセンスを感じません。
は、このような実行上(と見た目に)無意味なコードがあることと、
読みやすさについて言っていると考えられます。
もちろん、「私の個人的な意見」と書いているので、気にしない方がいるということも覚えておいてください。
(一般的にはより見やすいほうが相手から好感が持てます)
それと、この発言はインデントについても考慮しているかもしれません。
(インデントがところどころおかしいので)
Re:箱型のポリゴンの反射
Posted: 2009年7月09日(木) 17:08
by TRUTH
はじめましてー初カキコだったりもしますw
独学ではありますが、プログラミングの勉強をしています。
まだ未熟者ですが、最近プログラミングとは何かというのが少しずつ分かってきた気がしています。
こんな自分ですので技術的なアドバイスはできませんが・・・
気になったことを少々・・・
その先生の「プログラミングのセンス」とは、たぶん
if(条件)
//真
else
//偽
なのだから
if(Blockswitch)
Block.center.x -= 3;
else
Block.center.x += 3;
にすること、これが「プログラミングのセンス」だと言っている様に聞こえます。
個人的な意見ですが、このような部分でプログラミングのセンス?を問われるとは思っていません。
自分も似たような感じの分かりにくい書き方をした経験があります。
でも、他の人のコードなどを読んでいくうちに、「こっちの書き方の方が綺麗で理解しやすい」という風にマネを重ねて
徐々に綺麗に見えるようなコードを書けるよう努力しているつもりです。
いろいろな方が仰るように・・・コードを読んで、書いて、理解して
これを積み重ねが、その人の知的財産となっていき、プログラムが書けるようになるんだと思います。
ですから、頭の良い悪い・センスあるなしではないと思います。
その先生の仰ったことを気にせず、どんどんコードを読んで・書いて・理解していけばいいのではないでしょうか?
学ぶとはマネる事もいいますので、いろんな方のいい部分をマネて自分の物にしていくのが近道だと思いますよ
Re:箱型のポリゴンの反射
Posted: 2009年7月09日(木) 17:15
by Mist
> (インデントがところどころおかしいので)
インデントがおかしいのはここの掲示板の仕様だと思いますよ。
ここの掲示板タブ幅が8なんですよね。
テキストエディタで、タブ幅4にして表示するときれいに表示されます。
LUNAさんの環境もタブ幅4なんじゃないでしょうか。
Re:箱型のポリゴンの反射
Posted: 2009年7月09日(木) 17:56
by LUNA
皆さん色々なご意見ありがとうございます。
同じプログラムを組み、きれいに動いた人の話を利いたところ、
D3DXVECTOR2 で変数を指定し、 DirectX の標準関数 atan2を使用した計算法を使えばいいと聞きました。
ちょっと図解しないとわかりにくい方法なんで詳しい記述を省きますが、一度その方法で試してみようと思います。
>先生を変えるという手段も LUNAさんにはあるので、自分に合った先生を選ばれることを
した方がいいです
についてですが、ちょっとそれはムリですねww(この勉強会はその先生しかいない的な意味で)
>次に
LPDIRECT3DDEVICE9 d = g_pd3ddev; // 変数名を簡略化
とありますが、これは片方の参照が無効になった場合、残りの片方はまだ、その無効になった
領域を指してるというバグの温室になりやすいです
次に
void InitTLVer(POBJ2D obj)
void SetTLVerPos(POBJ2D obj)
void SetTLVerColor(LPTLVERTEX v , D3DCOLOR c, int point)
の関数に関してですが、ポインタを渡してないので、コピーをただ上書きしてるだけです
動いているとしたら、たまたまだと思われます
その部分についてはもともとこのプログラム自身先生がある程度作ったものを加工して提出しろというものでしたから私にはよくわかりませんでした。
私がいじった部分が
void GameUpdate()
の関数のさらに一部分だけでしたし。
Re:箱型のポリゴンの反射
Posted: 2009年7月09日(木) 19:51
by LUNA
ちょっと当たり判定の方法を変えてみました
それぞれのポリゴンの中心の基点に当たっている間角度を求めてその角度によって反射方向を調整するというものです。が、なぜか反射がおかしく、(何度見直しても反射条件に不審な点がない)コンソールを起動して角度を確認してもおかしな点が見当たりません。
正直完全に詰んでしまったので誰かヒントをくださいお願いします。
Re:箱型のポリゴンの反射
Posted: 2009年7月09日(木) 20:38
by ねこ
(a>= -45)これが(a<= -45)なんじゃない?
Re:箱型のポリゴンの反射
Posted: 2009年7月10日(金) 10:09
by LUNA
> (a>= -45)これが(a<= -45)なんじゃない?
この修正で右の辺の当たり判定はしっかりしましたが、残りの3辺の当たり判定がおかしいです・・・
なぜか直しても直しても左右のどちらかの辺しかまともな動作をしてくれません・・・
Re:箱型のポリゴンの反射
Posted: 2009年7月10日(金) 10:30
by ねこ
あ~僕もすっかり見落としてたわ。
「比較はaじゃなくてrad」
ついでにいうとradはラジアン値の事なので変数名としてはdeg(度)が分かりやすいかも。
Re:箱型のポリゴンの反射
Posted: 2009年7月10日(金) 14:51
by LUNA
うほっ!
本当だ・・・
radじゃなくaで比較してたからダメだったのか・・・・
本当にダメだな俺・・・
昨日の夜を無駄にしてしまった・・・・
ともかく ねこ さん 指摘ありがとうございます。