http://physicshelperxaml.codeplex.com/
Creare un progetto che utilizza le librerie Farseer Physics
- Creare un progetto di tipo UniversalApp
- Aggiungere alla solution gli "exisisting projects" che si trovano nella cartella 000_lib
- FarseerPhysics + Spritehand.PhysicsHelper
- Aggiungere ai progetti WINDOWS e WINDOWSPHONE della solution le reference ai due progetti appena aggiunti
- Nell'App.xaml.cs non bisogna aggiungere NIENTE
Creare uno UserControl soggetto alle regole della fisica
- creiamo un semplice rettangolo chiamato ucBlock
- Nello xaml, aggiungere il riferimento alla classe FarseerHelper
- xmlns:ph="using:Spritehand.FarseerHelper"
- Creare un canvas e dentro al canvas definire un oggetto PhysicsSprite
<Canvas x:Name="LayoutRoot" Width="60" Height="60">
<ph:PhysicsSprite x:Name="cnvBlock" Height="60" Width="60">
<Rectangle Height="60" Stroke="Black" Width="60" Fill="Red" />
</ph:PhysicsSprite>
</Canvas>
Usare lo usercontrol in una pagina
- Nello xaml della pagina aggiungere il riferimento alla classe FarseerHelper
- xmlns:ph="using:Spritehand.FarseerHelper"
- Definire il canvas principale del gioco
- <Canvas x:Name="cnvGameOuter" >
- Definire l'ambiente della simulazione della fisica
- <ph:PhysicsCanvas x:Name="cnvGame" MousePickEnabled="true">
- Inserire lo user control dentro all'ambiente della fisica
- <local:ucBlock x:Name="myBlock" HorizontalAlignment="Left" Margin="119,182,0,0" VerticalAlignment="Top"/>
- Andando in run lo user control cadrà ed uscirà dallo schermo perché non c'è alcun oggetto che possa bloccarlo
- Inserire quindi un "pavimento":
- <ph:PhysicsSprite x:Name="ground" Background="DarkGreen" IsStatic="True" Canvas.Top="360" Height="20" Width="670" />
Attributo TimeStep del PhysicsCanvas
- Questo attributo indica ogni quanti millisecondi viene processato l'ambiente. Più è alto più gli oggetti vanno veloci. Il default è 0.2, un valore buono per un giochino tipo Flappy Bird è 0.4
Utilizzare il timer dell'ambiente Physics
- E' possibile usare il timer dell'ambiente
- cnvGame.TimerLoop += new PhysicsCanvas.TimerLoopHandler(cnvGame_TimerLoop);
- Definire l'evento come segue
void cnvGame_TimerLoop(object source)
{
// this event is fired for EACH Timer tick of the simulation. Le righe successive sono solo un esempio
if ((DateTime.Now - _dtLastFpsUpdate).TotalMilliseconds > 1000)
{
tbStatus.Text = String.Format("{0} fps with {1} UIElements, {2} bodies, {3} joints, {4} collisions", cnvGame.LastFPS, cnvGame.Children.Count(), cnvGame.Simulator.BodyList.Count, cnvGame.Simulator.JointList.Count, _collisionCount);
_dtLastFpsUpdate = DateTime.Now;
_collisionCount = 0;
}
}
Usare gli oggetti Physics nel codice
- È possibile ottenere ogni oggetto fisico via codice con questa semplice istruzione
- PhysicsSprite spr = cnvGame.PhysicsObjects["cnvBlock"]; //VEDI PRIMA NELLA DEFINIZIONE DELLO USER CONTROL!!
Applicare una forza ad un oggetto
PhysicsSprite spr = cnvGame.PhysicsObjects["cnvFlappy"];
Vector2 mySpinta = new Vector2(0, -20);
spr.BodyObject.ApplyForce(mySpinta);
Impostare l'elasticità di un oggetto
- Quando uno sprite urta un oggetto statico riceve una forza di rimbalzo che può essere configurata nel parametro RestitutionCoefficient dell'oggetto statico.
- Se pari ad 1 vorrà dire che l'urto sarà completamente elastico
- Se maggiore di 1 vorrà dire che lo sprite subirà una spinta di ritorno maggiore (tipo materasso elastico)
- Se 0 allora l'urto sarà completamente anelastico
- Tra 0 ed 1 abbiamo i casi classici di urti elastici
Gestione collisioni
- Le collisioni si gestiscono nella pagina che definisce l'ambiente della fisica (in pratica l'oggetto cnvGame )
- cnvGame.Collision += new PhysicsCanvas.CollisionHandler(cnvGame_Collision);
- Definire l'evento come segue
void cnvGame_Collision(PhysicsSprite sprite1, PhysicsSprite sprite2, FarseerPhysics.Dynamics.Contacts.Contact contact)
{
// this event is fired for each sprite to sprite collision
// taking into account CollisionGroup.
_collisionCount++;
if (PhysicsUtilities.GetMaxCollisionForce(contact) > 0.3)
_soundHit.Play();
}
Creazione di uno UserControl e aggiunta al mondo della fisica via codice
- Per aggiungere uno user control via codice al mondo della fisica:
- Creare lo user control:
ucPhysics myUserControl = new ucPhysics();
cnvGame.AddPhysicsUserControl(myUserControl, 104, 92);