• R/O
  • SSH
  • HTTPS

nlgp1: Commit


Commit MetaInfo

Revision734 (tree)
Zeit2011-02-21 16:13:30
Autorbiikame

Log Message

Box2DX.Collision.AABBを参照するよう修正

Ändern Zusammenfassung

Diff

--- trunk/Nlgp1/Nlgp1/Sprites/Sprite.cs (revision 733)
+++ trunk/Nlgp1/Nlgp1/Sprites/Sprite.cs (revision 734)
@@ -1,6 +1,7 @@
11 using System;
22 using System.Collections.Generic;
33 using System.Linq;
4+using Box2DX.Collision;
45 using Box2DX.Common;
56 using Nlgp1.Attacks;
67 using Nlgp1.Common;
@@ -64,7 +65,7 @@
6465 this.Motion = SpriteMotion.Get( layerType , imageTypeName , typeID , chipSize );
6566 this.Speed = new Speed();
6667 this.LogicParameter = new ActionParameter();
67- this.Bounds = new Parameters.Bounds( this , new Vec2() , new Vec2( chipSize.Width , chipSize.Height ) );
68+ this.Bounds = new SpriteBound( this , MathEx.ToAABB( 0 , 0 , chipSize.Width , chipSize.Height ) );
6869
6970 this.SpriteType = spriteType;
7071 this.TypeID = typeID;
@@ -141,7 +142,7 @@
141142 /// <summary>
142143 /// スプライトの位置、サイズを取得または、設定します。
143144 /// </summary>
144- public Bounds Bounds {
145+ public SpriteBound Bounds {
145146 get;
146147 private set;
147148 }
--- trunk/Nlgp1/Nlgp1/Parameters/Bounds.cs (revision 733)
+++ trunk/Nlgp1/Nlgp1/Parameters/Bounds.cs (nonexistent)
@@ -1,178 +0,0 @@
1-using System;
2-using Nlgp1.Sprites;
3-using Nlgp1.Utilities;
4-using Nlgp1.Common;
5-using Box2DX.Common;
6-
7-namespace Nlgp1.Parameters {
8- public class Bounds : IBounds {
9-
10- public Bounds( Sprite sprite , Vec2 location , Vec2 size ) {
11- this.sprite = sprite;
12- this.location = location;
13- this.size = size;
14- }
15-
16- public Sprite Sprite {
17- get {
18- return this.sprite;
19- }
20- }
21-
22- private Sprite sprite;
23-
24- private Vec2 location = new Vec2();
25- private Vec2 size = new Vec2();
26- /// <summary>
27- /// サイズを取得します。
28- /// </summary>
29- public Vec2 Size {
30- get {
31- return new Vec2( this.Width , this.Height );
32- }
33- }
34- /// <summary>
35- /// 横幅を取得または、設定します。
36- /// </summary>
37- public float Width {
38- get {
39- return this.size.X - ( this.BlankLeft + this.BlankRight );
40- }
41- }
42- /// <summary>
43- /// 縦幅を取得または、設定します。
44- /// </summary>
45- public float Height {
46- get {
47- return this.size.Y - ( this.BlankTop + this.BlankBottom );
48- }
49- }
50-
51- #region 当たり判定の余白
52- /// <summary>
53- /// 左側の余白をピクセル単位で設定または、取得します。
54- /// </summary>
55- public int BlankLeft {
56- get;
57- set;
58- }
59- /// <summary>
60- /// 右側の余白をピクセル単位で設定または、取得します。
61- /// </summary>
62- public int BlankRight {
63- get;
64- set;
65- }
66- /// <summary>
67- /// 上側の余白をピクセル単位で設定または、取得します。
68- /// </summary>
69- public int BlankTop {
70- get;
71- set;
72- }
73- /// <summary>
74- /// 下側の余白をピクセル単位で設定または、取得します。
75- /// </summary>
76- public int BlankBottom {
77- get;
78- set;
79- }
80- #endregion
81-
82- #region 頂点座標
83- /// <summary>
84- /// 左端の座標を取得します。
85- /// </summary>
86- public float Left {
87- get {
88- return this.sprite.X + this.location.X + this.BlankLeft;
89- }
90- }
91- /// <summary>
92- /// 上端の座標を取得します。
93- /// </summary>
94- public float Top {
95- get {
96- return this.sprite.Y + this.location.Y + this.BlankLeft;
97- }
98- }
99- /// <summary>
100- /// 右端の座標を取得します。
101- /// </summary>
102- public float Right {
103- get {
104- return this.sprite.X + this.location.X + this.size.X - this.BlankRight;
105- }
106- }
107- /// <summary>
108- /// 下端の座標を取得します。
109- /// </summary>
110- public float Bottom {
111- get {
112- return this.sprite.Y + this.location.Y + this.size.Y - this.BlankBottom;
113- }
114- }
115- #endregion
116-
117- #region 当たり判定
118- /// <summary>
119- /// 対象と衝突しているかどうか判定します。
120- /// </summary>
121- /// <param name="toRect">対象のオブジェクト</param>
122- /// <returns>衝突しているかどうか</returns>
123- public bool HitTest( IBounds toRect ) {
124- return HitTest( toRect , AspectType.Horizontal ) && HitTest( toRect , AspectType.Vertical );
125- }
126- /// <summary>
127- /// 縦または、横の何れかを指定した衝突しているかどうか判定する。
128- /// </summary>
129- /// <param name="toRect">対象のオブジェクト</param>
130- /// <param name="aspect">縦または、横を指定します。</param>
131- /// <returns>衝突しているかどうか</returns>
132- public bool HitTest( IBounds toRect , AspectType aspect ) {
133- switch( aspect ) {
134- case AspectType.Vertical:
135- return Top + BlankTop < toRect.Bottom - toRect.BlankBottom && Bottom - BlankBottom > toRect.Top + toRect.BlankTop;
136- case AspectType.Horizontal:
137- return Left + BlankLeft < toRect.Right - toRect.BlankRight && Right - BlankRight > toRect.Left + toRect.BlankLeft;
138- default:
139- return HitTest( toRect );
140- }
141- }
142- /// <summary>
143- /// 衝突方向を指定して重なってる距離を取得します。
144- /// </summary>
145- /// <param name="dir">衝突方向</param>
146- /// <param name="toRect">対象の短形</param>
147- /// <returns>重なってる部分の距離</returns>
148- public float HitDistance( DirectionType dir , IBounds toRect ) {
149- if( HitTest( toRect ) == false )
150- return 0;
151- if( ( dir == DirectionType.Left || dir == DirectionType.Right ) && HitTest( toRect , AspectType.Horizontal ) ) {
152- switch( dir ) {
153- case DirectionType.Left:
154- return toRect.Left - Right;
155- case DirectionType.Right:
156- return toRect.Right - Left;
157- }
158- } else if( HitTest( toRect , AspectType.Vertical ) ) {
159- switch( dir ) {
160- case DirectionType.Top:
161- return toRect.Bottom - Top;
162- case DirectionType.Bottom:
163- return toRect.Top - Bottom;
164- }
165- }
166- return 0;
167- }
168-
169- public bool HitTest( Vec2 location ) {
170- float left = this.Left + this.BlankLeft;
171- float top = this.Top + this.BlankTop;
172- float right = this.Right - this.BlankRight;
173- float bottom = this.Bottom - this.BlankBottom;
174- return ( left < location.X && location.X < right ) && ( top < location.Y && location.Y < bottom );
175- }
176- #endregion
177- }
178-}
--- trunk/Nlgp1/Nlgp1/Parameters/IBounds.cs (revision 733)
+++ trunk/Nlgp1/Nlgp1/Parameters/IBounds.cs (nonexistent)
@@ -1,74 +0,0 @@
1-
2-namespace Nlgp1.Parameters {
3- public interface IBounds {
4- /// <summary>
5- /// 横幅を取得または、設定します。
6- /// </summary>
7- float Width {
8- get;
9- }
10- /// <summary>
11- /// 縦幅を取得または、設定します。
12- /// </summary>
13- float Height {
14- get;
15- }
16-
17- /// <summary>
18- /// 左端の座標を取得します。
19- /// </summary>
20- float Left {
21- get;
22- }
23- /// <summary>
24- /// 上端の座標を取得します。
25- /// </summary>
26- float Top {
27- get;
28- }
29- /// <summary>
30- /// 右端の座標を取得します。
31- /// </summary>
32- float Right {
33- get;
34- }
35- /// <summary>
36- /// 下端の座標を取得します。
37- /// </summary>
38- float Bottom {
39- get;
40- }
41-
42-
43- int BlankLeft {
44- get;
45- set;
46- }
47- int BlankRight {
48- get;
49- set;
50- }
51- int BlankTop {
52- get;
53- set;
54- }
55- int BlankBottom {
56- get;
57- set;
58- }
59-
60- /// <summary>
61- /// 衝突方向を指定して重なってる距離を取得します。
62- /// </summary>
63- /// <param name="dir">衝突方向</param>
64- /// <param name="toRect">対象の短形</param>
65- /// <returns>重なってる部分の距離</returns>
66- float HitDistance( DirectionType dir , IBounds toRect );
67- /// <summary>
68- /// 対象と衝突しているかどうか判定します。
69- /// </summary>
70- /// <param name="toRect">対象のオブジェクト</param>
71- /// <returns>衝突しているかどうか</returns>
72- bool HitTest( IBounds toRect );
73- }
74-}
--- trunk/Nlgp1/Nlgp1/Parameters/SpriteBound.cs (nonexistent)
+++ trunk/Nlgp1/Nlgp1/Parameters/SpriteBound.cs (revision 734)
@@ -0,0 +1,176 @@
1+using System;
2+using Box2DX.Collision;
3+using Box2DX.Common;
4+using Nlgp1.Common;
5+using Nlgp1.Sprites;
6+using Nlgp1.Utilities;
7+
8+namespace Nlgp1.Parameters {
9+ public class SpriteBound : ISpriteBound {
10+
11+ public SpriteBound( Sprite sprite , AABB aabb ) {
12+ this.sprite = sprite;
13+ this.aabb = aabb;
14+ }
15+
16+ public Sprite Sprite {
17+ get {
18+ return this.sprite;
19+ }
20+ }
21+
22+ private Sprite sprite;
23+ private AABB aabb;
24+ /// <summary>
25+ /// サイズを取得します。
26+ /// </summary>
27+ public Vec2 Size {
28+ get {
29+ return new Vec2( this.Width , this.Height );
30+ }
31+ }
32+ /// <summary>
33+ /// 横幅を取得または、設定します。
34+ /// </summary>
35+ public float Width {
36+ get {
37+ return this.aabb.GetWidth() - ( this.BlankLeft + this.BlankRight );
38+ }
39+ }
40+ /// <summary>
41+ /// 縦幅を取得または、設定します。
42+ /// </summary>
43+ public float Height {
44+ get {
45+ return this.aabb.GetHeight() - ( this.BlankTop + this.BlankBottom );
46+ }
47+ }
48+
49+ #region 当たり判定の余白
50+ /// <summary>
51+ /// 左側の余白をピクセル単位で設定または、取得します。
52+ /// </summary>
53+ public int BlankLeft {
54+ get;
55+ set;
56+ }
57+ /// <summary>
58+ /// 右側の余白をピクセル単位で設定または、取得します。
59+ /// </summary>
60+ public int BlankRight {
61+ get;
62+ set;
63+ }
64+ /// <summary>
65+ /// 上側の余白をピクセル単位で設定または、取得します。
66+ /// </summary>
67+ public int BlankTop {
68+ get;
69+ set;
70+ }
71+ /// <summary>
72+ /// 下側の余白をピクセル単位で設定または、取得します。
73+ /// </summary>
74+ public int BlankBottom {
75+ get;
76+ set;
77+ }
78+ #endregion
79+
80+ #region 頂点座標
81+ /// <summary>
82+ /// 左端の座標を取得します。
83+ /// </summary>
84+ public float Left {
85+ get {
86+ return this.sprite.X + this.aabb.GetLeft() + this.BlankLeft;
87+ }
88+ }
89+ /// <summary>
90+ /// 上端の座標を取得します。
91+ /// </summary>
92+ public float Top {
93+ get {
94+ return this.sprite.Y + this.aabb.GetTop() + this.BlankLeft;
95+ }
96+ }
97+ /// <summary>
98+ /// 右端の座標を取得します。
99+ /// </summary>
100+ public float Right {
101+ get {
102+ return this.sprite.X + this.aabb.GetRight() - this.BlankRight;
103+ }
104+ }
105+ /// <summary>
106+ /// 下端の座標を取得します。
107+ /// </summary>
108+ public float Bottom {
109+ get {
110+ return this.sprite.Y + this.aabb.GetBottom() - this.BlankBottom;
111+ }
112+ }
113+ #endregion
114+
115+ #region 当たり判定
116+ /// <summary>
117+ /// 対象と衝突しているかどうか判定します。
118+ /// </summary>
119+ /// <param name="toRect">対象のオブジェクト</param>
120+ /// <returns>衝突しているかどうか</returns>
121+ public bool HitTest( ISpriteBound toRect ) {
122+ return HitTest( toRect , AspectType.Horizontal ) && HitTest( toRect , AspectType.Vertical );
123+ }
124+ /// <summary>
125+ /// 縦または、横の何れかを指定した衝突しているかどうか判定する。
126+ /// </summary>
127+ /// <param name="toRect">対象のオブジェクト</param>
128+ /// <param name="aspect">縦または、横を指定します。</param>
129+ /// <returns>衝突しているかどうか</returns>
130+ public bool HitTest( ISpriteBound toRect , AspectType aspect ) {
131+ switch( aspect ) {
132+ case AspectType.Vertical:
133+ return Top + BlankTop < toRect.Bottom - toRect.BlankBottom && Bottom - BlankBottom > toRect.Top + toRect.BlankTop;
134+ case AspectType.Horizontal:
135+ return Left + BlankLeft < toRect.Right - toRect.BlankRight && Right - BlankRight > toRect.Left + toRect.BlankLeft;
136+ default:
137+ return HitTest( toRect );
138+ }
139+ }
140+ /// <summary>
141+ /// 衝突方向を指定して重なってる距離を取得します。
142+ /// </summary>
143+ /// <param name="dir">衝突方向</param>
144+ /// <param name="toRect">対象の短形</param>
145+ /// <returns>重なってる部分の距離</returns>
146+ public float HitDistance( DirectionType dir , ISpriteBound toRect ) {
147+ if( HitTest( toRect ) == false )
148+ return 0;
149+ if( ( dir == DirectionType.Left || dir == DirectionType.Right ) && HitTest( toRect , AspectType.Horizontal ) ) {
150+ switch( dir ) {
151+ case DirectionType.Left:
152+ return toRect.Left - Right;
153+ case DirectionType.Right:
154+ return toRect.Right - Left;
155+ }
156+ } else if( HitTest( toRect , AspectType.Vertical ) ) {
157+ switch( dir ) {
158+ case DirectionType.Top:
159+ return toRect.Bottom - Top;
160+ case DirectionType.Bottom:
161+ return toRect.Top - Bottom;
162+ }
163+ }
164+ return 0;
165+ }
166+
167+ public bool HitTest( Vec2 location ) {
168+ float left = this.Left + this.BlankLeft;
169+ float top = this.Top + this.BlankTop;
170+ float right = this.Right - this.BlankRight;
171+ float bottom = this.Bottom - this.BlankBottom;
172+ return ( left < location.X && location.X < right ) && ( top < location.Y && location.Y < bottom );
173+ }
174+ #endregion
175+ }
176+}
--- trunk/Nlgp1/Nlgp1/Parameters/ISpriteBound.cs (nonexistent)
+++ trunk/Nlgp1/Nlgp1/Parameters/ISpriteBound.cs (revision 734)
@@ -0,0 +1,74 @@
1+
2+namespace Nlgp1.Parameters {
3+ public interface ISpriteBound {
4+ /// <summary>
5+ /// 横幅を取得または、設定します。
6+ /// </summary>
7+ float Width {
8+ get;
9+ }
10+ /// <summary>
11+ /// 縦幅を取得または、設定します。
12+ /// </summary>
13+ float Height {
14+ get;
15+ }
16+
17+ /// <summary>
18+ /// 左端の座標を取得します。
19+ /// </summary>
20+ float Left {
21+ get;
22+ }
23+ /// <summary>
24+ /// 上端の座標を取得します。
25+ /// </summary>
26+ float Top {
27+ get;
28+ }
29+ /// <summary>
30+ /// 右端の座標を取得します。
31+ /// </summary>
32+ float Right {
33+ get;
34+ }
35+ /// <summary>
36+ /// 下端の座標を取得します。
37+ /// </summary>
38+ float Bottom {
39+ get;
40+ }
41+
42+
43+ int BlankLeft {
44+ get;
45+ set;
46+ }
47+ int BlankRight {
48+ get;
49+ set;
50+ }
51+ int BlankTop {
52+ get;
53+ set;
54+ }
55+ int BlankBottom {
56+ get;
57+ set;
58+ }
59+
60+ /// <summary>
61+ /// 衝突方向を指定して重なってる距離を取得します。
62+ /// </summary>
63+ /// <param name="dir">衝突方向</param>
64+ /// <param name="toRect">対象の短形</param>
65+ /// <returns>重なってる部分の距離</returns>
66+ float HitDistance( DirectionType dir , ISpriteBound toRect );
67+ /// <summary>
68+ /// 対象と衝突しているかどうか判定します。
69+ /// </summary>
70+ /// <param name="toRect">対象のオブジェクト</param>
71+ /// <returns>衝突しているかどうか</returns>
72+ bool HitTest( ISpriteBound toRect );
73+ }
74+}
--- trunk/Nlgp1/Nlgp1/Utilities/MathEx.cs (revision 733)
+++ trunk/Nlgp1/Nlgp1/Utilities/MathEx.cs (revision 734)
@@ -1,9 +1,11 @@
11 using System;
2+using Box2DX.Collision;
3+using Box2DX.Common;
24 using Nlgp1.Characters;
5+using Nlgp1.Common;
6+using Nlgp1.Common.Drawing;
37 using Nlgp1.Parameters;
48 using Nlgp1.Sprites;
5-using Nlgp1.Common;
6-using Nlgp1.Common.Drawing;
79
810 // [重要]このコードは、暫定版であり実験用コードを含みます。将来的に設計・実装が変更されます。
911 // これらのコードを生放送等で配信することは、構いませんが実装者の許可無く無断で
@@ -16,22 +18,22 @@
1618 /// </summary>
1719 public static class MathEx {
1820
19- public const float PI = ( float )( Math.PI );
21+ public const float PI = ( float )( System.Math.PI );
2022
2123 public static float Atan2( float x , float y ) {
22- return ( float )( Math.Atan2( x , y ) );
24+ return ( float )( System.Math.Atan2( x , y ) );
2325 }
2426
2527 public static int Ceiling( float f ) {
26- return ( int )( Math.Ceiling( f ) );
28+ return ( int )( System.Math.Ceiling( f ) );
2729 }
2830
2931 public static float Cos( float f ) {
30- return ( float )( Math.Cos( f ) );
32+ return ( float )( System.Math.Cos( f ) );
3133 }
3234
3335 public static int Floor( float f ) {
34- return ( int )( Math.Floor( f ) );
36+ return ( int )( System.Math.Floor( f ) );
3537 }
3638
3739 public static float Pow2( float f ) {
@@ -39,17 +41,56 @@
3941 }
4042
4143 public static int Round( float f ) {
42- return ( int )( Math.Round( f ) );
44+ return ( int )( System.Math.Round( f ) );
4345 }
4446
4547 public static float Sin( float f ) {
46- return ( float )( Math.Sin( f ) );
48+ return ( float )( System.Math.Sin( f ) );
4749 }
4850
4951 public static float Sqrt( float f ) {
50- return ( float )( Math.Sqrt( f ) );
52+ return ( float )( System.Math.Sqrt( f ) );
5153 }
5254
55+ public static Vec2 GetSize( this AABB aabb ) {
56+ return aabb.UpperBound - aabb.LowerBound;
57+ }
58+
59+ public static float GetWidth( this AABB aabb ) {
60+ return aabb.UpperBound.X - aabb.LowerBound.X;
61+ }
62+
63+ public static float GetHeight( this AABB aabb ) {
64+ return aabb.UpperBound.Y - aabb.LowerBound.Y;
65+ }
66+
67+ public static float GetLeft( this AABB aabb ) {
68+ return aabb.LowerBound.X;
69+ }
70+
71+ public static float GetTop( this AABB aabb ) {
72+ return aabb.LowerBound.Y;
73+ }
74+
75+ public static float GetRight( this AABB aabb ) {
76+ return aabb.UpperBound.X;
77+ }
78+
79+ public static float GetBottom( this AABB aabb ) {
80+ return aabb.UpperBound.Y;
81+ }
82+
83+ public static AABB ToAABB( Vec2 lowerBound , Vec2 upperBound ) {
84+ return new AABB {
85+ LowerBound = lowerBound,
86+ UpperBound = upperBound,
87+ };
88+ }
89+
90+ public static AABB ToAABB( float left , float top , float right , float bottom ) {
91+ return ToAABB( new Vec2( left , top ) , new Vec2( right , bottom ) );
92+ }
93+
5394 /// <summary>
5495 /// キャラクタ間の距離を取得します。
5596 /// </summary>
Show on old repository browser