source: 2015/24/EemeliK/Nettipelijuttupelihymynaama/Nettipelijuttupelihymynaama/Nettipelijuttupelihymynaama/Nettipelijuttupelihymynaama.cs @ 7258

Revision 7258, 12.8 KB checked in by taeekotr, 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
9[Serializable]
10class Paketti
11{
12    public double X;
13    public double Y;
14    public double VX;
15    public double VY;
16    public double nopeus;
17}
18
19[Serializable]
20class AmmusPaketti
21{
22    public double X;
23    public double Y;
24    public double VX;
25    public double VY;
26}
27
28[Serializable]
29class KuoliPaketti
30{
31}
32
33
34class Pelaaja : PlatformCharacter
35{
36    public double nopeus;
37   
38
39    public Pelaaja(double leveys, double korkeus)
40        : base(leveys, korkeus)
41    {
42    }
43}
44
45public class Nettipelijuttupelihymynaama : PhysicsGame
46{
47    NetworkConnection yhteys;
48
49    const double nopeus = 200;
50    const double hyppyNopeus = 1450;
51    const int RUUDUN_KOKO = 40;
52
53    double hahmonopeus = 0;
54
55    Pelaaja pelaaja;
56    bool onAse = false;
57
58    Image pelaajanKuva = LoadImage("Idle");
59    Image Aajii = LoadImage("Aajii");
60    Image viisidollaria = LoadImage("5Dollars");
61
62    SoundEffect maaliAani = LoadSoundEffect("maali");
63    Dictionary<Guid, Pelaaja> muutPelaajat = new Dictionary<Guid, Pelaaja>();
64
65    List<Guid> kuolleet = new List<Guid>();
66
67    DoubleMeter elamaLaskuri;
68    private Animation ukkelinKavely;
69
70    public override void Begin()
71    {
72        ukkelinKavely = LoadAnimation("ukkeli");
73       
74
75        Gravity = new Vector(0, -1000);
76
77        LuoKentta();
78        LisaaNappaimet();
79
80        Camera.Follow(pelaaja);
81        Camera.ZoomFactor = 1.2;
82        Camera.StayInLevel = true;
83
84        yhteys = new NetworkConnection("Tasoloikka22");
85        yhteys.OnMessageReceive += UusiViesti;
86        yhteys.OnConnect += UusiPelaaja;
87        yhteys.OnDisconnect += PoistaPelaaja;
88        if (!yhteys.Connect("130.234.162.86", 3074))
89        {
90            MessageWindow mw = new MessageWindow("Yhdistäminen epäonnistui");
91            mw.Closed += delegate { Exit(); };
92            Add(mw);
93            return;
94        }
95        Exiting += yhteys.Close;
96
97        Timer pakettiajastin = new Timer();
98        pakettiajastin.Interval = 0.05;
99        pakettiajastin.Timeout += PaivitaPaketti;
100        pakettiajastin.Start();
101
102        //Window.Width = 600;
103        //Window.Height = 400;
104
105        IsFullScreen = true;
106
107        IsMouseVisible = true;
108
109        LuoElamaLaskuri();
110    }
111
112    protected override void Update(Time time)
113    {
114        foreach (var pari in muutPelaajat)
115        {
116            if (pari.Value.nopeus != 0.0)
117                pari.Value.Walk(pari.Value.nopeus);
118        }
119        base.Update(time);
120    }
121    void LuoElamaLaskuri()
122    {
123        elamaLaskuri = new DoubleMeter(10);
124        elamaLaskuri.MaxValue = 10;
125        elamaLaskuri.LowerLimit += ElamaLoppui;
126       
127        ProgressBar elamaPalkki = new ProgressBar(150, 20);
128        elamaPalkki.X = -Window.Width/2 + 150;
129        elamaPalkki.Y = Window.Height/2 - 20;
130        elamaPalkki.BarColor = Color.Red;
131        elamaPalkki.BindTo(elamaLaskuri);
132        Add(elamaPalkki);
133    }
134    void ElamaLoppui()
135    {
136        pelaaja.Destroy();
137
138        yhteys.SendObject(new KuoliPaketti());
139    }
140
141    void UusiViesti(Guid id, string viesti)
142    {
143        if (kuolleet.Contains(id))
144        {
145            return;
146        }
147
148        if (!muutPelaajat.ContainsKey(id))
149        {
150            muutPelaajat.Add(id, LuoPelaaja());
151        }
152       
153        try
154        {
155            Paketti paketti = yhteys.DeserializeFromString<Paketti>(viesti);
156            muutPelaajat[id].Position = new Vector(paketti.X, paketti.Y);
157            muutPelaajat[id].Velocity = new Vector(paketti.VX, paketti.VY);
158           
159            muutPelaajat[id].nopeus = paketti.nopeus;
160            return;
161        }
162        catch (Exception)
163        {
164
165        }
166
167        try
168        {
169            AmmusPaketti paketti = yhteys.DeserializeFromString<AmmusPaketti>(viesti);
170            LuoAmmus(new Vector(paketti.X, paketti.Y), new Vector(paketti.VX, paketti.VY));
171            return;
172        }
173        catch (Exception)
174        {
175
176        }
177
178        try
179        {
180            KuoliPaketti paketti = yhteys.DeserializeFromString<KuoliPaketti>(viesti);
181            muutPelaajat[id].Destroy();
182            muutPelaajat.Remove(id);
183            kuolleet.Add(id);
184            return;
185        }
186        catch (Exception)
187        {
188
189        }
190
191        if (viesti.Length > 0)
192        {
193            MessageDisplay.Add(viesti);
194            TulkitseKomento(id, viesti);
195        }
196    }
197    void UusiPelaaja(Guid id)
198    {
199        MessageDisplay.Add("Uusi pelaaja yhdisti peliin.");
200        muutPelaajat.Add(id, LuoPelaaja());
201    }
202
203    void PoistaPelaaja(Guid id)
204    {
205        MessageDisplay.Add("Pelaaja poistui pelistä.");
206        muutPelaajat[id].Destroy();
207        muutPelaajat.Remove(id);
208    }
209    void LuoKentta()
210    {
211        TileMap kentta = TileMap.FromLevelAsset("kentta1");
212        kentta.SetTileMethod('#', LisaaTaso);
213        kentta.SetTileMethod('*', LisaaViisiDollaria);
214        kentta.SetTileMethod('N', LisaaPelaaja);
215        kentta.Execute(RUUDUN_KOKO, RUUDUN_KOKO);
216        Level.CreateBorders();
217        Level.Background.CreateGradient(Color.White, Color.SkyBlue);
218    }
219
220    void LisaaTaso(Vector paikka, double leveys, double korkeus)
221    {
222        PhysicsObject taso = PhysicsObject.CreateStaticObject(leveys, korkeus);
223        taso.Position = paikka;
224        taso.Color = Color.Green;
225        taso.Tag = "taso";
226        Add(taso);
227    }
228
229    void LisaaViisiDollaria(Vector paikka, double leveys, double korkeus)
230    {
231        PhysicsObject fivedollars = PhysicsObject.CreateStaticObject(60, 30);
232        fivedollars.IgnoresCollisionResponse = true;
233        fivedollars.Position = paikka;
234        fivedollars.Image = viisidollaria;
235        fivedollars.Tag = "5dollars";
236        Add(fivedollars);
237    }
238
239    void LisaaPelaaja(Vector paikka, double leveys, double korkeus)
240    {
241        pelaaja = LuoPelaaja();
242        pelaaja.Position = paikka;
243    }
244    Pelaaja LuoPelaaja()
245    {
246        Pelaaja pelaaja = new Pelaaja(75, 100);
247        pelaaja.Mass = 4.0;
248        pelaaja.Tag = "pelaaja";
249        pelaaja.Image = pelaajanKuva;
250        AddCollisionHandler(pelaaja, "tahti", TormaaTahteen);
251        //pelaaja.Animation = new Animation(ukkelinKavely);
252        pelaaja.AnimWalk = new Animation(ukkelinKavely);
253        pelaaja.AnimIdle = new Animation(pelaajanKuva);
254        Add(pelaaja);
255
256        return pelaaja;
257    }
258
259    void LisaaNappaimet()
260    {
261        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
262        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
263
264        //Keyboard.Listen(Key.Left, ButtonState.Pressed, Liikuta, "Liikkuu vasemmalle", pelaaja, -nopeus);
265        //Keyboard.Listen(Key.Right, ButtonState.Pressed, Liikuta, "Liikkuu vasemmalle", pelaaja, nopeus);
266
267        Keyboard.Listen(Key.Left, ButtonState.Down, Liikuta3, "Liikkuu vasemmalle", pelaaja, -nopeus);
268        Keyboard.Listen(Key.Right, ButtonState.Down, Liikuta3, "Liikkuu vasemmalle", pelaaja, nopeus);
269
270        //Keyboard.Listen(Key.Left, ButtonState.Pressed, Liikuta2, "Liikkuu vasemmalle", pelaaja, -nopeus);
271        //Keyboard.Listen(Key.Right, ButtonState.Pressed, Liikuta2, "Liikkuu vasemmalle", pelaaja, nopeus);
272
273        Keyboard.Listen(Key.Left, ButtonState.Released, Liikuta3, "Liikkuu vasemmalle", pelaaja, 0.0);
274        Keyboard.Listen(Key.Right, ButtonState.Released, Liikuta3, "Liikkuu vasemmalle", pelaaja, 0.0);
275
276        Keyboard.Listen(Key.Up, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja, hyppyNopeus);
277
278        Keyboard.Listen(Key.T, ButtonState.Pressed, LahetaViesti, "Helou");
279
280        Mouse.Listen(MouseButton.Left, ButtonState.Released, Ammu, "oaisd", pelaaja);
281
282        ControllerOne.Listen(Button.Back, ButtonState.Pressed, Exit, "Poistu pelistä");
283
284        ControllerOne.Listen(Button.DPadLeft, ButtonState.Down, Liikuta3, "Pelaaja liikkuu vasemmalle", pelaaja, -nopeus);
285        ControllerOne.Listen(Button.DPadRight, ButtonState.Down, Liikuta3, "Pelaaja liikkuu oikealle", pelaaja, nopeus);
286        ControllerOne.Listen(Button.A, ButtonState.Pressed, Hyppaa, "Pelaaja hyppää", pelaaja, hyppyNopeus);
287
288        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
289    }
290
291    void Ammu(PlatformCharacter pelaaja)
292    {
293        if (!onAse)
294            return;
295
296        Vector suunta = (Mouse.PositionOnWorld - pelaaja.Position).Normalize();
297        Vector nopeus = suunta * 400;
298        LuoAmmus(pelaaja.Position + suunta * RUUDUN_KOKO, nopeus);
299
300        AmmusPaketti paketti = new AmmusPaketti();
301        paketti.X = pelaaja.X + 50;
302        paketti.Y = pelaaja.Y;
303        paketti.VX = nopeus.X;
304        paketti.VY = nopeus.Y;
305        yhteys.SendObject(paketti);
306    }
307    void LuoAmmus(Vector paikka, Vector nopeus)
308    {
309        PhysicsObject Ammus = new PhysicsObject(10, 10);
310        Ammus.X = pelaaja.X + 50;
311        Ammus.Y = pelaaja.Y;
312        Ammus.Velocity = nopeus;
313        Ammus.IgnoresGravity = true;
314        Ammus.LifetimeLeft = TimeSpan.FromSeconds(3);
315        Ammus.IgnoresCollisionResponse = true;
316        Ammus.IgnoresCollisionWith(pelaaja);
317        Add(Ammus);
318
319        AddCollisionHandler(Ammus, "pelaaja", AmmusOsuuPelaajaan);
320        AddCollisionHandler(Ammus, "taso", AmmusOsuu);
321    }
322    void AmmusOsuu(PhysicsObject Ammus, PhysicsObject kohde)
323    {
324        Ammus.Destroy();
325    }
326
327    void AmmusOsuuPelaajaan(PhysicsObject Ammus, PhysicsObject kohde)
328    {
329        if (kohde is Pelaaja)
330        {
331            elamaLaskuri.Value -= 1;
332        }
333    }
334
335    void LahetaViesti()
336    {
337        InputWindow kysymysIkkuna = new InputWindow("Lähetä Viesti");
338        kysymysIkkuna.TextEntered += ProcessInput;
339        Add(kysymysIkkuna);
340    }
341    void ProcessInput(InputWindow ikkuna)
342    {
343        string vastaus = ikkuna.InputBox.Text;
344        if (vastaus != "/console")
345        {
346            MessageDisplay.Add(vastaus);
347            yhteys.SendMessage(vastaus);
348        }
349        else
350        {
351            LahetaConsoleViesti();
352        }
353    }
354    void LahetaConsoleViesti()
355    {
356        InputWindow ConsoleIkkuna = new InputWindow("CMD");
357        ConsoleIkkuna.TextEntered += CmdProcessInput;
358        Add(ConsoleIkkuna);
359    }
360    void CmdProcessInput(InputWindow ikkuna)
361    {
362        TulkitseKomento(yhteys.guid, ikkuna.InputBox.Text);
363        yhteys.SendMessage(ikkuna.InputBox.Text);
364    }
365
366    Pelaaja HaePelaaja(Guid id)
367    {
368        if (muutPelaajat.ContainsKey(id))
369        {
370            return muutPelaajat[id];
371        }
372        return pelaaja;
373    }
374
375    void TulkitseKomento(Guid id, string vastaus)
376    {
377        char[] delimiterChars = { ' ' };
378        string[] komento = vastaus.Split(delimiterChars);
379        if (vastaus == "/A-j")
380        {
381            LuoAj(id);
382        }
383        if (vastaus == "/AjSkin")
384        {
385            LuoAjSkin(id);
386        }
387        if (vastaus == "/Ase")
388        {
389            onAse = true;
390        }
391        if (vastaus == "/Jimi")
392        {
393           
394        }
395        if (komento[0] == "/Gravity")
396        {
397            if (komento.Length >= 3)
398            {
399                double x, y;
400                try
401                {
402                    x = double.Parse(komento[1]);
403                    y = double.Parse(komento[2]);
404                    Gravitymuutos(x, y);
405                }
406                catch (Exception e)
407                {
408                    // ei onnistu
409                }
410            }
411        }
412    }
413    void LuoAjSkin(Guid id)
414    {
415        HaePelaaja(id).Image = Aajii;
416    }
417    void Gravitymuutos(double x, double y)
418    {
419        Gravity = new Vector(x, y);
420    }
421
422    void LuoAj(Guid id)
423    {
424        Pelaaja pelaaja = HaePelaaja(id);
425
426        PhysicsObject Aj = new PhysicsObject(50, 50);
427        Aj.Position = pelaaja.Position;
428        Aj.Image = Aajii;
429        Add(Aj);
430    }
431
432    void Liikuta3(Pelaaja hahmo, double nopeus)
433    {
434        hahmo.Walk(nopeus);
435        hahmonopeus = nopeus;
436        PaivitaPaketti();
437    }
438
439    void PaivitaPaketti()
440    {
441        Paketti paketti = new Paketti();
442        paketti.X = pelaaja.X;
443        paketti.Y = pelaaja.Y;
444        paketti.VX = pelaaja.Velocity.X;
445        paketti.VY = pelaaja.Velocity.Y;
446        paketti.nopeus = hahmonopeus;
447        yhteys.SendObject(paketti);
448    }
449    void Hyppaa(Pelaaja hahmo, double nopeus)
450    {
451        hahmo.Jump(nopeus);
452    }
453
454    void TormaaTahteen(PhysicsObject hahmo, PhysicsObject fivedollars)
455    {
456       
457        MessageDisplay.Add("Yo! U got some money!");
458        fivedollars.Destroy();
459    }
460}
Note: See TracBrowser for help on using the repository browser.