source: 2014/30/MitjaK/Attack to Agora/Attack to Agora/Attack to Agora/Attack to Agora/ChromaCase.cs @ 6276

Revision 6276, 4.9 KB checked in by anlakane, 5 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using Jypeli;
6
7public class ChromaCase
8{
9    public GameObject OpeningScreenFront;
10    private Vector ShownItemPosition = Vector.Zero;
11    private int CurrentItem = 0;
12    public int Items;
13
14    private List<GameObject> PossibleItems = new List<GameObject>();
15    private List<GameObject> ShownItems = new List<GameObject>();
16
17    private GameObject FinalItem;
18
19    public Vector Position = Vector.Zero;
20    public Vector ItemRelativePosition;
21
22    public const double START_SPEED = 0.02;
23    public const double STOP_SPEED = 1.0;
24    private Timer changeTimer = new Timer();
25
26    private int layer;
27
28    public delegate void CaseHandler(GameObject item);
29    public event CaseHandler ItemReceived;
30
31    /// <summary>
32    /// Luo ChromaCase-olion. Lisää olio ruudulle Add-metodilla.
33    /// Todennäköisyydet ovat esineiden tageissa doublena mielivaltaisella välillä,
34    /// esim 0.0 - 100.0
35    /// </summary>
36    /// <param name="possibleItems"></param>
37    /// <param name="finalItem"></param>
38    public ChromaCase(List<GameObject> possibleItems, GameObject front, GameObject finalItem, int items)
39    {
40        this.PossibleItems.AddRange(possibleItems);
41        if (finalItem != null)
42            FinalItem = finalItem;
43
44        this.OpeningScreenFront = front;
45        this.Items = items;
46    }
47
48    public void Add(Vector position, int layer = 0)
49    {
50        Game.Instance.Add(OpeningScreenFront, layer);
51
52        this.Position = position;
53        OpeningScreenFront.Position = this.Position;
54        this.layer = layer;
55    }
56
57    public void Destroy()
58    {
59        OpeningScreenFront.Destroy();
60        for (int i = 0; i < ShownItems.Count; i++)
61        {
62            ShownItems[i].Destroy();
63        }
64    }
65
66    public void Start()
67    {
68        GenerateItemList(Items);
69
70        if (ShownItems.Count == 0)
71            return;
72        // y == startSpeed
73        // x == speedIncrease
74        // n == shownItems.Count
75        // z == stopSpeed
76        //  y*x^n=z x:n suhteen =>       x = (z / y) ^ (1 / n)
77        double speedIncrease = Math.Pow((STOP_SPEED / START_SPEED), (1.0 / ShownItems.Count));
78
79        changeTimer.Interval = START_SPEED;
80        changeTimer.Timeout += delegate
81        {
82            Game.Instance.MessageDisplay.Add("Item " + CurrentItem.ToString() + ", delay " + changeTimer.Interval);
83            changeTimer.Interval *= speedIncrease;
84            if (CurrentItem == ShownItems.Count - 1)
85            {
86                changeTimer.Timeout += delegate
87                {
88                    StopTimer();
89                    GiveItem();
90                    Destroy();
91                };
92            }
93            else ChangeItem(); 
94        };
95        changeTimer.Start();
96
97        // eka esine näkyville
98        ChangeItem(false);
99    }
100
101    private void ChangeItem(bool destroyOld = true)
102    {
103        if (CurrentItem >= ShownItems.Count - 1)
104            return;
105
106        if (destroyOld)
107        {
108            Game.Instance.Remove(ShownItems[CurrentItem]);
109            CurrentItem++;
110        }
111
112        ShownItems[CurrentItem].Position = ShownItemPosition;
113        if (layer > -3)
114            Game.Instance.Add(ShownItems[CurrentItem], layer - 1);
115        else
116            Game.Instance.Add(ShownItems[CurrentItem], layer);
117    }
118
119    private void StopTimer()
120    {
121        changeTimer.Stop();
122    }
123
124    private void GiveItem()
125    {
126        if (ItemReceived != null)
127            ItemReceived(ShownItems[ShownItems.Count - 1]);
128    }
129
130    private void GenerateItemList(int itemAmount)
131    {
132        for (int i = 0; i < itemAmount; i++)
133        {
134            if (i == itemAmount - 1 && FinalItem != null)
135            {
136                ShownItems.Add(FinalItem);
137                break;
138            }
139
140            AddItemWithProbabilities();
141        }
142    }
143
144    /// <summary>
145    /// Lisää ShownItems-listaan esineen PossibleItems-listasta.
146    /// Todennäköisyydet ovat esineiden tageissa doublena mielivaltaisella välillä,
147    /// esim 0.0 - 100.0
148    /// </summary>
149    private void AddItemWithProbabilities()
150    {
151        double total = 0;
152        List<double> limits = new List<double>();
153        limits.Add(0.0);
154
155        for (int i = 0; i < PossibleItems.Count; i++)
156        {
157            double current = (double)PossibleItems[i].Tag;
158            total += current;
159
160            limits.Add(total);
161        }
162
163        double rNumber = RandomGen.NextDouble(0, total);
164
165        for (int i = 0; i < limits.Count - 1; i++)
166        {
167            if (rNumber >= limits[i] && rNumber < limits[i + 1])
168            {
169                PossibleItems[i].Position = ItemRelativePosition;
170                ShownItems.Add(PossibleItems[i]);
171            }
172        }
173    }
174}
Note: See TracBrowser for help on using the repository browser.