source: 2011/24/OtsoM/Crazy Bus/Crazy Bus/FysiikkaPeli/Peli.cs @ 2050

Revision 2050, 7.0 KB checked in by otkamiet, 10 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6using Physics2DDotNet.Joints;
7using Physics2DDotNet.Ignorers;
8
9
10
11
12
13/// <summary>
14/// Sivusta päin kuvattu auto, jossa on kaksi pyörää.
15/// </summary>
16class Auto : PhysicsObject
17{
18    public PhysicsObject vasenPyora;
19    public PhysicsObject oikeaPyora; 
20
21    public HingeJoint vasenLiitos;
22    public HingeJoint oikeaLiitos;
23
24    public Auto(double leveys, double korkeus)
25        : base(leveys, korkeus, Shape.Rectangle, CollisionShapeQuality.Best)
26    {
27        CollisionIgnorer = new ObjectIgnorer();
28        Mass = 1500;
29        AddedToGame += LisaaPyorat;
30    }
31
32    /// <summary>
33    /// Kiihdyttää.
34    /// </summary>
35    /// <remarks>
36    /// Vääntöä ei anneta suoraan parametrina, jotta kiihdytys toimii
37    /// helposti eri massoilla.
38    /// </remarks>
39    /// <param name="kiihtyvyys">Kiihtyvyys autolle</param>
40    public void Kiihdyta(double kiihtyvyys)
41    {
42        double kulmakiiht = kiihtyvyys * vasenPyora.Width / 2;
43        double hitaus = MomentOfInertia + vasenPyora.MomentOfInertia + oikeaPyora.MomentOfInertia;
44        double vaanto = kulmakiiht * hitaus;
45        double vaantoPerPyora = vaanto / 2;
46
47        vasenPyora.ApplyTorque(vaantoPerPyora);
48        oikeaPyora.ApplyTorque(vaantoPerPyora); 
49    }
50
51    void LisaaPyorat()
52    {
53        if (!(Game is PhysicsGame))
54            return;
55
56        Vector vasemmanAkselinPaikka = this.Position + new Vector(-Width / 4, -Height / 1.2);
57        Vector oikeanAkselinPaikka = this.Position + new Vector(Width / 4, -Height / 1.2);
58
59        vasenPyora = LuoPyora();
60        vasenPyora.Position = vasemmanAkselinPaikka;
61
62        oikeaPyora = LuoPyora();
63        oikeaPyora.Position = oikeanAkselinPaikka;
64
65
66        vasenLiitos = PhysicsGame.CreateHingeJoint(this, vasenPyora, vasemmanAkselinPaikka);
67        vasenLiitos.Softness = 0.001;
68        (Game as PhysicsGame).Add(vasenLiitos);
69
70        oikeaLiitos = PhysicsGame.CreateHingeJoint(this, oikeaPyora, oikeanAkselinPaikka);
71        oikeaLiitos.Softness = 0.001;
72        (Game as PhysicsGame).Add(oikeaLiitos);
73    }
74
75    public override void Destroy()
76    {
77        vasenLiitos.Lifetime.IsExpired = true;
78        oikeaLiitos.Lifetime.IsExpired = true;
79        vasenPyora.Destroy();
80        oikeaPyora.Destroy();
81        base.Destroy();
82    }
83
84    PhysicsObject LuoPyora()
85    {
86        double r = Height / 2;
87        PhysicsObject pyora = new PhysicsObject(2 * r, 2 * r, Shape.Circle);
88        pyora.Mass = this.Mass / 10;
89        pyora.Color = Color.Gray;
90        pyora.CollisionIgnorer = this.CollisionIgnorer;
91        pyora.AngularDamping = 0.95;
92        pyora.KineticFriction = 1.0;
93        (Game as PhysicsGame).Add(pyora);
94        return pyora;
95    }
96}
97
98
99
100
101class Peli : PhysicsGame
102{
103    Image Alastulonkuva = LoadImage("alastulo 2");
104    Image Lahdonkuva = LoadImage("Lahto");
105    Image Ylämäenkuva = LoadImage("ylämäki1");
106    Auto auto;
107    PhysicsObject Lahto;
108    public override void Begin()
109    {
110        Gravity = new Vector(0, -1000);
111
112        //PhysicsObject rata = PhysicsObject.CreateStaticObject(900, 200, Shape.FromImage(LoadImage("rata 2")), CollisionShapeQuality.FromValue(1.0));
113        //Add(rata);
114        //rata.Shape = Shape.FromImage(LoadImage("rata 2"));
115        //rata.Image = LoadImage("rata 2");
116        PhysicsObject bus = new PhysicsObject(80, 33, Shape.Rectangle, CollisionShapeQuality.Best);
117        bus.Position = new Vector(-250, 0);
118        //Add(bus);
119        bus.Image = LoadImage("bus 1");
120
121        Camera.ZoomFactor = 1.5;
122
123
124
125
126
127        Luokentta();
128        auto = new Auto(150, 40);
129        auto.Color = Color.Red;
130        auto.X = Lahto.X;
131        auto.Y = Lahto.Y + 100;
132        Camera.Follow(auto);
133        Add(auto);
134        AsetaOhjaimet();
135    }
136
137
138    void AsetaOhjaimet()
139    {
140        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistu");
141        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
142
143        Keyboard.Listen(Key.Left, ButtonState.Down, auto.Kiihdyta, "Aja vasemmalle", 0.8);
144        Keyboard.Listen(Key.Right, ButtonState.Down, auto.Kiihdyta, "Aja oikealle", -0.8);
145    }
146
147
148    void Luokentta()
149    {
150        TileMap ruudut = TileMap.FromFile("rata paras 4.txt");
151
152
153
154
155        ruudut.SetTileMethod('H', LuoIsoHyppyri);
156        ruudut.SetTileMethod('A', LuoAlastulo);
157        //ruudut.SetTileMethod('K', LuoIsoKumpu);
158        //ruudut.SetTileMethod('G', LuoMaali);
159        //ruudut.SetTileMethod('D', LuoIsoMakiAlas);
160        ruudut.SetTileMethod('Y', LuoIsoMakiYlös);
161        ruudut.SetTileMethod('L', LuoLahto);
162        ruudut.SetTileMethod('M', LuoMaa);
163        ruudut.Execute(50, 50);
164
165
166
167
168    }
169
170    void LuoIsoHyppyri(Vector paikka, double leveys, double korkeus)
171    {
172        PhysicsObject IsoHyppyri = PhysicsObject.CreateStaticObject(leveys, korkeus, Shape.FromImage(LoadImage("hyppyri")), CollisionShapeQuality.Best);
173        IsoHyppyri.Image = LoadImage("hyppyri");
174        IsoHyppyri.Position = paikka;
175        IsoHyppyri.Size = new Vector(leveys * 3, korkeus);
176        IsoHyppyri.Color = Color.DarkOrange;
177        Add(IsoHyppyri);
178    }
179
180
181
182    void LuoMaa(Vector paikka, double leveys, double korkeus)
183    {
184
185
186        PhysicsObject Maa = PhysicsObject.CreateStaticObject(leveys, korkeus);
187        Maa.Position = paikka;
188        Maa.Shape = Shape.Rectangle;
189        Maa.Color = Color.LightPink;
190        Add(Maa);
191
192    }
193
194    void LuoLahto(Vector paikka, double leveys, double korkeus)
195    {
196        Lahto = PhysicsObject.CreateStaticObject(300, korkeus, Shape.FromImage(Lahdonkuva), CollisionShapeQuality.Best);
197        Lahto.Position = paikka;
198        Lahto.Image = Lahdonkuva;
199
200        Lahto.Color = Color.MediumVioletRed;
201        Add(Lahto);
202    }
203
204
205    void LuoSmooth(Vector paikka, double leveys, double korkeus)
206    {
207        PhysicsObject Smooth = PhysicsObject.CreateStaticObject(leveys, korkeus);
208        Smooth.Position = paikka;
209        Smooth.Shape = Shape.Rectangle;
210        Smooth.Color = Color.SkyBlue;
211        Add(Smooth);
212    }
213
214
215
216
217    void LuoAlastulo(Vector paikka, double leveys, double korkeus)
218    {
219        PhysicsObject alastulo = PhysicsObject.CreateStaticObject(200, korkeus, Shape.FromImage(Alastulonkuva), CollisionShapeQuality.Best);
220        alastulo.Position = paikka;
221        Add(alastulo);
222        alastulo.Image = Alastulonkuva;
223
224    }
225
226
227
228    void LuoIsoMakiYlös(Vector paikka, double leveys, double korkeus)
229    {
230        PhysicsObject IsoMakiYlös = PhysicsObject.CreateStaticObject(leveys * 8, korkeus * 4, Shape.FromImage(LoadImage("ylämäki1")), CollisionShapeQuality.Best);
231        IsoMakiYlös.Position = new Vector(paikka.X, paikka.Y + IsoMakiYlös.Height / 2-leveys/2);
232        IsoMakiYlös.Image = LoadImage("ylämäki1");
233        //IsoMakiYlös.Color = Color.Transparent;
234        Add(IsoMakiYlös);
235    }
236}
Note: See TracBrowser for help on using the repository browser.