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

Revision 6323, 8.1 KB checked in by misakana, 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    Image taistelijaOlio = LoadImage("olio");
23    Image cCaseD = LoadImage("laatikko_opening");
24    Image cCaseF = LoadImage("caseavausruutu");
25
26    PlatformCharacter taistelija;
27
28    int kenttaNro = 1;
29
30    /// <summary>
31    /// Viimeisen pelissä olevan kentän indeksi.
32    /// </summary>
33    const int VIIMEINEN_KENTTA = 15;
34
35    public override void Begin()
36    {
37        LataaContent();
38        LuoKentta();
39        AsetaOhjaimet();
40    }
41
42    void Liikuta(PlatformCharacter pelaaja, double suunta)
43    {
44        pelaaja.Walk(suunta);
45
46        if (!pelaaja.Animation.IsPlaying)
47            pelaaja.Animation.Resume();
48    }
49
50    void LiikutaYlos(PlatformCharacter pelaaja)
51    {
52        pelaaja.Jump(HYPPYVOIMA);
53        pelaaja.Tag = "hyppy";
54        Sound pelaajaHyppyAani = hyppy.CreateSound();
55        pelaajaHyppyAani.Pitch = 0.1;
56        Timer.SingleShot(0.1, delegate { pelaajaHyppyAani.Play(); });
57   
58    }
59
60    void LataaContent()
61    {
62        chuckinkavely = LoadAnimation("pelaaja_anim");
63    }
64
65    void LuoKentta()
66    {
67        SmoothTextures = false;
68        IsFullScreen = true;
69        Gravity = new Vector(0, -2500);
70
71        // Synkataan taustakuvan ja colortilemapin pikselit
72        Level.Background.Image = LoadImage("kentta" + kenttaNro.ToString());
73
74        Level.Width = Screen.Width;
75        double kerroin = (double)Level.Background.Image.Width / Level.Background.Image.Height;
76        Level.Height = Level.Width / kerroin;
77        Level.Background.FitToLevel();
78
79        Image pohjaLevynKuva = LoadImage("kentta" + kenttaNro.ToString() + "pohja");
80
81        ColorTileMap pohjaLevy = new ColorTileMap(pohjaLevynKuva);
82        pohjaLevy.SetTileMethod(Color.Gold, LuoPohja);
83        pohjaLevy.SetTileMethod(Color.Cyan, Luotaistelija);
84        pohjaLevy.Optimize(Color.Gold);
85
86        // oletuksena 1 pikseli = 1 unit
87        const double BASE_SIZE = 1.0;
88        double widthMultiplier = Level.Width / pohjaLevynKuva.Width;
89        double heightMultiplier = Level.Height / pohjaLevynKuva.Height;
90        pohjaLevy.Execute(BASE_SIZE * widthMultiplier, BASE_SIZE * heightMultiplier);
91
92        // PhysicsObject pohja = Level.CreateBottomBorder();
93        // pohja.Y = Level.Bottom + 100;
94        //pohja.IsVisible = false;
95        PhysicsObject vasenreuna = Level.CreateLeftBorder();
96        vasenreuna.X -= 75;
97        vasenreuna.Tag = "vasenreuna";
98        //PhysicsObject oikeareuna = Level.CreateRightBorder();
99        //oikeareuna.X += 75;
100        //oikeareuna.Tag = "oikeareuna";
101
102        Varjo();
103    }
104
105    void Luotaistelija(Vector paikka, double leveys, double korkeus)
106    {
107
108        taistelija = new PlatformCharacter(75, 75);
109        taistelija.Shape = Shape.Rectangle;
110        taistelija.Animation = new Animation(chuckinkavely);
111        taistelija.Animation.Start();
112        taistelija.Position = paikka;
113
114        AddCollisionHandler(taistelija, "vasenreuna", SeuraavaKentta);
115
116        taistelija.Mass = 10.0;
117        Add(taistelija);
118        Camera.Follow(taistelija);
119        Camera.StayInLevel = true;
120    }
121
122    void Varjo()
123    {
124        GameObject varjo = new GameObject(70, 30);
125        varjo.Image = taistelijanvarjo;
126        Add(varjo, -1);
127
128        Timer ajastin = new Timer();
129        ajastin.Interval = 1.0 / 60.0;
130        ajastin.Timeout += delegate
131        {
132            varjo.X = taistelija.X;
133            varjo.Y = EtsiVarjonY();
134        };
135        ajastin.Start();
136    }
137
138    /// <summary>
139    /// Etsii suoraan pelaajan alla olevan lattiapalikan Y-koordinaatin.
140    /// </summary>
141    /// <returns></returns>
142    double EtsiVarjonY()
143    {
144        Vector rayDown = new Vector(0.0, -2000.0);
145        List<GameObject> possibleObjects = GetObjects(x => x != taistelija && x is PhysicsObject );
146        List<GameObject> objectsBelow = new List<GameObject>();
147
148        for (int i = 0; i < possibleObjects.Count; i++)
149        {
150            if (possibleObjects[i].IsBlocking(new Vector(taistelija.X, taistelija.Bottom), new Vector(taistelija.X, taistelija.Bottom) + rayDown))
151            {
152                objectsBelow.Add(possibleObjects[i]);
153            }
154        }
155
156        if (objectsBelow.Count == 0)
157            return double.MinValue;
158
159        double minDistance = double.MaxValue;
160        int minIndex = -1;
161
162        for (int i = 0; i < objectsBelow.Count; i++)
163        {
164            double currentDistance = Math.Abs(taistelija.Bottom - objectsBelow[i].Top);
165            if (currentDistance < minDistance)
166            {
167                minDistance = currentDistance;
168                minIndex = i;
169            }
170        }
171
172        return objectsBelow[minIndex].Top;
173    }
174
175
176    void SeuraavaKentta(PhysicsObject tormaaja, PhysicsObject tormatty)
177    {
178        ClearAll();
179        kenttaNro++;
180
181        if (kenttaNro > VIIMEINEN_KENTTA)
182        {
183            VoititPelin();
184        }
185
186        else
187        {
188            LuoKentta();
189            AsetaOhjaimet();
190        }
191    }
192
193    void LuoPohja(Vector paikka, double leveys, double korkeus)
194    {
195        PhysicsObject pala = PhysicsObject.CreateStaticObject(leveys, korkeus);
196        pala.Position = paikka;
197        pala.IsVisible = false;
198        Add(pala);
199    }
200
201    void LuoChromaCase()
202    {
203        Mouse.IsCursorVisible = true;
204
205        List<GameObject> pItems = new List<GameObject>();
206        GameObject knife = new GameObject(LoadImage("rareitem_knife"));
207        knife.Tag = new object[2] {(object)50.0, (object)ItemType.Knife};
208        pItems.Add(knife);
209
210        GameObject avain = new GameObject(LoadImage("rareitem_avain_small"));
211        avain.Tag = new object[2] { (object)50.0, (object)ItemType.Key };
212        pItems.Add(avain);
213       
214
215        //for (int i = 0; i < 40; i++)
216        //{
217        //    GameObject obj = new GameObject(50, 50);
218        //    obj.Color = RandomGen.NextColor();
219        //    obj.Tag = 50.0;
220        //    pItems.Add(obj);
221        //}
222
223        GameObject cCaseDialog = new GameObject(cCaseD); // koko debug
224        Add(cCaseDialog);
225
226        Mouse.ListenOn(cCaseDialog, MouseButton.Left, ButtonState.Pressed, delegate
227        {
228            cCaseDialog.Destroy();
229
230            GameObject cCaseFront = new GameObject(cCaseF);
231
232            ChromaCase cCase = new ChromaCase(pItems, cCaseFront, null, 20);
233            cCase.Add(new Vector(0.0, Level.Bottom + cCaseFront.Height / 2), 2);
234            cCase.ItemReceived += delegate(GameObject o) { GotItemFromCase(o); };
235            cCase.ItemRelativePosition = new Vector((472 - 467.5), (455 - 204));
236            cCase.Start();
237
238        }, null);
239    }
240
241    void GotItemFromCase(GameObject o)
242    {
243        ItemType gotType = (ItemType)((object[])o.Tag)[0];
244
245        switch (gotType)
246        {
247            case ItemType.Knife:
248                break;
249            case ItemType.Key:
250                break;
251            default:
252                break;
253        }
254    }
255
256    /// <summary>
257    /// Asetetaan pelaajalle ohjaimet.
258    /// </summary>
259    void AsetaOhjaimet()
260    {
261        Keyboard.Listen(Key.A, ButtonState.Down, Liikuta, null, taistelija, -NOPEUS);
262        Keyboard.Listen(Key.D, ButtonState.Down, Liikuta, null, taistelija, NOPEUS);
263        Keyboard.Listen(Key.Space, ButtonState.Pressed, LiikutaYlos, null, taistelija);
264        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
265
266#if DEBUG
267        Keyboard.Listen(Key.C, ButtonState.Pressed, LuoChromaCase, null);
268#endif
269    }
270
271    void VoititPelin()
272    {
273
274    }
275}
Note: See TracBrowser for help on using the repository browser.