source: 2011/24/Heksa/Hiukkaskiihdytin/Peli.cs @ 3729

Revision 2020, 5.2 KB checked in by tojukarp, 8 years ago (diff)

Kiihdytin hiukkasen :)

RevLine 
[2020]1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8using Microsoft.Xna.Framework;
9
10public class Peli : PhysicsGame
11{
12    PhysicsObject magneetti;
13    //PhysicsObject rautapallo;
14    List<PhysicsObject> pallot = new List<PhysicsObject>();
15
16    // Sähkövaraukset (coulombeja)
17    double MagneettiVaraus = -16.2;
18    double RautapalloVaraus = 0.1;
19
20    // Vakiot: tyhjiön permittiivisyys ja Coulombin lain kerroin
21    const double perm0 = 8.854e-12;
22    const double CoulombKerroin = 1 / ( 4 * Math.PI * perm0 );
23
24    const double pyoritysNopeus = 1200;
25    const double pyoritysSade = 200;
26
27    double ignoreAika = 0;
28
29    ExplosionSystem rajahdysSysteemi;
30
31    public override void Begin()
32    {
33        Level.BackgroundColor = Jypeli.Color.DarkRed;
34        TeeReunat();
35
36        rajahdysSysteemi = new ExplosionSystem( LoadImage("rajahdys"), 30 );
37        rajahdysSysteemi.BlendMode = BlendMode.Additive;
38        rajahdysSysteemi.MaxScale = 60;
39        rajahdysSysteemi.MaxLifetime = 1.5;
40        Add( rajahdysSysteemi );
41
42        magneetti = new PhysicsObject( 50, 50, Shape.Hexagon );
43        magneetti.Mass = Double.PositiveInfinity;
44        magneetti.X = pyoritysSade;
45        magneetti.CanRotate = false;
46        magneetti.CollisionIgnoreGroup = 1;
47        Add( magneetti );
48
49        Keyboard.Listen( Key.Space, ButtonState.Pressed, VaihdaNapaisuus, null );
50        Keyboard.Listen( Key.Enter, ButtonState.Pressed, LisaaPallo, null );
51
52        Timer pyoritysAjastin = new Timer();
53        pyoritysAjastin.Interval = 0.05;
54        pyoritysAjastin.Trigger += new Timer.TriggerHandler( pyoritaMagneettia );
55        pyoritysAjastin.Start();
56
57        Timer lisaysAjastin = new Timer();
58        lisaysAjastin.Interval = 0.4;
59        lisaysAjastin.Trigger += new Timer.TriggerHandler( delegate { LisaaPallo(); } );
60        lisaysAjastin.Start();
61    }
62
63    void LisaaPallo()
64    {
65        PhysicsObject rautapallo = new PhysicsObject( 60, 60, Shape.Circle );
66        rautapallo.Color = Jypeli.Color.LightGray;
67        rautapallo.Mass = 100;
68        rautapallo.Hit( new Vector( RandomGen.NextDouble( -500, 500 ), RandomGen.NextDouble( -500, 500 ) ) );
69        rautapallo.X = RandomGen.NextDouble(Level.Left, Level.Right);
70        rautapallo.Y = RandomGen.NextDouble( Level.Bottom, Level.Top );
71        rautapallo.Tag = "pallo";
72        AddCollisionHandler( rautapallo, PalloTormaa );
73        Add( rautapallo );
74        pallot.Add( rautapallo );
75    }
76
77    void PalloTormaa(PhysicsObject pallo, PhysicsObject kohde)
78    {
79        if ( kohde.Tag.ToString() != "pallo" )
80            return;
81
82        Vector d = pallo.Position - kohde.Position;
83        Vector v = pallo.Velocity + kohde.Velocity;
84        Vector3 xnaV = new Vector3( (float)v.X, (float)v.Y, 1.0f );
85        Vector3 xnaD = new Vector3( (float)d.X, (float)d.Y, 1.0f );
86        Matrix xform = Matrix.CreateRotationZ( -(float)d.Angle.Radians );
87        Vector3 xnaV2 = Vector3.Transform( xnaV, xform );
88
89        //if ( v.Magnitude > 2000 )
90        if ( xnaV2.X > 3000 )
91        {
92            rajahdysSysteemi.AddEffect( pallo.Position, 30 );
93            rajahdysSysteemi.AddEffect( kohde.Position, 30 );
94            pallo.Destroy();
95            kohde.Destroy();
96        }
97    }
98
99    void VaihdaNapaisuus()
100    {
101        MagneettiVaraus = -MagneettiVaraus;
102        if ( MagneettiVaraus > 0 ) magneetti.Color = Jypeli.Color.Blue;
103        else magneetti.Color = Jypeli.Color.Red;
104    }
105
106    void pyoritaMagneettia( Timer sender )
107    {
108        Vector k = -magneetti.Position.Normalize();
109        magneetti.Acceleration = k * pyoritysNopeus * pyoritysNopeus / pyoritysSade;
110        magneetti.Velocity = Vector.FromLengthAndAngle( pyoritysNopeus, k.Angle + Angle.RightAngle );
111    }
112
113    void TeeReunat()
114    {
115        PhysicsObject vasen = Level.CreateLeftBorder();
116        vasen.CollisionIgnoreGroup = 1;
117        PhysicsObject oikea = Level.CreateRightBorder();
118        oikea.CollisionIgnoreGroup = 1;
119        PhysicsObject yla = Level.CreateTopBorder();
120        yla.CollisionIgnoreGroup = 1;
121        PhysicsObject ala = Level.CreateBottomBorder();
122        ala.CollisionIgnoreGroup = 1;
123    }
124
125    void SiirraMagneettia( AnalogState siirto )
126    {
127        magneetti.Position += siirto.MouseMovement;
128    }
129
130
131    protected override void Update( Time time )
132    {
133        for ( int i = 0; i < pallot.Count; i++ )
134        {
135            Kiihdyta( pallot[i], time );
136        }
137
138        base.Update( time );
139    }
140
141    protected void Kiihdyta(PhysicsObject rautapallo, Time time)
142    {
143        Vector d = rautapallo.Position - magneetti.Position;
144
145        if ( ignoreAika > 0 )
146        {
147            ignoreAika -= time.SinceLastUpdate.TotalSeconds;
148        }
149        else if ( d.Magnitude < rautapallo.Width )
150        {
151            rautapallo.Stop();
152            //rautapallo.Hit( d * 1000 );
153            //ignoreAika = 0.5;
154        }
155        else
156        {
157
158            double voima = CoulombKerroin * MagneettiVaraus * RautapalloVaraus / Math.Pow( d.Magnitude, 2 );
159            rautapallo.Push( voima * d.Normalize() );
160        }
161    }
162}
Note: See TracBrowser for help on using the repository browser.