ATTENZIONE: Questo sito impiega diversi tipi di cookies. Alla pagina MAGGIORI INFORMAZIONI è possibile avere informazioni aggiuntive. Cliccando su ACCETTO o continuando a navigare sul sito acconsenti al loro utilizzo.
<febbraio 2023>
lunmarmergiovensabdom
303112345
6789101112
13141516171819
20212223242526
272812345
6789101112
Immagini  

Universal App - Physics

 

 

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);

Notifiche