source: 2016/koodauskerho/JereM/matopeli/matopeli/matopeli/matopeli.cs @ 8394

Revision 8394, 5.3 KB checked in by tesatapa, 2 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9class Mato
10{
11    public List<PhysicsObject> Palat { get; set; } = new List<PhysicsObject>();
12
13    public double Nopeus { get; set; }
14
15    public string Tag { get; set; }
16
17    public Image PaaKuva { get; set; }
18
19    public Image HantaKuva { get; set; }
20}
21
22public class matopeli : PhysicsGame
23{
24
25    const int ALKUPALOJA = 8; // Monestako palasta pelaajat koostuvat aluksi.
26
27    Mato pelaaja;
28
29    Image paaKuva1 = LoadImage("pelaaja1paa");
30    Image hantaKuva1 = LoadImage("pelaaja1hanta");
31    public override void Begin()
32    {
33        LuoKentta();
34        AsetaOhjaimet();
35    }
36
37
38
39    // TODO: Kirjoita ohjelmakoodisi tähän
40
41    void LuoMato(string tag, Vector paikka)
42    {
43        pelaaja = new Mato();
44        pelaaja.PaaKuva = paaKuva1;
45        pelaaja.HantaKuva = hantaKuva1;
46        pelaaja.Tag = tag;
47        pelaaja.Nopeus = 800;
48
49        // Luodaan madon pää.
50        PhysicsObject paa = new PhysicsObject(30, 30);
51        paa.Position = paikka;
52        paa.Image = pelaaja.PaaKuva;
53        paa.MaxVelocity = 400;
54        paa.Tag = pelaaja.Tag;
55        Add(paa);
56        pelaaja.Palat.Add(paa);
57
58        // Lisätään häntäpalat.
59        for (int i = 0; i < ALKUPALOJA; i++)
60        {
61            LisaaHantapala(pelaaja);
62        }
63
64        // Lisätään törmäyskäsittelijä madon pääpalalle.
65        AddCollisionHandler(paa, delegate (PhysicsObject pala, PhysicsObject kohde)
66        {
67            if (kohde.Tag.ToString() == "herkku")
68            {
69                kohde.Destroy();
70                LisaaHantapala(pelaaja);
71            }
72            else if (kohde.Tag.ToString() != tag)
73            {
74                TuhoaMato(pelaaja);
75            }
76        });
77
78        // Luodaan ajastin, joka liikuttelee jatkuvasti madon häntäpaloja.
79        Timer ajastin = new Timer();
80        ajastin.Timeout += delegate { LiikutaPaloja(pelaaja); };
81        ajastin.Interval = 0.01;
82        ajastin.Start();
83    }
84
85    void LisaaHantapala(Mato mato)
86    {
87        PhysicsObject viimeinenPala = mato.Palat[mato.Palat.Count - 1];
88
89        PhysicsObject uusiPala = new PhysicsObject(viimeinenPala.Width, viimeinenPala.Height);
90        uusiPala.Position = viimeinenPala.Position;
91        uusiPala.IgnoresCollisionResponse = true;
92        uusiPala.LinearDamping = 0.1;
93        uusiPala.Image = mato.HantaKuva;
94        uusiPala.Tag = mato.Tag;
95        Add(uusiPala);
96        mato.Palat.Add(uusiPala);
97    }
98
99    void LiikutaPaloja(Mato mato)
100    {
101        if (mato.Palat.Count == 0)
102            return;
103
104        PhysicsObject paa = mato.Palat[0];
105        paa.Angle = paa.Velocity.Angle;
106
107        for (int i = 1; i < mato.Palat.Count; i++)
108        {
109            PhysicsObject pala = mato.Palat[i];
110            PhysicsObject edellinen = mato.Palat[i - 1];
111
112            Vector suunta = edellinen.Position - pala.Position;
113            if (suunta.Magnitude > pala.Width * 0.5)
114            {
115                pala.Position = edellinen.Position + suunta.Angle.GetVector() * -pala.Width * 0.5;
116                pala.Angle = suunta.Angle;
117            }
118        }
119    }
120    void Liiku(Mato mato, Vector suunta)
121    {
122        PhysicsObject paa = mato.Palat[0];
123        paa.Push(mato.Nopeus * suunta);
124    }   
125    void TuhoaMato(Mato mato)
126    {
127        Vector uusiPaikka = Level.GetRandomFreePosition(20);
128        PhysicsObject[] vanhatPalat = mato.Palat.ToArray();
129        mato.Palat.Clear();
130
131        for (int i = 0; i < vanhatPalat.Length; i++)
132        {
133            PhysicsObject pala = vanhatPalat[i];
134            LuoHerkku(pala.Position);
135            pala.Position = uusiPaikka;
136            pala.Velocity = Vector.Zero;
137            pala.Size = new Vector(30, 30);
138
139            if (i >= ALKUPALOJA)
140            {
141                pala.Destroy();
142            }
143            else
144            {
145                mato.Palat.Add(pala);
146            }
147        }
148    }
149    void LuoKentta()
150    {
151        LuoMato("pelaaja1", new Vector(0, 0));
152
153        Level.Background.Color = Color.Black;
154        Level.CreateBorders();
155        Camera.ZoomToLevel(80);
156        Timer herkkuAjastin = new Timer();
157        herkkuAjastin.Interval =4;
158        herkkuAjastin.Timeout += delegate { LuoHerkku(Level.GetRandomPosition()); };
159        herkkuAjastin.Start();
160    }
161    void AsetaOhjaimet()
162    {
163        Keyboard.Listen(Key.Left, ButtonState.Down, Liiku, null, pelaaja, new Vector(-1, 0));
164        Keyboard.Listen(Key.Right, ButtonState.Down, Liiku, null, pelaaja, new Vector(1, 0));
165        Keyboard.Listen(Key.Up, ButtonState.Down, Liiku, null, pelaaja, new Vector(0, 1));
166        Keyboard.Listen(Key.Down, ButtonState.Down, Liiku, null, pelaaja, new Vector(0, -1));
167
168        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
169        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
170    }
171
172    void LuoHerkku(Vector paikka)
173    {
174        PhysicsObject herkku = new PhysicsObject(10, 10, Shape.Circle);
175        herkku.Position = paikka;
176        herkku.IgnoresCollisionResponse = true;
177        herkku.Tag = "herkku";
178        herkku.MakeStatic();
179        Add(herkku);
180    }
181   
182   
183
184
185}
186
Note: See TracBrowser for help on using the repository browser.