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

Revision 4829, 8.9 KB checked in by vesal, 7 years ago (diff)

Start-asento

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    public Vector OriginalPos { get; set; }
43
44    private TiernapojanKuvat kuvat;
45
46    private Direction suunta;
47
48    private PhysicsGame peli;
49
50    public KaantyvaOsa Kasi
51    {
52        get { return kasi; }
53    }
54
55    public PhysicsObject Miekka
56    {
57        get { return miekka; }
58    }
59
60    public bool LaulaStick { get; set; }
61    public void FlipLaulaStick() { LaulaStick = !LaulaStick; }
62
63    public Tiernapoika(PhysicsGame peli, double leveys, double korkeus, TiernapojanKuvat kuvat)
64        : base(leveys, korkeus)
65    {
66        this.kuvat = kuvat;
67        double suhde = korkeus / leveys; // olion kuvasuhde
68        Image = kuvat.vartalo;
69        Height = Width * Image.Height / Image.Width * suhde; // tekstuurin kuvasuhde
70        koko = Size;
71        CollisionIgnoreGroup = 1;
72        Mass = 5000.0;
73        suunta = Direction.Right;
74        DirectionChanged += new Action<Direction>(Kaantyi);
75
76        // Pojan pää
77        paa = new KaantyvaOsa(1, 1);
78        paa.Image = kuvat.paa;
79        paa.Height = paa.Image.Height * Size.Y / Image.Height;
80        paa.Width = paa.Image.Width * Size.X / Image.Width;
81        paa.IgnoresGravity = true;
82        paa.CollisionIgnoreGroup = 1;
83        paanKoko = paa.Size;
84        paa.Mass = 10000;
85        paa.Suunta = Direction.Left;
86        Add(paa);
87
88        // Pojan oikea käsi
89        kasi = new KaantyvaOsa(Height, Height);
90        kasi.Image = kuvat.kasi;
91        kasi.Height = kasi.Image.Height * Height / Image.Height / suhde;
92        kasi.Width = kasi.Height / kasi.Image.Height * kasi.Image.Width * suhde;
93        // Poika ja käsi eivät saa törmätä toisiinsa
94        kasi.CollisionIgnoreGroup = 1;
95        kadenKoko = kasi.Size;
96        kasi.Mass = 2000;
97        Add(kasi);
98
99
100        miekka = new PhysicsObject(Height * 0.7, 1);
101        miekka.Image = kuvat.miekka;
102        miekka.Height = miekka.Width * miekka.Image.Height / miekka.Image.Width;
103        miekka.IgnoresGravity = true;
104        miekka.CollisionIgnoreGroup = 1;
105        miekanKoko = miekka.Size;
106        miekka.Angle = Angle.FromDegrees(10);
107        kasi.Add(miekka);
108
109        miekankahva = new PhysicsObject(Height * 0.7, 1);
110        miekankahva.Image = kuvat.kahva;
111        miekankahva.Height = miekankahva.Image.Height * miekanKoko.Y / miekka.Image.Height;
112        miekankahva.Width = miekankahva.Image.Width * miekanKoko.X / miekka.Image.Width;
113        miekankahva.IgnoresGravity = true;
114        miekankahva.CollisionIgnoreGroup = 1;
115        miekanKahvanKoko = miekankahva.Size;
116        miekankahva.Angle = Angle.FromDegrees(-20);
117        Add(miekankahva);
118
119        peli.Add(this, 1);
120        this.peli = peli;
121        MiekkaEsiin();
122        SaadaKoko(koko);
123    }
124
125    private void Kaantyi(Direction suunta)
126    {
127        double suuntakerroin = 1;
128        miekka.StopAngular();
129        if (suunta == Direction.Left) suuntakerroin = -1;
130        miekka.Angle = Angle.FromDegrees(10 * suuntakerroin);
131        miekankahva.Angle = Angle.FromDegrees(-20 * suuntakerroin);
132        kasi.Suunta = suunta;
133        // paa.Suunta = suunta;
134        this.suunta = suunta;
135        paa.Tavoite = Angle.FromDegrees(suuntakerroin * 20);
136
137        // Aina kääntäessä asetetaan paikka kaikille vehkeille
138        kasi.Position = new Vector(Width / 2 * 0.85 * suuntakerroin, Height * 0.27);
139        paa.Position = new Vector(Width * 0.1 * suuntakerroin, Height * 0.3);
140        miekankahva.Position = new Vector(0, Height * 0.1);
141        miekka.Position = new Vector(kasi.Width / 2 - 10, 0);
142    }
143
144
145    private void SaadaKoko(Vector uusikoko, bool myosMuut = true)
146    {
147        Size = uusikoko;
148        if (myosMuut)
149        {
150            double kerroin = Size.Y / koko.Y;
151            kasi.Size = kadenKoko * kerroin;
152            miekka.Size = miekanKoko * kerroin;
153            miekankahva.Size = miekanKahvanKoko * kerroin;
154            paa.Size = paanKoko * kerroin;
155        }
156        Kaantyi(suunta);
157    }
158
159
160    public void Flip()
161    {
162        if (suunta == Direction.Left) Walk(0.1);
163        else Walk(-0.1);
164    }
165
166
167    public void Nouse(double nopeus)
168    {
169        SaadaKoko(koko);
170        Kaantyi(suunta);
171        Image = kuvat.vartalo;
172        paa.Image = kuvat.paa;
173    }
174
175    public void Polvistu(double nopeus)
176    {
177        SaadaKoko(new Vector(Width, koko.Y / 2), false);
178        MiekkaTuppeen();
179        Image = kuvat.polvillaan;
180        if ( Bottom  < peli.Level.Bottom )
181           Bottom = peli.Level.Bottom;
182    }
183
184    public void Pois(double nopeus)
185    {
186        if (Height < koko.Y / 2) return;
187        if (Image == kuvat.polvillaan) Nouse(1);
188        SaadaKoko(Size * 0.99);
189        //  peli.Remove(this);
190        //  peli.Add(this, -1);
191        if (Image != kuvat.vartaloTakaa)
192        {
193            Image = kuvat.vartaloTakaa;
194            paa.Image = kuvat.paaTakaa;
195            Flip();
196            miekankahva.IsVisible = false;
197        }
198    }
199
200    public void Takaisin(double nopeus)
201    {
202        if (Height > koko.Y) Nouse(nopeus);
203        SaadaKoko(Size * 1.01);
204        // peli.Remove(this);
205        // peli.Add(this, 1);
206        if (Image != kuvat.vartalo)
207        {
208            Image = kuvat.vartalo;
209            paa.Image = kuvat.paa;
210            Flip();
211            if (!miekka.IsVisible) miekankahva.IsVisible = true;
212        }
213    }
214
215    public void MiekkaTuppeen()
216    {
217        miekka.IsVisible = false;
218        miekankahva.IsVisible = true;
219        Osoita(-125);
220    }
221
222    public void MiekkaEsiin()
223    {
224        Osoita(-110);
225        miekka.IsVisible = true;
226        miekankahva.IsVisible = false;
227        miekka.Velocity = Vector.Zero;
228    }
229
230    public void Pyorita()
231    {
232        miekka.ApplyTorque(100000);
233    }
234
235    public void MiekkaSwap()
236    {
237        if (miekka.IsVisible) MiekkaTuppeen(); else MiekkaEsiin();
238    }
239
240    public void KyykyynYlos(double nopeus)
241    {
242        if (Height < koko.Y * 0.6) Nouse(nopeus); else Polvistu(nopeus);
243    }
244
245    public void Osoita(double kulma)
246    {
247        miekka.StopAngular();
248        Kasi.Tavoite = Angle.FromDegrees(kulma);
249    }
250
251    public void KaannaPaa(double kulma)
252    {
253        paa.Tavoite = Angle.FromDegrees(kulma);
254    }
255
256    public void AvaaSuu()
257    {
258        if (paa.Image == kuvat.paa) paa.Image = kuvat.suuAuki;
259    }
260
261    public void SuljeSuu()
262    {
263        if (paa.Image == kuvat.suuAuki) paa.Image = kuvat.paa;
264    }
265
266    public void Suu(double kulma)
267    {
268        if (kulma <= 20) SuljeSuu(); else AvaaSuu();
269    }
270
271    public void Liiku(double speed)
272    {
273        Walk(speed);
274    }
275
276
277    private Color veri = new Color(200, 0, 0);
278
279    public void TiputaVerta()
280    {
281        PhysicsObject pisara = new PhysicsObject(4, 6, Shape.Circle);
282        pisara.Position = kasi.AbsolutePosition + Vector.FromLengthAndAngle(kasi.Width / 2, kasi.Angle) + Vector.FromLengthAndAngle(0.95*miekka.Width / 2, kasi.Angle + Miekka.Angle);
283        // pisara.Position = miekka.AbsolutePosition; // jos tämä on, niin verui tippuu mistä sattuu
284        pisara.Color = veri;
285        pisara.CollisionIgnoreGroup = 1; // Tämän jos kommentoi, niin kädet irtoavat
286        peli.Add(pisara);
287        pisara.MaximumLifetime = TimeSpan.FromMilliseconds(3000);
288        pisara.Mass = 1;
289        pisara.LinearDamping = 0.95;
290       
291        peli.AddCollisionHandler(pisara, "Lattia", delegate(PhysicsObject o1, PhysicsObject o2) { 
292            // pisara.Width = 30;
293            // pisara.Velocity = Vector.Zero;
294            PhysicsObject latakko = new PhysicsObject(30, 4, Shape.Ellipse);
295            latakko.Color = veri;
296            latakko.Position = pisara.Position;
297            latakko.CollisionIgnoreGroup = 1;
298            peli.Add(latakko);
299            latakko.MaximumLifetime = TimeSpan.FromMilliseconds(2000);
300        });
301       
302    }
303
304
305    public void Start()
306    {
307        Position = OriginalPos;
308        Nouse(100);
309    }
310}
311
312
Note: See TracBrowser for help on using the repository browser.