Jypeli  5
The simple game programming library
Collisions.cs
Siirry tämän tiedoston dokumentaatioon.
1 #region MIT License
2 /*
3  * Copyright (c) 2009 University of Jyväskylä, Department of Mathematical
4  * Information Technology.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 #endregion
25 
26 /*
27  * Authors: Tero Jäntti, Tomi Karppinen, Janne Nikkanen.
28  */
29 
30 using Physics2DDotNet.Ignorers;
31 using Physics2DDotNet;
32 using System.Collections.Generic;
33 using System;
34 using AdvanceMath;
35 
36 namespace Jypeli
37 {
38  public partial class PhysicsObject
39  {
40  private int _ignoreGroup = 0;
41 
45  public virtual Ignorer CollisionIgnorer
46  {
47  get { return Body.CollisionIgnorer; }
48  set { Body.CollisionIgnorer = value; }
49  }
50 
56  public virtual int CollisionIgnoreGroup
57  {
58  get { return _ignoreGroup; }
59  set
60  {
61  _ignoreGroup = value;
62  if ( !IsAddedToGame ) AddedToGame += AddCollisionIgnoreGroup;
63  else AddCollisionIgnoreGroup();
64  }
65  }
66 
71  public bool IgnoresCollisionResponse
72  {
73  get { return Body.IgnoresCollisionResponse; }
74  set { Body.IgnoresCollisionResponse = value; }
75  }
76 
80  public event CollisionHandler<IPhysicsObject, IPhysicsObject> Collided;
81 
82  private void OnCollided( object sender, CollisionEventArgs args )
83  {
84  if ( this.IsDestroyed || args.Other == null ) return;
85  var other = (PhysicsObject)args.Other.Tag;
86  if ( other.IsDestroyed ) return;
87 
88  if ( Collided != null )
89  {
90  if ( other.ParentStructure != null ) Collided( this, other.ParentStructure );
91  Collided( this, other );
92  }
93  Brain.OnCollision( other );
94  }
95 
96  private void AddCollisionIgnoreGroup()
97  {
98  if ( _ignoreGroup == 0 )
99  {
100  Body.CollisionIgnorer = null;
101  }
102  else
103  {
104  if ( PhysicsGame.IgnoreGroups == null ) PhysicsGame.IgnoreGroups = new Dictionary<int, ObjectIgnorer>();
105  if ( !PhysicsGame.IgnoreGroups.ContainsKey( _ignoreGroup ) ) PhysicsGame.IgnoreGroups.Add( _ignoreGroup, new ObjectIgnorer() );
106  Body.CollisionIgnorer = PhysicsGame.IgnoreGroups[_ignoreGroup];
107  }
108  }
109 
110  private static CollisionShapeParameters GetDefaultParameters( double width, double height )
111  {
113  p.MaxVertexDistance = Math.Min( width, height ) / 3;
114  p.DistanceGridSpacing = Math.Min( width, height ) / 2;
115  return p;
116  }
117 
118  public bool IgnoresCollisionWith( IPhysicsObject target )
119  {
120  return this.IgnoresCollisionResponse || target.IgnoresCollisionResponse ||
121  ( this.CollisionIgnoreGroup != 0 && this.CollisionIgnoreGroup == target.CollisionIgnoreGroup );
122  }
123 
128  public void MakeOneWay()
129  {
130  this.CollisionIgnorer = new OneWayPlatformIgnorer( AdvanceMath.Vector2D.YAxis, this.Height );
131  }
132 
137  public void MakeOneWay( Vector direction )
138  {
139  this.CollisionIgnorer = new OneWayPlatformIgnorer( (Vector2D)direction, this.Height );
140  }
141  }
142 }
bool IsAddedToGame
Onko olio lisätty peliin.
virtual void OnCollision(IGameObject target)
Kutsutaan, kun tapahtuu törmäys. Perivässä luokassa methodin kuuluu kutsua vastaavaa kantaluokan meth...
Definition: Brain.cs:137
virtual int CollisionIgnoreGroup
Törmäysryhmä. Oliot jotka ovat samassa törmäysryhmässä menevät toistensa läpi. Jos ryhmä on nolla tai...
Definition: Collisions.cs:57
void MakeOneWay()
Tekee oliosta läpimentävän alhaalta ylöspäin (tasohyppelytaso). Huom. ei toimi yhdessä CollisionIgnor...
Definition: Collisions.cs:128
PhysicsObject(double width, double height)
Luo uuden fysiikkaolion.
Yhteinen rajapinta kaikille fysiikkaolioille.
bool IgnoresCollisionResponse
Jättääkö olio törmäyksen huomioimatta. Jos tosi, törmäyksestä tulee tapahtuma, mutta itse törmäystä e...
Definition: Collisions.cs:72
bool IsDestroyed
Onko olio tuhottu.
Törmäyskuvion laatuun vaikuttavat parametrit.
Aivoluokka peliolioille. Voidaan käyttää tekoälyn ja tilannekohtaisten toimintamallien luomiseen peli...
Definition: Brain.cs:40
virtual Ignorer CollisionIgnorer
Olio, jolla voi välttää oliota osumasta tiettyihin muihin olioihin.
Definition: Collisions.cs:46
CollisionHandler< IPhysicsObject, IPhysicsObject > Collided
Tapahtuu kun olio törmää toiseen.
Definition: Collisions.cs:80
void MakeOneWay(Vector direction)
Tekee oliosta läpimentävän vektorin suuntaan. Huom. ei toimi yhdessä CollisionIgnoreGroupien kanssa! ...
Definition: Collisions.cs:137
bool IgnoresCollisionWith(IPhysicsObject target)
Definition: Collisions.cs:118
Action AddedToGame
Tapahtuu, kun olio lisätään peliin.
Body Body
Fysiikkamoottorin käyttämä tietorakenne.
Definition: Dimensions.cs:42
2D-vektori.
Definition: Vector.cs:56
Peli, jossa on fysiikan laskenta mukana. Peliin lisätyt
Definition: PhysicsGame.cs:45
double Height
Olion korkeus (Y-suunnassa, korkeimmassa kohdassa).