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

Revision 4827, 8.6 KB checked in by vesal, 6 years ago (diff)

veri

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        if ( Bottom  < peli.Level.Bottom )
177           Bottom = peli.Level.Bottom;
178    }
179
180    public void Pois(double nopeus)
181    {
182        if (Height < koko.Y / 2) return;
183        if (Image == kuvat.polvillaan) Nouse(1);
184        SaadaKoko(Size * 0.99);
185        //  peli.Remove(this);
186        //  peli.Add(this, -1);
187        if (Image != kuvat.vartaloTakaa)
188        {
189            Image = kuvat.vartaloTakaa;
190            paa.Image = kuvat.paaTakaa;
191            Flip();
192            miekankahva.IsVisible = false;
193        }
194    }
195
196    public void Takaisin(double nopeus)
197    {
198        if (Height > koko.Y) Nouse(nopeus);
199        SaadaKoko(Size * 1.01);
200        // peli.Remove(this);
201        // peli.Add(this, 1);
202        if (Image != kuvat.vartalo)
203        {
204            Image = kuvat.vartalo;
205            paa.Image = kuvat.paa;
206            Flip();
207            if (!miekka.IsVisible) miekankahva.IsVisible = true;
208        }
209    }
210
211    public void MiekkaTuppeen()
212    {
213        miekka.IsVisible = false;
214        miekankahva.IsVisible = true;
215        Osoita(-125);
216    }
217
218    public void MiekkaEsiin()
219    {
220        Osoita(-110);
221        miekka.IsVisible = true;
222        miekankahva.IsVisible = false;
223        miekka.Velocity = Vector.Zero;
224    }
225
226    public void Pyorita()
227    {
228        miekka.ApplyTorque(100000);
229    }
230
231    public void MiekkaSwap()
232    {
233        if (miekka.IsVisible) MiekkaTuppeen(); else MiekkaEsiin();
234    }
235
236    public void KyykyynYlos(double nopeus)
237    {
238        if (Height < koko.Y * 0.6) Nouse(nopeus); else Polvistu(nopeus);
239    }
240
241    public void Osoita(double kulma)
242    {
243        miekka.StopAngular();
244        Kasi.Tavoite = Angle.FromDegrees(kulma);
245    }
246
247    public void KaannaPaa(double kulma)
248    {
249        paa.Tavoite = Angle.FromDegrees(kulma);
250    }
251
252    public void AvaaSuu()
253    {
254        if (paa.Image == kuvat.paa) paa.Image = kuvat.suuAuki;
255    }
256
257    public void SuljeSuu()
258    {
259        if (paa.Image == kuvat.suuAuki) paa.Image = kuvat.paa;
260    }
261
262    public void Suu(double kulma)
263    {
264        if (kulma <= 20) SuljeSuu(); else AvaaSuu();
265    }
266
267    public void Liiku(double speed)
268    {
269        Walk(speed);
270    }
271
272
273    private Color veri = new Color(200, 0, 0);
274
275    public void TiputaVerta()
276    {
277        PhysicsObject pisara = new PhysicsObject(4, 6, Shape.Circle);
278        pisara.Position = kasi.AbsolutePosition + Vector.FromLengthAndAngle(kasi.Width / 2, kasi.Angle) + Vector.FromLengthAndAngle(0.95*miekka.Width / 2, kasi.Angle + Miekka.Angle);
279        // pisara.Position = miekka.AbsolutePosition; // jos tämä on, niin verui tippuu mistä sattuu
280        pisara.Color = veri;
281        pisara.CollisionIgnoreGroup = 1; // Tämän jos kommentoi, niin kädet irtoavat
282        peli.Add(pisara);
283        pisara.MaximumLifetime = TimeSpan.FromMilliseconds(3000);
284        pisara.Mass = 0.01;
285       
286        peli.AddCollisionHandler(pisara, "Lattia", delegate(PhysicsObject o1, PhysicsObject o2) { 
287            // pisara.Width = 30;
288            // pisara.Velocity = Vector.Zero;
289            PhysicsObject latakko = new PhysicsObject(30, 4, Shape.Ellipse);
290            latakko.Color = veri;
291            latakko.Position = pisara.Position;
292            latakko.CollisionIgnoreGroup = 1;
293            peli.Add(latakko);
294            latakko.MaximumLifetime = TimeSpan.FromMilliseconds(2000);
295        });
296       
297    }
298
299}
300
301
Note: See TracBrowser for help on using the repository browser.