source: 2014/30/MitjaK/Attack to Agora/Attack to Agora/Attack to Agora/Attack to Agora/Attack_to_Agora.cs @ 6249

Revision 6249, 6.0 KB checked in by anlakane, 4 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8using Microsoft.Xna.Framework.Content;
9
10public class Attack_to_Agora : PhysicsGame
11{
12    private Animation chuckinkavely;
13
14    /// <summary>
15    /// Vakiot kannattaa merkitä constiksi (ei voi muuttaa). Tällöin ne kirjoitetaan isolla.
16    /// </summary>
17    const double NOPEUS = 500; // 250
18    const double HYPPYVOIMA = 1500;
19
20    Image level1 = LoadImage("kentta1");
21    Image taistelijanvarjo = LoadImage("varjo");
22
23    Image taistelijaOlio = LoadImage("olio");
24    PlatformCharacter taistelija;
25
26    int kenttaNro = 1;
27
28    /// <summary>
29    /// Viimeisen pelissä olevan kentän indeksi.
30    /// </summary>
31    const int VIIMEINEN_KENTTA = 9;
32
33    public override void Begin()
34    {
35        LataaContent();
36        LuoKentta();
37        AsetaOhjaimet();
38    }
39
40    void Liikuta(PlatformCharacter pelaaja, double suunta)
41    {
42        pelaaja.Walk(suunta);
43
44        if (!pelaaja.Animation.IsPlaying)
45            pelaaja.Animation.Resume();
46    }
47
48    void LiikutaYlos(PlatformCharacter pelaaja)
49    {
50        pelaaja.Jump(HYPPYVOIMA);
51    }
52
53    void LataaContent()
54    {
55        chuckinkavely = LoadAnimation("pelaajaliikkuu");
56    }
57
58    void LuoKentta()
59    {
60        SmoothTextures = false;
61        // IsFullScreen = true;
62        Gravity = new Vector(0, -2500);
63
64        // Synkataan taustakuvan ja colortilemapin pikselit
65        Level.Background.Image = LoadImage("kentta" + kenttaNro.ToString());
66
67        Level.Width = Screen.Width;
68        double kerroin = (double)Level.Background.Image.Width / Level.Background.Image.Height;
69        Level.Height = Level.Width / kerroin;
70        Level.Background.FitToLevel();
71
72        Image pohjaLevynKuva = LoadImage("kentta" + kenttaNro.ToString() + "pohja");
73
74        ColorTileMap pohjaLevy = new ColorTileMap(pohjaLevynKuva);
75        pohjaLevy.SetTileMethod(Color.Gold, LuoPohja);
76        pohjaLevy.SetTileMethod(Color.Cyan, Luotaistelija);
77        pohjaLevy.Optimize(Color.Gold);
78
79        // oletuksena 1 pikseli = 1 unit
80        const double BASE_SIZE = 1.0;
81        double widthMultiplier = Level.Width / pohjaLevynKuva.Width;
82        double heightMultiplier = Level.Height / pohjaLevynKuva.Height;
83        pohjaLevy.Execute(BASE_SIZE * widthMultiplier, BASE_SIZE * heightMultiplier);
84
85        // PhysicsObject pohja = Level.CreateBottomBorder();
86        // pohja.Y = Level.Bottom + 100;
87        //pohja.IsVisible = false;
88        PhysicsObject vasenreuna = Level.CreateLeftBorder();
89        vasenreuna.X -= 75;
90        vasenreuna.Tag = "vasenreuna";
91        //PhysicsObject oikeareuna = Level.CreateRightBorder();
92        //oikeareuna.X += 75;
93        //oikeareuna.Tag = "oikeareuna";
94
95        Varjo();
96    }
97
98    void Luotaistelija(Vector paikka, double leveys, double korkeus)
99    {
100
101        taistelija = new PlatformCharacter(75, 75);
102        taistelija.Shape = Shape.Rectangle;
103        taistelija.Animation = new Animation(chuckinkavely);
104        taistelija.Animation.Start();
105        taistelija.Position = paikka;
106
107        AddCollisionHandler(taistelija, "vasenreuna", SeuraavaKentta);
108
109        taistelija.Mass = 10.0;
110        Add(taistelija);
111        Camera.Follow(taistelija);
112        Camera.StayInLevel = true;
113    }
114
115    void Varjo()
116    {
117        GameObject varjo = new GameObject(70, 30);
118        varjo.Image = taistelijanvarjo;
119        Add(varjo, -1);
120
121        Timer ajastin = new Timer();
122        ajastin.Interval = 1.0 / 60.0;
123        ajastin.Timeout += delegate
124        {
125            varjo.X = taistelija.X;
126            varjo.Y = EtsiVarjonY();
127        };
128        ajastin.Start();
129    }
130
131    /// <summary>
132    /// Etsii suoraan pelaajan alla olevan lattiapalikan Y-koordinaatin.
133    /// </summary>
134    /// <returns></returns>
135    double EtsiVarjonY()
136    {
137        Vector rayDown = new Vector(0.0, -2000.0);
138        List<GameObject> possibleObjects = GetObjects(x => x != taistelija && x is PhysicsObject );
139        List<GameObject> objectsBelow = new List<GameObject>();
140
141        for (int i = 0; i < possibleObjects.Count; i++)
142        {
143            if (possibleObjects[i].IsBlocking(new Vector(taistelija.X, taistelija.Bottom), new Vector(taistelija.X, taistelija.Bottom) + rayDown))
144            {
145                objectsBelow.Add(possibleObjects[i]);
146            }
147        }
148
149        if (objectsBelow.Count == 0)
150            return double.MinValue;
151
152        double minDistance = double.MaxValue;
153        int minIndex = -1;
154
155        for (int i = 0; i < objectsBelow.Count; i++)
156        {
157            double currentDistance = Math.Abs(taistelija.Bottom - objectsBelow[i].Top);
158            if (currentDistance < minDistance)
159            {
160                minDistance = currentDistance;
161                minIndex = i;
162            }
163        }
164
165        return objectsBelow[minIndex].Top;
166    }
167
168
169    void SeuraavaKentta(PhysicsObject tormaaja, PhysicsObject tormatty)
170    {
171        ClearAll();
172        kenttaNro++;
173
174        if (kenttaNro > VIIMEINEN_KENTTA)
175        {
176            VoititPelin();
177        }
178
179        else
180        {
181            LuoKentta();
182            AsetaOhjaimet();
183        }
184    }
185
186    void LuoPohja(Vector paikka, double leveys, double korkeus)
187    {
188        PhysicsObject pala = PhysicsObject.CreateStaticObject(leveys, korkeus);
189        pala.Position = paikka;
190        pala.IsVisible = false;
191        Add(pala);
192    }
193
194    /// <summary>
195    /// Asetetaan pelaajalle ohjaimet.
196    /// </summary>
197    void AsetaOhjaimet()
198    {
199        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, null, taistelija, -NOPEUS);
200        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, null, taistelija, NOPEUS);
201        Keyboard.Listen(Key.Space, ButtonState.Pressed, LiikutaYlos, null, taistelija);
202        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
203    }
204
205    void VoititPelin()
206    {
207
208    }
209}
Note: See TracBrowser for help on using the repository browser.