スポンサーサイト

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

ゲーム制作状況 - 2013/09/28版 -

今日の報告!

パズルゲームの回転処理の部分を修正中。

で、思ったんですが、この回転処理について
解説されているサイトって意外と無いですね。

まぁ、あるにはあったんですが、全部テトリス方式。
つまり回転操作をした瞬間、一瞬で回転後の状態になる。

【参考画像】
Sample_20130928_1.jpg

【参考URL】ぷよぷよの作り方
↑テトリス方式の解説。


あと、下記のサイトで気になった記載について。
【参考URL】回転 - ゲームプログラミングWiki
↓ここから引用文。
----------------------------------------------------------------------
さて回転を実装する方法として、cos,sinを使うといった方法があります。
しかしcos,sin関数というのは返す値がdoble型です。

たとえば 90 度でcosの値を求めると
1という数ではなく0.999999987といった数となります。

これを(int)型でキャストすればいいのでは?思う方もいるかもしれませんが
キャストはすべて四捨五入でなく切捨て型です。

以上の理由で回転にはcos,sinを使うことができません。
そこでcos,sinをあらかじめ求めてやりましょう。

----------------------------------------------------------------------
↑引用ここまで。

んんん?
バカな!

上記を見るに、まず
double型だと「1.00000」などキリの良い数値を表現出来ないと言っている様に見える。
これ、出来ます。
(double t = 1; とかやれば分かる筈。)

それと、cos,sinは使えないと言いながら、
予めcos,sinを求めてみましょう
とは何?


仮に、cos,sinが使えないのだとするのならば、
実行中にcos,sinを計算しようが、
あらかじめcos,sinの結果を変数か何かに入れておこうが、
使えない(正しい値が取得出来ていない)のでは?



あと、0.999999987という数値が出る件についてですが、
度数法から弧度法に変換する際のパイの精度が足りなかったんじゃないのかと思う。
----------------------------------------------------------------------
//誤差が出る
double t = cos( 180.0f / 180.0f * 3.141592 );
//誤差そんなに出ない
double t = cos( 180.0f / 180.0f * 3.1415926535897932384626433832795 );

----------------------------------------------------------------------

自分もコレ一回ハマったんですよね。。

ブロックがある場合は回転させない様にしているのに
回転している、何故!?
⇒cosの結果が1となるべきところで0.999みたいな値となっていた。

例えば右に回転する場合、

( 現在の座標 + 48*1 ) / 48 となるべきところで、
( 現在の座標 + 48*0.999 ) / 48みたいになっており、

( 現在の座標 + 48 ) / 48 ⇒ ひとつ右側のマス
( 現在の座標 + 47 ) / 48 ⇒ 現在のマス

こんな感じで計算に誤りが生じていました。
(上記の例は、要は48となるべきところで、47になっていた。)



まぁ、ともかく、解説がやや少ないような気がするので、
今度、パズルゲームの作り方の記事でも書いてみようかな?
と思いました。

【今日のひとこと】
先日の続き。

チョコボールの様な長方形の紙のケースに入ったお菓子を
6つ程買おうとした友達ですが、

1個買う⇒また一個買う⇒また一個買う⇒//以下略
上記の様に1個ずつバラバラに会計をしました、それは何故でしょう?
というクイズの答え。

答え:消費税対策。


そのお菓子は1個99円でした。
6個買うとすると、
バラバラの会計:99 + 99 + 99 + 99 + 99 + 99 = 594円
一括の会計  :594 × 1.05 = 623円
差額:29円


バラバラに会計すると、約30円安いのです。

レジの人が困っていた様な気がしましたが、
毎回会計をバラバラにして買っていました。

まぁ、小学生にとって30円って大きい方だと思うので、
仕方ないのか・・・な?
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

No title

> 1という数ではなく0.999999987といった数となります。
これは浮動小数点数計算時に発生する丸め誤差の事では?
(floatValue += 1.f; でも何回かやると誤差が発生するあれ)

ぷよぷよ形式は、他のブロックとの当たり判定と挙動の実装が
だるいな、と以前テト○スを作った時思いました

No title

なるほど、丸め誤差に関する記載なのかもしれないですね

「90 度でcosの値を求めると」と記載してあったので、
下記の計算結果が0.999999987になると判断したのですが、
double t = cos( 90.0f / 180.0f * 3.1415926535897932384626433832795 );

丸め誤差の話であれば、誤差が発生してもおかしくないですね。
最初の座標が0、次の座標が48の場合、
0⇒1.25⇒2.5⇒3.75みたいに徐々に足し合わせて、
最終的に48になる方式
を取ったのでしょうかね。

自分もこの方法でやってみた事があるのですが、
誤差出まくりでゲームにならなかったです。

基本的に、「浮動小数点数を足し合わせて
その合計が●●になる」事を期待したらダメだなと思いましたv-292
コメントの投稿
管理者にだけ表示を許可する



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