source: 2010/24/arhetaka/EyeOfTheCommonRoach/EyeOfTheCommonRoach/Peli.cs @ 1538

Revision 1538, 13.3 KB checked in by arhetaka, 10 years ago (diff)

uusi peli!

Line 
1using System;
2using Jypeli;
3using Jypeli.Widgets;
4using Jypeli.Assets;
5
6public class Peli : PhysicsGame
7{
8       
9        PhysicsObject Etutahtain; // etutähtäin
10        PhysicsObject Takatahtain; // takatähtäin
11
12        double tahtaimenKoko = 50;
13        double VirheKerroin = 2; //miten paljon tähtäysvirhe vaikuuttaa osumaan, jatkossa riippuu ampumamatkasta
14
15        bool punaPistePaalla = false;
16        bool debug = true;
17        bool hairiot = true;
18            bool perusvapina = true;
19            bool kiertovapina = true;
20            bool tuuli = true;
21            bool muuttuvaTuuli = true;
22
23        //Hairiot
24        double vapinanLiikevoima = 500; // Randomin generaattorin maksimiarvo voimalle joka siirtää jatkuvasti tähtäintä
25        double vapinanTaajuus = 10; //kuinka usein tahtainta häiritään, suurempi luku -> vähemmän häiriötä, minimiarvo 1
26        double tuulenvaihteluTaajuus = 10; //kuinka usein tuuli muuttuu, suurempi luku -> vähemmän muutoskertoja, minimiarvo 1
27        double kiertoHairionLiikevoima = 0.1; //
28        double tuulenMaxVoima = 10; //tätä suurempaa tuulta ei tulekkaan
29        DoubleMeter tuulenVoima = new DoubleMeter(0); //arvotaan tuulen teossa jos tuuli on päällä
30       
31        //ohjaimet
32        double nappimistonOhjausNopeus = 1; //kuinka iso vektori liikuttaa tähtäintä näppäimistöltä ohjattaessa
33
34        double OhjaimenEdellinenX = 0; //hiiren edellinen X koordinaatti
35        double OhjaimenEdellinenY = 0; //hiiren edellinen Y koordinaatti
36        double ohjauksenNopeus = 0.1; //kerroin miten nopeasti hiiren liike liikuttaa tähtäintä
37        double hiirenHerkkyys = 1;
38        double TahtaimenKitka = 0.95;
39        bool tahtayssuunta = true; //true liike pelikuva, false arcade
40
41        double tahtaintenMaxEtaisyys = 50; //tämän kauemmas etutähtäin ei liiku takatähtäimestä
42
43        //debug kamaa
44        Label hiirenX;
45        Label hiirenY;
46        Label tuulenvoimakkuus;
47        Label tahtaintenEtaisyysNaytto;
48        DoubleMeter hiirenXlaskuri = new DoubleMeter(0); //debug
49        DoubleMeter hiirenYlaskuri = new DoubleMeter(0); //debug
50        DoubleMeter tahtaintenEtaisyysMittari = new DoubleMeter(0); //debug
51        GameObject PunaPiste = new GameObject(5, 5);
52       
53 
54
55
56        protected override void Begin()
57        {
58            if (debug)
59            {
60                TeeDebug();
61            }
62            TeeKentta();
63            TeeTaulu();
64            TeeTahtain();
65            TeeOhjaimet();
66        }
67        void TeeTaulu()
68        {
69            for (double a = 200; a > 10; a = a - 20)
70            {
71                TeeRengas(a, RandomGen.NextColor(), 0, 0);
72            }
73
74        }
75        void TeeRengas(double koko, Color vari, double X, double Y)
76        {
77            GameObject rengas = new GameObject(koko, koko);
78            rengas.Shape = Shapes.Circle;
79            rengas.Color = vari;
80            rengas.X = X;
81            rengas.Y = Y;
82            Add(rengas);
83        }
84
85        void TeeDebug()
86        {
87            hiirenX = new Label(); //debug
88            hiirenY = new Label(); //debug
89            tuulenvoimakkuus = new Label(); //debug
90            tahtaintenEtaisyysNaytto = new Label(); //debug
91
92            hiirenX.X = Screen.Left + 100;
93            hiirenY.X = Screen.Left + 100;
94            hiirenX.Y = Screen.Top - 50;
95            hiirenY.Y = Screen.Top - 100;
96            tuulenvoimakkuus.X = Screen.Right - 100;
97            tuulenvoimakkuus.Y = Screen.Top - 50;
98            tahtaintenEtaisyysNaytto.X = Screen.Right - 100;
99            tahtaintenEtaisyysNaytto.Y = Screen.Top - 100;
100
101            tahtaintenEtaisyysNaytto.BindTo(tahtaintenEtaisyysMittari);
102            tuulenvoimakkuus.BindTo(tuulenVoima);
103            hiirenX.BindTo(hiirenXlaskuri);
104            hiirenY.BindTo(hiirenYlaskuri);
105
106            Add(tahtaintenEtaisyysNaytto);
107            Add(tuulenvoimakkuus);
108            Add(hiirenX);
109            Add(hiirenY);
110            if (punaPistePaalla)
111            {
112                TeePunapiste();
113            }
114   
115        }
116    void TeePunapiste()
117        {
118            PunaPiste.Shape = Shapes.Circle;
119            PunaPiste.Color = Color.Red;
120            Add(PunaPiste, 1);
121        }
122
123    void TeeKentta()
124        {
125            Level.Background.Image = LoadImage("tausta");
126            Camera.ZoomToLevel();
127        }
128
129        void TeeTahtain()
130        {
131            Etutahtain = new PhysicsObject(tahtaimenKoko, tahtaimenKoko);
132            Etutahtain.Shape = Shapes.Rectangle;
133            Etutahtain.Color = Color.Red;
134            Etutahtain.LinearDamping = TahtaimenKitka;
135            Etutahtain.Image = LoadImage("etutahtain");
136            Etutahtain.IgnoresCollisionResponse = true;
137            Etutahtain.CanRotate = false;
138            Add(Etutahtain);
139
140            Takatahtain = new PhysicsObject(tahtaimenKoko, tahtaimenKoko);
141            Takatahtain.Shape = Shapes.Rectangle;
142            Takatahtain.Color = Color.Red;
143            Takatahtain.LinearDamping = TahtaimenKitka;
144            Takatahtain.Image = LoadImage("takatahtain");
145            Takatahtain.IgnoresCollisionResponse = true;
146            Takatahtain.CanRotate = false;
147            Add(Takatahtain);
148        }
149        void TeeVapinaa()
150        {
151            if (perusvapina)
152            {
153                if (RandomGen.NextDouble(0, 1) < (1 / vapinanTaajuus))
154                {
155                    //perustärinä
156                    Vector vapinaVektori = RandomGen.NextVector(Vector.Zero, Vector.FromLengthAndAngle(vapinanLiikevoima, RandomGen.NextAngle()));
157                    Etutahtain.Push(vapinaVektori);                   
158                }
159                if (RandomGen.NextDouble(0, 1) < (1 / vapinanTaajuus))
160                {
161                    //perustärinä
162                    Vector vapinaVektori = RandomGen.NextVector(Vector.Zero, Vector.FromLengthAndAngle(vapinanLiikevoima, RandomGen.NextAngle()));
163                    Etutahtain.Push(vapinaVektori);
164                    Takatahtain.Push(vapinaVektori);
165                }
166            }
167            if (kiertovapina)
168            {
169                /*
170                if (RandomGen.NextDouble(0, 1) < (1 / vapinanTaajuus))
171                {
172                    //kiertotärinä
173                    Etutahtain.AngularVelocity = RandomGen.NextDouble(-kiertoHairionLiikevoima, kiertoHairionLiikevoima);
174                }*/
175            }
176        }
177
178        void TeeOhjaimet()
179        {
180            //hiiri
181            Mouse.IsCursorVisible = true;
182            Mouse.ListenMovement(hiirenHerkkyys, KuunteleLiiketta, null);
183            Mouse.Listen(MouseButton.Left, ButtonState.Pressed, Laukaise, null);
184
185            //näppäimistö
186            Keyboard.Listen(Key.A, ButtonState.Down, LiikutaTahtainta, null, new Vector(-nappimistonOhjausNopeus, 0));
187            Keyboard.Listen(Key.D, ButtonState.Down, LiikutaTahtainta, null, new Vector(nappimistonOhjausNopeus, 0));
188            Keyboard.Listen(Key.S, ButtonState.Down, LiikutaTahtainta, null, new Vector(0, -nappimistonOhjausNopeus));
189            Keyboard.Listen(Key.W, ButtonState.Down, LiikutaTahtainta, null, new Vector(0, nappimistonOhjausNopeus));
190
191        }
192        void Laukaise()
193        {
194            Vector suunta = LaskeLaukauksenSuunta();
195            Vector osumakohta = LaskeOsumaKohta(suunta);
196            TeeOsuma(osumakohta.X, osumakohta.Y);
197        }
198        Vector LaskeOsumaKohta(Vector suunta)
199        {
200            Vector Osumakohta = new Vector();
201            Osumakohta.X = suunta.X * VirheKerroin;
202            //Osumakohta.Y = (suunta.Y + Takatahtain.Y) * VirheKerroin + (tahtaimenKoko / 2);//tähtäimen korkeudesta lisätään puolet, jotta osuma olisi oikealla korkeudella
203            Osumakohta.Y = suunta.Y * VirheKerroin;//tähtäimen korkeudesta lisätään puolet, jotta osuma olisi oikealla korkeudella
204            return Osumakohta;
205        }
206        void TeeOsuma(double osumanX, double osumanY)
207        {
208            GameObject osuma = new GameObject(10, 10);
209            osuma.Shape = Shapes.Circle;           
210            osuma.Color = RandomGen.NextColor();
211            osuma.X = osumanX;
212            osuma.Y = osumanY;
213            Add(osuma);
214        }
215
216        Vector LaskeLaukauksenSuunta()
217        {
218            double suuntaX = Etutahtain.X - Takatahtain.X;
219            double suuntaY = (Etutahtain.Y + (tahtaimenKoko / 2)) - (Takatahtain.Y + (tahtaimenKoko / 2));
220            Vector suuntaVektori = new Vector(suuntaX, suuntaY);
221            return suuntaVektori;
222        }
223
224           
225        void LiikutaTahtainta(Vector ohjainvektori) //liikutetaaan tähtäintä / tähtäimiä näppäimistöllä
226        {
227           
228                Etutahtain.Hit(ohjainvektori);
229                Takatahtain.Hit(ohjainvektori);           
230           
231        }
232
233        void KuunteleLiiketta(AnalogState hiirenTila)
234        {
235            double tahtaintenXetaisyys = Etutahtain.X - Takatahtain.X;
236            double tahtaintenYetaisyys = Etutahtain.Y - Takatahtain.Y;
237
238            if (tahtaintenXetaisyys < 0)
239            {
240                tahtaintenXetaisyys = tahtaintenXetaisyys * -1;
241            }
242            if (tahtaintenYetaisyys < 0)
243            {
244                tahtaintenYetaisyys = tahtaintenYetaisyys * -1;
245            }
246            double tahtaintenEtaisyys = tahtaintenXetaisyys + tahtaintenYetaisyys;
247            tahtaintenEtaisyysMittari.Value = tahtaintenEtaisyys;
248            if (tahtaintenEtaisyys < tahtaintenMaxEtaisyys) //jos etutahtain ei ole liian kaukana takatähtäimestä
249            {
250                if (OhjaimenEdellinenX == 0 && OhjaimenEdellinenY == 0)
251                {
252                    OhjaimenEdellinenX = Mouse.PositionOnWorld.X;
253                    OhjaimenEdellinenY = Mouse.PositionOnWorld.Y;
254                }
255                else
256                {
257                    Vector liikutus;
258                    if (tahtayssuunta) //liike hiiren peilikuvana
259                    {
260                        liikutus = new Vector((OhjaimenEdellinenX - Mouse.PositionOnWorld.X) * ohjauksenNopeus, (OhjaimenEdellinenY - Mouse.PositionOnWorld.Y) * ohjauksenNopeus);
261
262                    }
263                    else //liike samaan suuntaan kun hiirikin
264                    {
265                        liikutus = new Vector((Mouse.PositionOnWorld.X - OhjaimenEdellinenX) * ohjauksenNopeus, (Mouse.PositionOnWorld.Y - OhjaimenEdellinenY) * ohjauksenNopeus);
266                    }
267                    //Takatahtain.Hit(liikutus);
268                    Etutahtain.Hit(liikutus); // hiiri liikuttaa vain etutähtäintä
269                }                 
270            }
271            else // siirretään etutähtäintä takatähtäintä kohti
272            {
273                if (Etutahtain.X < Takatahtain.X)
274                {
275                    Etutahtain.X += 1;
276                }
277                else
278                {
279                    Etutahtain.X -= 1;
280                }
281
282                if (Etutahtain.Y < Takatahtain.Y)
283                {
284                    Etutahtain.Y += 1;
285                }
286                else
287                {
288                    Etutahtain.Y -= 1;
289                }
290            } 
291           
292            //nollataan kursorin paikka jos on ajelehtinut liian kauas keskeltä
293            if (Mouse.PositionOnWorld.X > 200 || Mouse.PositionOnWorld.X < -200)
294                {
295                   
296                //Mouse.PMouse.PositionOnWorld.X = 0;
297                //    OhjaimenEdellinenX = 0;
298                }
299            if (Mouse.PositionOnWorld.Y > 200 || Mouse.PositionOnWorld.Y < -200)
300                {
301                  //  Mouse.PositionOnWorld.Y = 0;
302                  //  OhjaimenEdellinenY = 0;
303                }
304            }
305        void TeeTuuli()
306        {
307            if (tuuli)
308            {
309                if (tuulenVoima.Value == 0) // pitää vielä tehdä korjaus että ei tapauksessa 0 lähde mihin sattuu
310                {
311                    tuulenVoima.Value += RandomGen.NextDouble(-tuulenMaxVoima, tuulenMaxVoima);                   
312                }
313                if (RandomGen.NextDouble(0,1) < (1 / tuulenvaihteluTaajuus))
314                {
315                    if (RandomGen.NextBool())
316                    {
317                        tuulenVoima.Value += 0.1;
318                    }
319                    else
320                    {
321                        tuulenVoima.Value -= 0.1;
322                    }
323                }
324            }
325        }
326        void piirraPunaPiste()
327        {
328            Vector suunta = LaskeLaukauksenSuunta();
329            Vector osumakohta = LaskeOsumaKohta(suunta);
330            PunaPiste.X = osumakohta.X;
331            PunaPiste.Y = osumakohta.Y;
332        }
333
334        protected override void Update(Time time)
335        {
336            if (hairiot)
337            {
338                TeeVapinaa(); //tekee häiriöt tähtäämiseen               
339                TeeTuuli();
340            }
341            if (punaPistePaalla)
342            {
343                piirraPunaPiste();
344            }
345            hiirenXlaskuri.Value = Mouse.PositionOnWorld.X;
346            hiirenYlaskuri.Value = Mouse.PositionOnWorld.Y;
347            base.Update(time);
348        }
349    }
350
Note: See TracBrowser for help on using the repository browser.