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

Revision 1650, 19.2 KB checked in by arhetaka, 12 years ago (diff)

uusi peli, PUUSILIMÄ!

Line 
1using System;
2using Jypeli;
3using Jypeli.Widgets;
4using Jypeli.Assets;
5using Jypeli.Effects;
6
7public class Peli : PhysicsGame
8{
9       
10        PhysicsObject Etutahtain; // etutähtäin
11        PhysicsObject Takatahtain; // takatähtäin
12
13        double taulunkoko = 100; // jatkossa riippuu etäisyydestä
14        double taulurenkaidenLukumaara = 10;
15   
16        double tahtaimenKoko = 100;
17        double VirheKerroin = 2; //miten paljon tähtäysvirhe vaikuuttaa osumaan, jatkossa riippuu ampumamatkasta
18
19        int tulinopeus = 600; //vaikuttaa sarjatuleen ei toimi vielä hyvin
20        int tulinopeuden_temp = 0; //apumuuttuja
21
22        bool zoom = false;
23
24        bool tulostaulu = true;
25            double tulostaulunkoko = 200;
26            double TulostaulunX = -250;
27            double TulostaulunY = -150;
28
29        bool sarjatuli = false;
30        bool punaPistePaalla = true;
31        bool savut = true;
32        bool debug = true;
33        bool hairiot = true;
34            bool perusvapina = true;
35            bool kiertovapina = true;
36            bool tuuli = true;
37            bool muuttuvaTuuli = true;
38
39        //Hairiot
40        double vapinanLiikevoima = 500; // Randomin generaattorin maksimiarvo voimalle joka siirtää jatkuvasti tähtäintä
41        double vapinanTaajuus = 10; //kuinka usein tahtainta häiritään, suurempi luku -> vähemmän häiriötä, minimiarvo 1
42        double tuulenvaihteluTaajuus = 10; //kuinka usein tuuli muuttuu, suurempi luku -> vähemmän muutoskertoja, minimiarvo 1
43        double kiertoHairionLiikevoima = 0.1; //
44        double tuulenMaxVoima = 10; //tätä suurempaa tuulta ei tulekkaan
45        DoubleMeter tuulenVoima = new DoubleMeter(0); //arvotaan tuulen teossa jos tuuli on päällä
46        double tuulenSavuKerroin = 5; // tällä säädetään tuulen vaikutusta savuihin
47       
48        //ohjaimet
49        double nappimistonOhjausNopeus = 1; //kuinka iso vektori liikuttaa tähtäintä näppäimistöltä ohjattaessa
50
51        double OhjaimenEdellinenX = 0; //hiiren edellinen X koordinaatti
52        double OhjaimenEdellinenY = 0; //hiiren edellinen Y koordinaatti
53        double ohjauksenNopeus = 1.0; //kerroin miten nopeasti hiiren liike liikuttaa tähtäintä
54        double hiirenHerkkyys = 0.01;
55        double TahtaimenKitka = 0.95;
56        bool tahtayssuunta = true; //true liike pelikuva, false arcade
57
58        double tahtaintenMaxEtaisyys = 200; //tämän kauemmas etutähtäin ei liiku takatähtäimestä
59
60        Smoke savu;
61        Smoke savu2;
62
63        SoundEffect kk;
64        SoundEffect kimmoke3;
65        SoundEffect kimmoke2;
66
67        Label tulosNaytto;
68        DoubleMeter pistelaskuri;
69
70        //debug kamaa
71        Label hiirenX;
72        Label hiirenY;
73        Label tuulenvoimakkuus;
74        Label tahtaintenEtaisyysNaytto;
75        DoubleMeter hiirenXlaskuri = new DoubleMeter(0); //debug
76        DoubleMeter hiirenYlaskuri = new DoubleMeter(0); //debug
77        DoubleMeter tahtaintenEtaisyysMittari = new DoubleMeter(0); //debug
78        GameObject PunaPiste = new GameObject(3, 3);
79        GameObject ohjainNuoli = new GameObject(10, 100);
80       
81 
82
83
84        protected override void Begin()
85        {
86            if (debug)
87            {
88                TeeDebug();
89            }
90            TeeKentta();
91            if (tulostaulu)
92            {
93                TeeTulostaulu();
94            }
95            TeeTaulu();
96            TeeTahtain();
97            TeeOhjaimet();
98        }
99        void TeeTaulu()
100        {
101            for (double a = taulunkoko; a >= (taulunkoko / taulurenkaidenLukumaara); a = a - (taulunkoko / taulurenkaidenLukumaara))
102            {
103                TeeRengas(a, RandomGen.NextColor(), 0, 0);           
104            }
105
106        }
107        void TeeRengas(double koko, Color vari, double X, double Y)
108        {
109            GameObject rengas = new GameObject(koko, koko);
110            rengas.Shape = Shapes.Circle;
111            rengas.Color = vari;
112            rengas.X = X;
113            rengas.Y = Y;
114            Add(rengas);
115        }
116       
117        void TeeTulostaulu()
118        {
119            for (double a = tulostaulunkoko; a >= (tulostaulunkoko / taulurenkaidenLukumaara); a = a - (tulostaulunkoko / taulurenkaidenLukumaara))
120            {
121                TeeRengas(a, RandomGen.NextColor(), TulostaulunX, TulostaulunY);
122            }           
123        }
124        void TeeDebug()
125        {
126            hiirenX = new Label(); //debug
127            hiirenY = new Label(); //debug
128            tuulenvoimakkuus = new Label(); //debug
129            tahtaintenEtaisyysNaytto = new Label(); //debug
130
131            hiirenX.X = Screen.Left + 100;
132            hiirenY.X = Screen.Left + 100;
133            hiirenX.Y = Screen.Top - 50;
134            hiirenY.Y = Screen.Top - 100;
135            tuulenvoimakkuus.X = Screen.Right - 100;
136            tuulenvoimakkuus.Y = Screen.Top - 50;
137            tahtaintenEtaisyysNaytto.X = Screen.Right - 100;
138            tahtaintenEtaisyysNaytto.Y = Screen.Top - 100;
139
140            tahtaintenEtaisyysNaytto.BindTo(tahtaintenEtaisyysMittari);
141            tuulenvoimakkuus.BindTo(tuulenVoima);
142            hiirenX.BindTo(hiirenXlaskuri);
143            hiirenY.BindTo(hiirenYlaskuri);
144
145            Add(tahtaintenEtaisyysNaytto);
146            Add(tuulenvoimakkuus);
147            Add(hiirenX);
148            Add(hiirenY);
149            if (punaPistePaalla)
150            {
151                TeePunapiste();
152            }
153            ohjainNuoli.Color = Color.Red;
154            ohjainNuoli.Image = LoadImage("nuoli");
155            ohjainNuoli.X = -200;
156            Add(ohjainNuoli);
157   
158        }
159    void TeePunapiste()
160        {
161            PunaPiste.Shape = Shapes.Circle;
162            PunaPiste.Color = Color.Red;
163            Add(PunaPiste, 1);
164        }
165
166    void TeeKentta()
167        {
168            Level.Background.Image = LoadImage("tausta");
169            kk = LoadSoundEffect("kk");
170            kimmoke3 = LoadSoundEffect("kimmoke3");
171            kimmoke2 = LoadSoundEffect("kimmoke2");
172
173            pistelaskuri = new DoubleMeter(0);
174       
175            tulosNaytto = new Label();
176            tulosNaytto.BindTo(pistelaskuri);
177            tulosNaytto.X = 0;
178            tulosNaytto.Y = Screen.Top - 100;
179            Add(tulosNaytto);
180
181            if (tuuli)
182            {
183                TeeTuuli();
184            }
185            if (savut)
186            {
187                savu = new Smoke(tuulenVoima.Value * tuulenSavuKerroin);
188                savu.Position = new Vector(Screen.Left + 300, 0);
189                Add(savu);
190                savu2 = new Smoke(tuulenVoima.Value * tuulenSavuKerroin);
191                savu2.Position = new Vector(Screen.Right - 300, 0);
192                Add(savu2);
193            }
194            Camera.ZoomToLevel();
195        }
196
197        void TeeTahtain()
198        {
199           
200            Etutahtain = new PhysicsObject(tahtaimenKoko, tahtaimenKoko);
201            Etutahtain.Shape = Shapes.Rectangle;
202            Etutahtain.Color = Color.Red;
203            Etutahtain.LinearDamping = TahtaimenKitka;
204            Etutahtain.Image = LoadImage("etutahtain");
205            Etutahtain.IgnoresCollisionResponse = true;
206            Etutahtain.CanRotate = false;
207            Add(Etutahtain);
208           
209            Takatahtain = new PhysicsObject(tahtaimenKoko, tahtaimenKoko);
210            Takatahtain.Shape = Shapes.Rectangle;
211            Takatahtain.Color = Color.Red;
212            Takatahtain.LinearDamping = TahtaimenKitka;
213            Takatahtain.Image = LoadImage("takatahtain");
214            Takatahtain.IgnoresCollisionResponse = true;
215            Takatahtain.CanRotate = false;
216            Add(Takatahtain);
217        }
218    void TuhoaTahtaimet()
219    {
220        Remove(Etutahtain);
221        Remove(Takatahtain);
222    }
223        void TeeVapinaa()
224        {
225            if (perusvapina)
226            {
227                if (RandomGen.NextDouble(0, 1) < (1 / vapinanTaajuus))
228                {
229                    //perustärinä
230                    Vector vapinaVektori = RandomGen.NextVector(Vector.Zero, Vector.FromLengthAndAngle(vapinanLiikevoima, RandomGen.NextAngle()));
231                    Etutahtain.Push(vapinaVektori);                   
232                }
233                if (RandomGen.NextDouble(0, 1) < (1 / vapinanTaajuus))
234                {
235                    //perustärinä
236                    Vector vapinaVektori = RandomGen.NextVector(Vector.Zero, Vector.FromLengthAndAngle(vapinanLiikevoima, RandomGen.NextAngle()));
237                    Etutahtain.Push(vapinaVektori);
238                    Takatahtain.Push(vapinaVektori);
239                }
240            }
241            if (kiertovapina)
242            {
243                /*
244                if (RandomGen.NextDouble(0, 1) < (1 / vapinanTaajuus))
245                {
246                    //kiertotärinä
247                    Etutahtain.AngularVelocity = RandomGen.NextDouble(-kiertoHairionLiikevoima, kiertoHairionLiikevoima);
248                }*/
249            }
250        }
251
252        void TeeOhjaimet()
253        {
254            //hiiri
255            Mouse.IsCursorVisible = true;
256            Mouse.ListenMovement(hiirenHerkkyys, KuunteleLiiketta, null);
257            if (sarjatuli)
258            {
259                Mouse.Listen(MouseButton.Left, ButtonState.Down, Laukaise, null);
260            }
261            else
262            {
263                Mouse.Listen(MouseButton.Left, ButtonState.Pressed, Laukaise, null);
264            }
265
266            //näppäimistö
267            Keyboard.Listen(Key.A, ButtonState.Down, LiikutaTahtainta, null, new Vector(-nappimistonOhjausNopeus, 0));
268            Keyboard.Listen(Key.D, ButtonState.Down, LiikutaTahtainta, null, new Vector(nappimistonOhjausNopeus, 0));
269            Keyboard.Listen(Key.S, ButtonState.Down, LiikutaTahtainta, null, new Vector(0, -nappimistonOhjausNopeus));
270            Keyboard.Listen(Key.W, ButtonState.Down, LiikutaTahtainta, null, new Vector(0, nappimistonOhjausNopeus));
271           
272            Keyboard.Listen(Key.Z, ButtonState.Pressed, ToogleZoom, null);
273
274            Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, null);
275
276        }
277        void Laukaise()
278        {
279            if (sarjatuli)
280            {
281               
282                if (RandomGen.NextDouble(0, 30) < (tulinopeus / 30) )
283                {
284                    Vector suunta = LaskeLaukauksenSuunta();
285                    Vector osumakohta = LaskeOsumaKohta(suunta);
286                    TeeOsuma(osumakohta.X, osumakohta.Y);
287                    kk.Play();
288                }
289            }
290            else
291            {
292                Vector suunta = LaskeLaukauksenSuunta();
293                Vector osumakohta = LaskeOsumaKohta(suunta);
294                double tulos = tarkistaPisteet(osumakohta);
295                ilmoitaTulos(tulos);
296                //tehdään reikä tauluun tai tulostauluun
297                if (tulostaulu)
298                {
299                    osumakohta.X = osumakohta.X * (tulostaulunkoko / taulunkoko);
300                    osumakohta.Y = osumakohta.Y * (tulostaulunkoko / taulunkoko);
301                    osumakohta.X = osumakohta.X + TulostaulunX;
302                    osumakohta.Y = osumakohta.Y + TulostaulunY;
303                    Vector osumanEtaisyys = new Vector(osumakohta.X - TulostaulunX, osumakohta.Y - TulostaulunY);
304                    //double etaisyys = osumanEtaisyys.Magnitude;
305                    if (osumanEtaisyys.Magnitude < (tulostaulunkoko / 2))
306                    {
307                        TeeOsuma(osumakohta.X, osumakohta.Y);
308                    }
309                }
310                else
311                {
312                    TeeOsuma(osumakohta.X, osumakohta.Y);
313                }               
314               
315
316                kk.Play();
317                if (RandomGen.NextDouble(0, 20) < 1)
318                {
319                    kimmoke3.Play();
320                }
321                else if (RandomGen.NextDouble(0, 20) < 1)
322                {
323                    kimmoke2.Play();
324                }
325               
326            }
327           
328        }
329        Vector LaskeOsumaKohta(Vector suunta)
330        {
331            Vector Osumakohta = new Vector();
332            Osumakohta.X = Takatahtain.X + (suunta.X * VirheKerroin);
333            //Osumakohta.Y = (suunta.Y + Takatahtain.Y) * VirheKerroin + (tahtaimenKoko / 2);//tähtäimen korkeudesta lisätään puolet, jotta osuma olisi oikealla korkeudella
334            Osumakohta.Y = Takatahtain.Y + (suunta.Y * VirheKerroin);//tähtäimen korkeudesta lisätään puolet, jotta osuma olisi oikealla korkeudella
335            return Osumakohta;
336        }
337        void TeeOsuma(double osumanX, double osumanY)
338        {
339            GameObject osuma = new GameObject(3, 3);
340            osuma.Shape = Shapes.Circle;           
341            //osuma.Color = RandomGen.NextColor();
342            osuma.Color = Color.Black;
343            osuma.X = osumanX;
344            osuma.Y = osumanY;           
345            Add(osuma);
346        }
347
348        Vector LaskeLaukauksenSuunta()
349        {
350            double suuntaX = Etutahtain.X - Takatahtain.X;
351            double suuntaY = (Etutahtain.Y + (tahtaimenKoko / 2)) - (Takatahtain.Y + (tahtaimenKoko / 2));
352            Vector suuntaVektori = new Vector(suuntaX, suuntaY);
353            return suuntaVektori;
354        }
355
356           
357        void LiikutaTahtainta(Vector ohjainvektori) //liikutetaaan tähtäintä / tähtäimiä näppäimistöllä
358        {
359           
360                Etutahtain.Hit(ohjainvektori);
361                Takatahtain.Hit(ohjainvektori);           
362           
363        }
364
365        void KuunteleLiiketta(AnalogState hiirenTila)
366        {
367            double tahtaintenXetaisyys = Etutahtain.X - Takatahtain.X;
368            double tahtaintenYetaisyys = Etutahtain.Y - Takatahtain.Y;
369
370            if (tahtaintenXetaisyys < 0)
371            {
372                tahtaintenXetaisyys = tahtaintenXetaisyys * -1;
373            }
374            if (tahtaintenYetaisyys < 0)
375            {
376                tahtaintenYetaisyys = tahtaintenYetaisyys * -1;
377            }
378            double tahtaintenEtaisyys = tahtaintenXetaisyys + tahtaintenYetaisyys;
379            tahtaintenEtaisyysMittari.Value = tahtaintenEtaisyys;
380            if (tahtaintenEtaisyys < tahtaintenMaxEtaisyys) //jos etutahtain ei ole liian kaukana takatähtäimestä
381            {
382                if (OhjaimenEdellinenX == 0 && OhjaimenEdellinenY == 0)
383                {
384                    OhjaimenEdellinenX = Mouse.PositionOnScreen.X;
385                    OhjaimenEdellinenY = Mouse.PositionOnScreen.Y;
386                }
387                else
388                {
389                    Vector liikutus;
390                    if (tahtayssuunta) //liike hiiren peilikuvana
391                    {
392                        liikutus = new Vector((OhjaimenEdellinenX - Mouse.PositionOnScreen.X) * ohjauksenNopeus, (OhjaimenEdellinenY - Mouse.PositionOnScreen.Y) * ohjauksenNopeus);
393
394                    }
395                    else //liike samaan suuntaan kun hiirikin
396                    {
397                        liikutus = new Vector((Mouse.PositionOnScreen.X - OhjaimenEdellinenX) * ohjauksenNopeus, (Mouse.PositionOnScreen.Y - OhjaimenEdellinenY) * ohjauksenNopeus);
398                    }
399                    //Takatahtain.Hit(liikutus);
400                    ohjainNuoli.Angle = liikutus.Angle - Angle.RightAngle;
401                    Etutahtain.Hit(liikutus); // hiiri liikuttaa vain etutähtäintä
402                }                 
403            }
404            else // siirretään etutähtäintä takatähtäintä kohti
405            {
406                if (Etutahtain.X < Takatahtain.X)
407                {
408                    Etutahtain.X += 1;
409                }
410                else
411                {
412                    Etutahtain.X -= 1;
413                }
414
415                if (Etutahtain.Y < Takatahtain.Y)
416                {
417                    Etutahtain.Y += 1;
418                }
419                else
420                {
421                    Etutahtain.Y -= 1;
422                }
423            } 
424           
425            //nollataan kursorin paikka jos on ajelehtinut liian kauas keskeltä
426            if (Mouse.PositionOnWorld.X > 200 || Mouse.PositionOnWorld.X < -200)
427                {
428                   
429                //Mouse.PMouse.PositionOnWorld.X = 0;
430                //    OhjaimenEdellinenX = 0;
431                }
432            if (Mouse.PositionOnWorld.Y > 200 || Mouse.PositionOnWorld.Y < -200)
433                {
434                  //  Mouse.PositionOnWorld.Y = 0;
435                  //  OhjaimenEdellinenY = 0;
436                }
437            OhjaimenEdellinenX = Mouse.PositionOnScreen.X;
438            OhjaimenEdellinenY = Mouse.PositionOnScreen.Y;
439            }
440        void TeeTuuli()
441        {
442            if (tuuli)
443            {
444                if (tuulenVoima.Value == 0) // pitää vielä tehdä korjaus että ei tapauksessa 0 lähde mihin sattuu
445                {
446                    tuulenVoima.Value += RandomGen.NextDouble(-tuulenMaxVoima, tuulenMaxVoima);                   
447                }
448                if (RandomGen.NextDouble(0,1) < (1 / tuulenvaihteluTaajuus))
449                {
450                    if (RandomGen.NextBool())
451                    {
452                        tuulenVoima.Value += 0.1;
453                    }
454                    else
455                    {
456                        tuulenVoima.Value -= 0.1;
457                    }
458                }
459                if (savu != null && savu2 != null)
460                {
461                    Wind = new Vector(tuulenVoima.Value * tuulenSavuKerroin, 0);
462                }
463               
464            }
465        }
466        void piirraPunaPiste()
467        {
468            Vector suunta = LaskeLaukauksenSuunta();
469            Vector osumakohta = LaskeOsumaKohta(suunta);
470            PunaPiste.X = osumakohta.X;
471            PunaPiste.Y = osumakohta.Y;
472        }
473        double tarkistaPisteet(Vector osumaKohta)
474        {
475            //tähän taulun paikan tarkistus
476            double tulos = osumaKohta.Magnitude;
477            tulos = 10 - (tulos / (taulunkoko / 20));
478            if (tulos < 0)
479            {
480                tulos = 0;
481            }
482            return tulos;
483        }
484        void ilmoitaTulos(double tulos)
485        {
486            pistelaskuri.Value = tulos;
487        }
488
489        void ToogleZoom()
490        {
491            if (zoom)
492            {
493                tahtaimenKoko = tahtaimenKoko / 2;
494                TuhoaTahtaimet();
495                TeeTahtain();
496                zoom = false;
497            }
498            else
499            {
500                tahtaimenKoko = tahtaimenKoko * 2;
501                TuhoaTahtaimet();
502                TeeTahtain();
503                zoom = true;
504            }
505        }
506       
507        protected override void Update(Time time)
508        {
509            if (hairiot)
510            {
511                TeeVapinaa(); //tekee häiriöt tähtäämiseen               
512                TeeTuuli();
513            }
514            if (punaPistePaalla)
515            {
516                piirraPunaPiste();
517            }
518            hiirenXlaskuri.Value = Mouse.PositionOnWorld.X;
519            hiirenYlaskuri.Value = Mouse.PositionOnWorld.Y;
520            base.Update(time);
521        }
522    }
523
Note: See TracBrowser for help on using the repository browser.