source: 2013/anlakane/Tiernapojat/Tiernapojat/Tiernapojat/Tiernapoika.cs @ 4825

Revision 4825, 7.3 KB checked in by vesal, 6 years ago (diff)

mp3

Line 
1using System;
2using Jypeli;
3
4/// <summary>
5/// "Taulukko" tiernapojan kuville
6/// </summary>
7public struct TiernapojanKuvat
8{
9    public Image vartalo;
10    public Image vartaloTakaa;
11    public Image polvillaan;
12    public Image kasi;
13    public Image miekka;
14    public Image kahva;
15    public Image paa;
16    public Image paaTakaa;
17    public Image suuAuki;
18}
19
20
21
22/// <summary>
23/// Tiernapoika joka osaa heiluttaa kättä, päätä ja suuta.
24/// Kädessä voi olla miekka tai miekan voi laittaa tuppeen.
25/// </summary>
26public class Tiernapoika : PlatformCharacter
27{
28    // Tiernapojan osat
29    private KaantyvaOsa paa;
30    private KaantyvaOsa kasi;
31    private PhysicsObject miekka;
32    private PhysicsObject miekankahva;
33
34
35    // Alkuperäiset koot
36    private Vector koko;
37    private Vector paanKoko;
38    private Vector kadenKoko;
39    private Vector miekanKoko;
40    private Vector miekanKahvanKoko;
41
42    private TiernapojanKuvat kuvat;
43
44    private Direction suunta;
45
46    private PhysicsGame peli;
47
48    public KaantyvaOsa Kasi
49    {
50        get { return kasi; }
51    }
52
53    public PhysicsObject Miekka
54    {
55        get { return miekka; }
56    }
57
58
59    public Tiernapoika(PhysicsGame peli, double leveys, double korkeus, TiernapojanKuvat kuvat)
60        : base(leveys, korkeus)
61    {
62        this.kuvat = kuvat;
63        double suhde = korkeus / leveys; // olion kuvasuhde
64        Image = kuvat.vartalo;
65        Height = Width * Image.Height / Image.Width * suhde; // tekstuurin kuvasuhde
66        koko = Size;
67        CollisionIgnoreGroup = 1;
68        Mass = 5000.0;
69        suunta = Direction.Right;
70        DirectionChanged += new Action<Direction>(Kaantyi);
71
72        // Pojan pää
73        paa = new KaantyvaOsa(1, 1);
74        paa.Image = kuvat.paa;
75        paa.Height = paa.Image.Height * Size.Y / Image.Height;
76        paa.Width = paa.Image.Width * Size.X / Image.Width;
77        paa.IgnoresGravity = true;
78        paa.CollisionIgnoreGroup = 1;
79        paanKoko = paa.Size;
80        paa.Mass = 10000;
81        paa.Suunta = Direction.Left;
82        Add(paa);
83
84        // Pojan oikea käsi
85        kasi = new KaantyvaOsa(Height, Height);
86        kasi.Image = kuvat.kasi;
87        kasi.Height = kasi.Image.Height * Height / Image.Height / suhde;
88        kasi.Width = kasi.Height / kasi.Image.Height * kasi.Image.Width * suhde;
89        // Poika ja käsi eivät saa törmätä toisiinsa
90        kasi.CollisionIgnoreGroup = 1;
91        kadenKoko = kasi.Size;
92        kasi.Mass = 2000;
93        Add(kasi);
94
95
96        miekka = new PhysicsObject(Height * 0.7, 1);
97        miekka.Image = kuvat.miekka;
98        miekka.Height = miekka.Width * miekka.Image.Height / miekka.Image.Width;
99        miekka.IgnoresGravity = true;
100        miekka.CollisionIgnoreGroup = 1;
101        miekanKoko = miekka.Size;
102        miekka.Angle = Angle.FromDegrees(10);
103        kasi.Add(miekka);
104
105        miekankahva = new PhysicsObject(Height * 0.7, 1);
106        miekankahva.Image = kuvat.kahva;
107        miekankahva.Height = miekankahva.Image.Height * miekanKoko.Y / miekka.Image.Height;
108        miekankahva.Width = miekankahva.Image.Width * miekanKoko.X / miekka.Image.Width;
109        miekankahva.IgnoresGravity = true;
110        miekankahva.CollisionIgnoreGroup = 1;
111        miekanKahvanKoko = miekankahva.Size;
112        miekankahva.Angle = Angle.FromDegrees(-20);
113        Add(miekankahva);
114
115        peli.Add(this, 1);
116        this.peli = peli;
117        MiekkaEsiin();
118        SaadaKoko(koko);
119    }
120
121    private void Kaantyi(Direction suunta)
122    {
123        double suuntakerroin = 1;
124        miekka.StopAngular();
125        if (suunta == Direction.Left) suuntakerroin = -1;
126        miekka.Angle = Angle.FromDegrees(10 * suuntakerroin);
127        miekankahva.Angle = Angle.FromDegrees(-20 * suuntakerroin);
128        kasi.Suunta = suunta;
129        // paa.Suunta = suunta;
130        this.suunta = suunta;
131        paa.Tavoite = Angle.FromDegrees(suuntakerroin * 20);
132
133        // Aina kääntäessä asetetaan paikka kaikille vehkeille
134        kasi.Position = new Vector(Width / 2 * 0.85 * suuntakerroin, Height * 0.27);
135        paa.Position = new Vector(Width * 0.1 * suuntakerroin, Height * 0.3);
136        miekankahva.Position = new Vector(0, Height * 0.1);
137        miekka.Position = new Vector(kasi.Width / 2 - 10, 0);
138    }
139
140
141    private void SaadaKoko(Vector uusikoko, bool myosMuut = true)
142    {
143        Size = uusikoko;
144        if (myosMuut)
145        {
146            double kerroin = Size.Y / koko.Y;
147            kasi.Size = kadenKoko * kerroin;
148            miekka.Size = miekanKoko * kerroin;
149            miekankahva.Size = miekanKahvanKoko * kerroin;
150            paa.Size = paanKoko * kerroin;
151        }
152        Kaantyi(suunta);
153    }
154
155
156    public void Flip()
157    {
158        if (suunta == Direction.Left) Walk(0.1);
159        else Walk(-0.1);
160    }
161
162
163    public void Nouse(double nopeus)
164    {
165        SaadaKoko(koko);
166        Kaantyi(suunta);
167        Image = kuvat.vartalo;
168        paa.Image = kuvat.paa;
169    }
170
171    public void Polvistu(double nopeus)
172    {
173        SaadaKoko(new Vector(Width, koko.Y / 2), false);
174        MiekkaTuppeen();
175        Image = kuvat.polvillaan;
176    }
177
178    public void Pois(double nopeus)
179    {
180        if (Height < koko.Y / 2) return;
181        if (Image == kuvat.polvillaan) Nouse(1);
182        SaadaKoko(Size * 0.99);
183        //  peli.Remove(this);
184        //  peli.Add(this, -1);
185        if (Image != kuvat.vartaloTakaa)
186        {
187            Image = kuvat.vartaloTakaa;
188            paa.Image = kuvat.paaTakaa;
189            Flip();
190            miekankahva.IsVisible = false;
191        }
192    }
193
194    public void Takaisin(double nopeus)
195    {
196        if (Height > koko.Y) Nouse(nopeus);
197        SaadaKoko(Size * 1.01);
198        // peli.Remove(this);
199        // peli.Add(this, 1);
200        if (Image != kuvat.vartalo)
201        {
202            Image = kuvat.vartalo;
203            paa.Image = kuvat.paa;
204            Flip();
205            if (!miekka.IsVisible) miekankahva.IsVisible = true;
206        }
207    }
208
209    public void MiekkaTuppeen()
210    {
211        miekka.IsVisible = false;
212        miekankahva.IsVisible = true;
213        Osoita(-125);
214    }
215
216    public void MiekkaEsiin()
217    {
218        Osoita(-110);
219        miekka.IsVisible = true;
220        miekankahva.IsVisible = false;
221    }
222
223    public void Pyorita()
224    {
225        miekka.ApplyTorque(100000);
226    }
227
228    public void MiekkaSwap()
229    {
230        if (miekka.IsVisible) MiekkaTuppeen(); else MiekkaEsiin();
231    }
232
233    public void KyykyynYlos(double nopeus)
234    {
235        if (Height < koko.Y * 0.6) Nouse(nopeus); else Polvistu(nopeus);
236    }
237
238    public void Osoita(double kulma)
239    {
240        miekka.StopAngular();
241        Kasi.Tavoite = Angle.FromDegrees(kulma);
242    }
243
244    public void KaannaPaa(double kulma)
245    {
246        paa.Tavoite = Angle.FromDegrees(kulma);
247    }
248
249    public void AvaaSuu()
250    {
251        if (paa.Image == kuvat.paa) paa.Image = kuvat.suuAuki;
252    }
253
254    public void SuljeSuu()
255    {
256        if (paa.Image == kuvat.suuAuki) paa.Image = kuvat.paa;
257    }
258
259    public void Suu(double kulma)
260    {
261        if (kulma <= 20) SuljeSuu(); else AvaaSuu();
262    }
263
264    public void Liiku(double speed)
265    {
266        Walk(speed);
267    }
268}
269
270
Note: See TracBrowser for help on using the repository browser.