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

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