source: 2010/31/tutohaml/Tankkipeli1/Peli.cs @ 1651

Revision 1651, 8.4 KB checked in by tutohaml, 9 years ago (diff)
Line 
1
2
3using System;
4using Jypeli;
5using Jypeli.Assets;
6using Jypeli.Widgets;
7
8
9// Pelissä on kaksi tankkia
10
11    public class Peli : PhysicsGame
12    {
13        Tank tankki1;
14        Tank tankki2;
15
16        protected override void Begin()
17        {
18            AloitaPeli();
19        }
20
21        void AloitaPeli()
22        {
23            ClearAll();
24
25            LuoKentta();
26           
27            asetaOhjaimet();
28
29            this.Camera.ZoomToLevel();
30            this.Gravity = new Vector(0, -100);
31
32            ShowControlHelp();
33        }
34
35 
36
37        void LuoKentta()
38        {
39            Level.CreateBorders();
40            Level.CreateGround(200, 250, 35, 20);
41
42            tankki1 = new Tank( 30, 10 );
43            tankki1.Mass = 500;
44            tankki1.X = Level.Right + -30;
45            tankki1.Y = Level.Bottom + 270;
46            tankki1.Cannon.Angle = Angle.Degrees( 0 );
47            tankki1.Cannon.CannonBallCollision = AmmusOsuu;
48            tankki1.Ammo.Value = 1000000000;
49            Add( tankki1 );
50
51            tankki2 = new Tank( 30, 10 );
52            tankki2.Mass = 500;
53            tankki2.X = Level.Left + 30;
54            tankki2.Y = Level.Bottom + 270;
55            tankki2.Cannon.Angle = Angle.Degrees( 180 );
56            tankki2.Cannon.CannonBallCollision = AmmusOsuu;
57            tankki2.Ammo.Value = 1000000000;
58            Add( tankki2 );
59        }
60
61        void AmmusOsuu( PhysicsObject ammus, PhysicsObject kohde )
62        {
63            ammus.Destroy();
64            Explosion kaBoom = new Explosion( 250 );
65            kaBoom.Position = ammus.Position;
66            Add( kaBoom );
67
68            if ( kohde is Tank )
69            {
70                Tank tankki = (Tank)kohde;
71                tankki.HitPoints.Value -= 1;
72            }
73        }
74
75        void luoEste( double leveys, double korkeus, double massa, double x, double y, string image )
76        {
77            PhysicsObject este = new PhysicsObject( leveys, korkeus, Shapes.Rectangle, CollisionShapeQuality.Good );
78            este.Mass = massa;
79            este.Y = y;
80            este.Y = y;
81            Add( este );
82        }
83
84        void luoKuulia( double keskipisteX, double alkuY, int maaraX, int maaraY, int koko )
85        {
86            for ( int x = 0; x < maaraX; x++ )
87            {
88                for ( int y = 0; y < maaraY; y++ )
89                {
90                    CannonBall kuula = new CannonBall( koko / 2 );
91                    AddCollisionHandler( kuula, KuulaOsuu );
92                    kuula.Y = alkuY + y * ( koko );
93                    kuula.X = keskipisteX - koko * ( maaraX - 1 ) / 2 + x * koko;
94                    Add( kuula );
95                }
96            }
97        }
98
99        void KuulaOsuu( PhysicsObject kuula, PhysicsObject kohde )
100        {
101            if ( kohde is Tank )
102            {
103                Explosion rajahdys = new Explosion( 100 );
104                rajahdys.Position = kuula.Position;
105                Add( rajahdys );
106                Tank tankki = (Tank)kohde;
107                tankki.HitPoints.Value -= 1;
108                kuula.Destroy();
109            }
110        }
111
112
113        void luoPuita( double keskipisteX, double alkuY, int puidenMaara, int kokoX, int kokoY, int puidenVali )
114     
115            {
116               
117           
118        }
119
120
121        void asetaOhjaimet()
122        {
123            double vaanto = 1.0;
124
125            Keyboard.Listen( Key.Escape, ButtonState.Pressed, Exit, "Lopeta peli" );
126            Keyboard.Listen( Key.F5, ButtonState.Pressed, AloitaPeli, "Aloita peli" );
127
128            Keyboard.Listen( Key.E, ButtonState.Down, ViritaTykki, "Pelaaja1: Ammu", tankki1 );
129            Keyboard.Listen( Key.E, ButtonState.Released, tankki1.Shoot, null );
130            Keyboard.Listen( Key.W, ButtonState.Down, KaannaPutkea, "Pelaaja1: Käännä tykkiä vasemmalle", tankki1, 1 );
131            Keyboard.Listen( Key.S, ButtonState.Down, KaannaPutkea, "Pelaaja1: Käännä tykkiä oikealle", tankki1, -1 );
132            Keyboard.Listen( Key.A, ButtonState.Down, AjaTankkia, "pelaaja1: Aja tankkia vasemmalle", tankki1, vaanto );
133            Keyboard.Listen( Key.D, ButtonState.Down, AjaTankkia, "pelaaja1: Aja tankkia oikealle", tankki1, -vaanto );
134            Keyboard.Listen( Key.R, ButtonState.Pressed, KaannaTankkiYmpari, "Pelaaja1: Käännä tankki ympäri", tankki1 );
135
136            Keyboard.Listen( Key.Delete, ButtonState.Down, ViritaTykki, "Pelaaja2: Ammu", tankki2 );
137            Keyboard.Listen( Key.Delete, ButtonState.Released, tankki2.Shoot, null );
138            Keyboard.Listen( Key.Up, ButtonState.Down, KaannaPutkea, "Pelaaja2: Käännä tykkiä vasemmalle", tankki2, -1 );
139            Keyboard.Listen( Key.Down, ButtonState.Down, KaannaPutkea, "Pelaaja2: Käännä tykkiä oikealle", tankki2, 1 );
140            Keyboard.Listen( Key.Left, ButtonState.Down, AjaTankkia, "pelaaja2: Aja tankkia vasemmalle", tankki2, vaanto );
141            Keyboard.Listen( Key.Right, ButtonState.Down, AjaTankkia, "pelaaja2: Aja tankkia oikealle", tankki2, -vaanto );
142            Keyboard.Listen( Key.PageDown, ButtonState.Pressed, KaannaTankkiYmpari, "Pelaaja2: Käännä tankki ympäri", tankki2 );
143            Keyboard.Listen( Key.PageDown, ButtonState.Pressed, KaannaTankkiYmpari, "Pelaaja2: Käännä tankki ympäri", tankki1
144);
145            asetaGamePadOhjaimet( ControllerOne, tankki1 );
146            asetaGamePadOhjaimet( ControllerTwo, tankki2 );
147        }
148
149
150        void asetaGamePadOhjaimet( GamePad padi, Tank tankki )
151        {
152            padi.Listen( Button.Start, ButtonState.Down, AloitaPeli, "Aloita peli" );
153            padi.Listen( Button.Back, ButtonState.Down, Exit, "Lopeta peli" );
154
155            padi.ListenAnalog( AnalogControl.LeftStick, 0.1, AjaTankkiaAnalogisesti, "Aja tankkia", tankki );
156            padi.ListenAnalog( AnalogControl.RightStick, 0.1, KaannaPutkeaAnalogisesti, "Käännä tykkiä", tankki );
157            padi.ListenAnalog( AnalogControl.RightTrigger, 0.1, ViritaTykkiAnalogisesti, "Ammu", tankki );
158            padi.Listen( Button.Y, ButtonState.Pressed, KaannaTankkiYmpari, "Käännä tankki ympäri", tankki );
159            padi.Listen( Button.DPadLeft, ButtonState.Down, KaannaPutkea, "Käännä tykkiä vasemmalle", tankki, 1 );
160            padi.Listen( Button.DPadRight, ButtonState.Down, KaannaPutkea, "Käännä tykkiä oikealle", tankki, -1 );
161            padi.Listen( Button.RightTrigger, ButtonState.Released, tankki.Shoot, "Ammu" );
162            padi.Listen( Button.A, ButtonState.Pressed, ViritaTykki, "Ammu", tankki );
163            padi.Listen( Button.A, ButtonState.Released, tankki.Shoot, null );
164            padi.Listen( Button.RightShoulder, ButtonState.Pressed, ViritaTykki, "Ammu", tankki );
165            padi.Listen( Button.RightShoulder, ButtonState.Released, tankki.Shoot, null );
166        }
167
168        void ViritaTykki( Tank tankki )
169        {
170            tankki.Cannon.Power.Value += 20 * Time.RealTimeSinceLastUpdate.TotalMilliseconds;
171        }
172
173
174        void ViritaTykkiAnalogisesti( AnalogState a, Tank tankki )
175        {
176            double voima = 10000 * a.State;
177         
178            if ( voima > tankki.Cannon.Power.Value )
179            {
180                tankki.Cannon.Power.Value = voima;
181            }
182        }
183
184        void KaannaPutkea( Tank tankki, int suunta )
185        {
186            Angle pyorimisNopeus = Angle.Radians( 1 );
187            double sekuntejaKulunut = Time.SinceLastUpdate.TotalSeconds;
188            tankki.Cannon.Angle += suunta * pyorimisNopeus * sekuntejaKulunut;
189        }
190
191
192        void KaannaPutkeaAnalogisesti( AnalogState a, Tank tankki )
193        {
194            double angle = a.State;
195            double newAngle = -angle * Math.PI / 1.5 + Math.PI / 2;
196
197            tankki.Cannon.Angle = Angle.Radians( newAngle );
198        }
199
200
201        void KaannaTankkiYmpari( Tank tankki )
202        {
203            tankki.Stop();
204            tankki.Angle = Angle.Zero;
205        }
206
207
208        void AjaTankkia( Tank tankki, double vaanto )
209        {
210            tankki.Accelerate( vaanto );
211        }
212
213
214        void AjaTankkiaAnalogisesti( AnalogState a, Tank tankki )
215        {
216            Vector force = a.StateVector;
217            double torque = -( a.StateVector.X );
218            tankki.Accelerate( torque );
219            MessageDisplay.Clear();
220            MessageDisplay.Add( String.Format( "{0:F0} {1:F0}", force.X, force.Y ) );
221            MessageDisplay.Add( String.Format( "{0:F0}", torque ) );
222        }
223    }
Note: See TracBrowser for help on using the repository browser.