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

Revision 6408, 4.8 KB checked in by mikrkana, 4 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            changeTimer.Interval *= speedIncrease;
82            if (CurrentItem == ShownItems.Count - 1)
83            {
84                changeTimer.Timeout += delegate
85                {
86                    StopTimer();
87                    GiveItem();
88                    Destroy();
89                };
90            }
91            else ChangeItem(); 
92        };
93        changeTimer.Start();
94
95        // eka esine näkyville
96        ChangeItem(false);
97    }
98
99    private void ChangeItem(bool destroyOld = true)
100    {
101        if (CurrentItem >= ShownItems.Count - 1)
102            return;
103
104        if (destroyOld)
105        {
106            Game.Instance.Remove(ShownItems[CurrentItem]);
107            CurrentItem++;
108        }
109
110        ShownItems[CurrentItem].Position = this.Position + ItemRelativePosition;
111        if (layer > -3)
112            Game.Instance.Add(ShownItems[CurrentItem], layer - 1);
113        else
114            Game.Instance.Add(ShownItems[CurrentItem], layer);
115    }
116
117    private void StopTimer()
118    {
119        changeTimer.Stop();
120    }
121
122    private void GiveItem()
123    {
124        if (ItemReceived != null)
125            ItemReceived(ShownItems[ShownItems.Count - 1]);
126    }
127
128    private void GenerateItemList(int itemAmount)
129    {
130        for (int i = 0; i < itemAmount; i++)
131        {
132            if (i == itemAmount - 1 && FinalItem != null)
133            {
134                ShownItems.Add(FinalItem);
135                break;
136            }
137
138            AddItemWithProbabilities();
139        }
140    }
141
142    /// <summary>
143    /// Lisää ShownItems-listaan esineen PossibleItems-listasta.
144    /// Todennäköisyydet ovat esineiden tageissa doublena mielivaltaisella välillä,
145    /// esim 0.0 - 100.0
146    /// </summary>
147    private void AddItemWithProbabilities()
148    {
149        double total = 0;
150        List<double> limits = new List<double>();
151        limits.Add(0.0);
152
153        for (int i = 0; i < PossibleItems.Count; i++)
154        {
155            double current = (double)(((object[])PossibleItems[i].Tag)[0]);
156            total += current;
157
158            limits.Add(total);
159        }
160
161        double rNumber = RandomGen.NextDouble(0, total);
162
163        for (int i = 0; i < limits.Count - 1; i++)
164        {
165            if (rNumber >= limits[i] && rNumber < limits[i + 1])
166            {
167                PossibleItems[i].Position = ItemRelativePosition;
168                ShownItems.Add(PossibleItems[i]);
169            }
170        }
171    }
172}
Note: See TracBrowser for help on using the repository browser.