source: 2015/24/ohjaajat/Dungeon/Dungeon/Dungeon/MainMenu.cs @ 6098

Revision 6098, 6.1 KB checked in by sieerinn, 4 years ago (diff)

Sijaintilaskut korjattu.

Line 
1using System;
2using System.Linq;
3using System.Collections.Generic;
4using Jypeli;
5using Jypeli.Assets;
6using Jypeli.Controls;
7using Jypeli.Widgets;
8
9
10public class MainMenu
11{
12    private Dungeon peli;
13
14    private Image ratasKuva = Game.LoadImage("ratas");
15    private Image palaKuva = Game.LoadImage("pala");
16    private Image aukkoPohjaKuva = Game.LoadImage("aukko");
17    private Image aukkoKuva = Game.LoadImage("aukko2");
18    private Image otsikkoKuva = Game.LoadImage("title");
19    private Image pimeysKuva = Game.LoadImage("pimeys");
20
21    private SoundEffect ratasAani = Game.LoadSoundEffect("gear");
22
23    private GameObject pala; // Putoava palkki.
24    private GameObject ratas; // Palkin vieressä pyörivä ratas.
25    private GameObject pohjaAukko; // Aukko josta tulee ulos barbaareja.
26
27    private const double BarbaarinNopeus = 40.0;
28    private const double Gravitaatio = -600.0;
29    private const double Kimmoisuus = -0.4;
30    private double palaNopeus = 0.0;
31    private double palaSiirtyma; // Ääni soitetaan jos pala on siirtynyt tarpeeksi.
32
33    public PushButton[] Painikkeet { get; set; }
34
35    private List<GameObject> barbaarit;
36
37    public MainMenu(Dungeon peli, params string[] menuNimet)
38    {
39        barbaarit = new List<GameObject>();
40        this.peli = peli;
41        peli.Camera.ZoomFactor = 1.5;
42        peli.Level.Background.CreateGradient(Color.DarkGray, Color.Black);
43        LuoOsat();
44
45        // Luodaan alkuvalikon painikkeet.
46        Painikkeet = new PushButton[menuNimet.Length];
47        for (var i = 0; i < menuNimet.Length; i++)
48        {
49            // TODO: painikkeista vois tehä hienommat.
50            Painikkeet[i] = new PushButton(menuNimet[i]);
51            Painikkeet[i].Right = peli.Camera.WorldToScreen(new Vector(pala.Left + pala.Width * 0.25, 0)).X;
52            peli.Add(Painikkeet[i]);
53        }
54
55        var barbaariAjastin = new Timer();
56        barbaariAjastin.Interval = 3.0;
57        barbaariAjastin.Timeout += delegate
58        {
59            LuoBarbaari();
60            barbaariAjastin.Interval = RandomGen.NextDouble(2.0, 5.0);
61        };
62        barbaariAjastin.Start();
63    }
64
65    private void LuoBarbaari()
66    {
67        var barbaari = new GameObject(50, 80);
68        barbaari.Size *= 0.75;
69        barbaari.X = pohjaAukko.X - pohjaAukko.Width/3;
70        barbaari.Bottom = peli.Camera.ScreenToWorld(new Vector(0, Game.Screen.Bottom)).Y; // + RandomGen.NextDouble(0, 32);
71        barbaari.Image = peli.vihuKuvat[0];
72        barbaari.Animation = new Animation(RandomGen.SelectOne(peli.vihuKuvat, peli.kirvesVihuKuvat)) { FPS = 10 };
73        barbaari.Animation.Start();
74        peli.Add(barbaari);
75        barbaarit.Add(barbaari);
76    }
77
78    void LuoOsat()
79    {
80        double w = peli.Camera.ScreenToWorld(new Vector(Game.Screen.Width, 0)).X;
81        double h = peli.Camera.ScreenToWorld(new Vector(0, Game.Screen.Height)).Y;
82        double left = peli.Camera.ScreenToWorld(new Vector(-Game.Window.Width / 2.0, 0)).X;
83        double right = peli.Camera.ScreenToWorld(new Vector(Game.Window.Width / 2.0, 0)).X;
84        double top = peli.Camera.ScreenToWorld(new Vector(0, Game.Window.Height / 2.0)).Y;
85        double bottom = peli.Camera.ScreenToWorld(new Vector(0, -Game.Window.Height / 2.0)).Y;
86
87        const int toistoja = 3;
88        pala = new GameObject(30, 200 * toistoja);
89        pala.Position = peli.Camera.ScreenToWorld(new Vector(-200, 0)) + new Vector(0, top);
90        pala.Image = palaKuva;
91        pala.TextureWrapSize = new Vector(1, toistoja);
92        peli.Add(pala, 2);
93
94        ratas = new GameObject(130, 130);
95        ratas.Image = ratasKuva;
96        ratas.Position = pala.Position + new Vector(60, 0);
97        peli.Add(ratas, 2);
98
99        pala.Bottom = top; // Pala putoaa ikkunan yläreunasta.
100
101        // Aukon pohjavalo.
102        pohjaAukko = new GameObject(200, 100);
103        pohjaAukko.Image = aukkoPohjaKuva;
104        pohjaAukko.Left = left;
105        pohjaAukko.Bottom = bottom;
106        peli.Add(pohjaAukko, -1);
107
108        // Päällä näkyvä osittain väpinäkyvä valo.
109        var aukkoValo = new GameObject(pohjaAukko.Width, pohjaAukko.Height);
110        aukkoValo.Image = aukkoKuva;
111        aukkoValo.Position = pohjaAukko.Position;
112        peli.Add(aukkoValo, 1);
113
114        var pimeys = new GameObject(w, h);
115        pimeys.Image = pimeysKuva;
116        peli.Add(pimeys, 1);
117
118        var otsikko = new GameObject(400, 100);
119        otsikko.Image = otsikkoKuva;
120        otsikko.Left = pala.Right;
121        otsikko.Top = top - ratas.Height;
122        peli.Add(otsikko, 3);
123    }
124
125    public void Update(Time time)
126    {
127        var dt = time.SinceLastUpdate.TotalSeconds;
128        palaNopeus += Gravitaatio * dt;
129        pala.Y += palaNopeus * dt;
130
131        // Soitetaan ääni kun pala on liikkunut tarpeeksi.
132        palaSiirtyma += palaNopeus * dt;
133        if (Math.Abs(palaSiirtyma) > 20.0 && Math.Abs(palaNopeus) > 10.0)
134        {
135            ratasAani.Play();
136            palaSiirtyma = 0.0;
137        }
138
139        // Menu hyppää takas jos se on loppumaisillaan.
140        if (pala.Top < Game.Screen.Top)
141        {
142            palaNopeus *= Kimmoisuus;
143            pala.Top = Game.Screen.Top;
144
145            if (Math.Abs(palaNopeus) > 10.0)
146                ratasAani.Play();
147        }
148
149        // Päivitetään painikkeiden sijainti.
150        for (var i = 0; i < Painikkeet.Length; i++)
151        {
152            var korkeus = pala.Bottom + (Painikkeet.Length - 1 - i) * Painikkeet[i].Height;
153            Painikkeet[i].Bottom = peli.Camera.WorldToScreen(new Vector(0, korkeus)).Y;
154        }
155
156        // Päivitetään barbaareja.
157        foreach (var barbaari in barbaarit)
158        {
159            barbaari.X += BarbaarinNopeus * dt;
160            if (barbaari.Left > peli.Camera.ScreenToWorld(new Vector(Game.Screen.Right, 0)).X)
161                barbaari.Destroy();
162        }
163
164        // Poistetaan listalta tuhoutuneet barbaarit.
165        barbaarit.RemoveAll(b => b.IsDestroyed);
166
167        // Rattaan kulman säätö.
168        ratas.Angle = Angle.FromDegrees((ratas.Y - pala.Y) * 1.2 + 6.0);
169    }
170}
Note: See TracBrowser for help on using the repository browser.