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

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