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

Revision 6312, 7.2 KB checked in by anlakane, 5 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 partial 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 = 1000; // 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 = 15;
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    void LuoChromaCase()
195    {
196        Mouse.IsCursorVisible = true;
197
198        List<GameObject> pItems = new List<GameObject>();
199
200        for (int i = 0; i < 40; i++)
201        {
202            GameObject obj = new GameObject(50, 50);
203            obj.Color = RandomGen.NextColor();
204            obj.Tag = 50.0;
205            pItems.Add(obj);
206        }
207
208        GameObject cCaseDialog = new GameObject(LoadImage("laatikko_opening")); // koko debug
209        Add(cCaseDialog);
210
211        Mouse.ListenOn(cCaseDialog, MouseButton.Left, ButtonState.Pressed, delegate
212        {
213            cCaseDialog.Destroy();
214
215            GameObject cCaseFront = new GameObject(LoadImage("caseavausruutu"));
216
217            ChromaCase cCase = new ChromaCase(pItems, cCaseFront, null, 20);
218            cCase.Add(new Vector(0.0, Level.Bottom + cCaseFront.Height / 2), 2);
219            cCase.ItemReceived += GotItemFromCase;
220            //cCase.ItemRelativePosition = new Vector(47
221            cCase.Start();
222
223        }, null);
224    }
225
226    void GotItemFromCase(GameObject o)
227    {
228       
229    }
230
231    /// <summary>
232    /// Asetetaan pelaajalle ohjaimet.
233    /// </summary>
234    void AsetaOhjaimet()
235    {
236        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, null, taistelija, -NOPEUS);
237        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, null, taistelija, NOPEUS);
238        Keyboard.Listen(Key.Space, ButtonState.Pressed, LiikutaYlos, null, taistelija);
239        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
240
241#if DEBUG
242        Keyboard.Listen(Key.C, ButtonState.Pressed, LuoChromaCase, null);
243#endif
244    }
245
246    void VoititPelin()
247    {
248
249    }
250}
Note: See TracBrowser for help on using the repository browser.