actionscriptの最近のブログ記事

もうちょっと拡張してみる。

↓カウントダウン機能を追加してみた。
7.指定した日時までの、今からの秒数を取得

関数の第一引数に日付を、第二引数に時間を指定する。
日付の指定は8桁の文字列 → "20081010"のような感じ。
時間の指定は6桁の文字列 → "235959"のような感じ。
指定の日時までは数字が0まで減っていき、
指定の日時を過ぎると0から増えていく。
----- 2008.10.28追記 -----
指定の日時を過ぎると「負の数」で過ぎた秒数を返す。

↓で、サンプル追加。

This site requires flash player 9 or later.Thank you.


↓使い方はこんな感じ。

で、再びソース


ありそうでなさそうで、
今後もいざという時に使いそうだから作ってみた。

できることは↓こんな感じ。
1.指定した日付が今日から何日前(後)かを取得
2.指定した日数前(後)の年月日の取得
3.指定した日付の曜日の取得
4.指定した日数前(後)の曜日の取得
5.今年の、今日までに経過した日数の取得
6.今年の、今日からの残り日数の取得


日付の指定は8桁の文字列 → "20081010"のような感じ。
日数の指定は「マイナスで過去、プラスで未来。
取得する数値も「マイナスで過去、プラスで未来。
あと、うるう年も計算に入れてるからたぶん一生使える

↓で、サンプル。

This site requires flash player 9 or later.Thank you.


↓使い方はこんな感じ。

で、ソース

2.0.1にアップデートすると、前回までのサンプルが動かない。
それは嫌なので、2.0.0から2.0.1へのバージョンアップに伴う変更をメモ。

といっても前回までのサンプルに影響のある部分は1カ所だけ。

としていた部分を


一応修正したソースをアップ。 →ソース

前回まででBox2Dの基本的な部分は出来たけど、今回はより掘り下げて、オブジェクトの3つの基本的なプロパティ「friction」「restitution」「density」について調べてみた。

まずはfriction

b2ShapeDefのソースを覗くと「The shape's friction coefficient, usually in the range [0,1].」とあるから「摩擦係数」のことで「0〜1の値」で指定するのが普通らしい。
昔習った様な気がするけどもう完全に忘れてる、、

調べてみるとどうやら、2つの物体間の摩擦力を決める係数みたい。
でさらに「静摩擦係数」「動摩擦係数」という2種類があって、「静摩擦係数」は静止している物体同士の間に発生する摩擦力(静止摩擦力)に対する係数で、「動摩擦係数」はどちらか(または両方)の物体が動いている際に発生する摩擦力(動摩擦力)に対する係数だそうだ。
そして2つの物体の材質によっても変化し(木、氷、鉄など)、また物体が濡れているか乾燥しているかによっても変わってくる。

ということは、衝突判定に、局所毎にfrictionを変化させる処理を入れなきゃいけないのか、、
そんなことをするとFlash側の処理も大変になるだろうし、なにより自分が大変だ。
という事で、材質毎に平均値で決めてしまうのが良いかなと思った。

↓平均値を求めるにはここのページが参考になるかな。

Coefficients Of Friction

めんどかったから大体の値(と自分の中での思い込みも混ぜた)で、、
「鉄:0.6、アルミニウム:0.6、ゴム:0.9、木:0.5、コンクリート:0.7、氷:0」

ん〜物理、、

次はrestitution

ソースには「The shape's restitution (elasticity) usually in the range [0,1].」とあるから、弾力(弾性)のこと。
これは調べてもなかなか思ったものが無かったからfrictionと同様に「0〜1の値」で勝手に決めてみた。
「鉄:0.2、アルミニウム:0.3、ゴム:0.9、木:0.3、コンクリート:0.1、氷:0.1」

こんなもんか

最後にdensity

ソースでは「The shape's density, usually in kg/m^2.」とある。
密度のことらしいけど立法メートルではなく平方メートルになっている。これは「面積密度」と言うみたい。
1m^2当たりの物体の質量を入れる。(オブジェクトの重さは、大きさ×densityになってるっぽい)
ということで、↓このあたりを参考にさせていただくと、

数量の比較 (密度)
MSN 相談箱 | 天然ゴムの密度は?
木ってどうなっているの?

「鉄:7.9、アルミニウム:2.6、ゴム:0.4、木:1.4、コンクリート:2.4、氷:1」

だろうかね。

で、これを自作クラスに反映させてみたら、ボディーが重すぎて沈んだ。。
↓クラスはこんな感じで設定した。 色々さぐったら、restitutionJointにも影響してるみたいで、車のボディとタイヤを繋ぐJointに、タイヤのrestitutionが思い切り反映されてしまっていて、クタるみたい。
解決策として、タイヤの中心にアルミのオブジェクトを追加した。まだちょっとクタるけど、まぁ動くから良いか。。

ソース(結構Classをいじってしまった)

まだまだだな、、

今回は、前回のエントリーまでで作った車のボディーと、前回説明は省いてたけど画面中央にいる障害物の衝突判定をメモ。
↓ここを参考にさせていただいた。


Flash OOP Japan | 続Flah OOP本 | 物理エンジンを使ったゲーム | あたり判定


b2Bodyオブジェクトにはm_contactListという、衝突している2つのオブジェクトを格納するプロパティが存在する。
まずは、車のボディー(bodyBody)のm_contactListから、衝突しているオブジェクトを取り出す処理を入れる。(m_contactListを取得するにはGetContactList()を使用する)


衝突するオブジェクトは、地面であったり壁であったりと場合により変わるので、それを判断する指標が必要になってくる。
その指標を、b2PolygonDefb2CircleDefで指定したグラフィックデータ(userData)のプロパティ「id」として設定する。(ここでは車のボディには「body」、障害物には「obstacle」というidを指定)
で、上の方で取得したm_contactList内のオブジェクト、「obj1」と「obj2」のuserDataidがそれぞれ、「body」と「obstacle」だったら衝突時のアクションを起こすという流れになる。

あとここでつまづいたのが、「idだけで判定しようとするとオブジェクトの矩形で判定をしてしまう」ということ。
ここでb2ContanctGetManifoldCount()を調べる。
GetManifoldCount()は「0」か「1」の数字が取得できて、「“0”の時は矩形で衝突している」、「“1”の時はオブジェクトの形で衝突している」事を表しているみたい。
↓それをコードに組み込むとこんな感じ。

↓今回は衝突時に右上のボックスが「TRUE」、非衝突時が「FLASE」の文字を表示する様にしてみた。
This site requires flash player 9 or later.Thank you.


ソース

とりあえず今回までの事が理解出来れば簡単なゲームは作れそうな気がする。
でも、まだ探ってない部分が沢山あるから、まだまだ勉強しなくては。

 1  |  2  |  3  |  4  |  5  next