source: 2014/27/AleksanteriV/Protokolla236TrueSurvivor/Protokolla236TrueSurvivor/Protokolla236TrueSurvivor/MikonPhysicsObject.cs @ 5446

Revision 5446, 8.3 KB checked in by mijoilmo, 6 years ago (diff)
Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Assets;
5using Jypeli.Controls;
6using Jypeli.Effects;
7using Jypeli.Widgets;
8
9class MikonParticle : GameObject
10{
11    private Proto236b parent;
12    private Vector velocity;
13    public Vector Velocity { get { return velocity; } set { velocity = value; } }
14    private Angle angularVelocity;
15    public Angle AngularVelocity { get { return angularVelocity; } set { angularVelocity = value; } }
16    private double mass;
17    public double Mass { get { return mass; } set { mass = value; } }
18    private bool ignoresGravity;
19    public bool IgnoresGravity { get { return ignoresGravity; } set { ignoresGravity = value; } }
20    private bool broken = false;
21    public override void Update(Time time)
22    {
23        this.Position += this.velocity / this.mass / 20;
24        if (!this.ignoresGravity)
25        {
26            this.Velocity += this.parent.Gravity / 120;
27        }
28        this.Angle += this.angularVelocity;
29        if (this.parent.Level.Left > this.Position.X || this.parent.Level.Right < this.Position.X)
30        {
31            this.Destroy();
32        }
33        if (this.parent.Level.Bottom > this.Position.Y || this.parent.Level.Top < this.Position.Y)
34        {
35            this.Destroy();
36        }
37        base.Update(time);
38    }
39    public void Break(int method, int pieceCountX = 2, int pieceCountY = 2)
40    {
41        if (this.broken) { return; }
42        this.Destroy();
43        this.broken = true;
44        switch (method)
45        {
46            case 0://uniform break
47                var pieceWidth = this.Width / pieceCountX;
48                var pieceHeight = this.Height / pieceCountY;
49                if (pieceWidth < 1 || pieceHeight < 1) { return; }
50                //loop x and y through
51                //calc left corner
52                var startCorner = Vector.FromLengthAndAngle(this.Width / 2 - pieceWidth / 2, this.AbsoluteAngle + Angle.StraightAngle) + Vector.FromLengthAndAngle(this.Height / 2 - pieceHeight / 2, this.AbsoluteAngle - Angle.RightAngle); //vasen alakulma
53
54                for (int y = 0; y < pieceCountY; y++)
55                {
56                    for (int x = 0; x < pieceCountX; x++)
57                    {
58                        int w = this.Image.Width / pieceCountX, h = this.Image.Height / pieceCountY;
59                        var imageArea = this.Image.Area(
60                            w * x,
61                            h * (pieceCountY - y - 1),
62                            w * (x + 1),
63                            h * ((pieceCountY - y - 1) + 1)
64                        );
65                        MikonParticle childBox = new MikonParticle(this.parent, pieceWidth, pieceHeight);
66                        childBox.Tag = this.Tag;
67                        childBox.IgnoresGravity = this.IgnoresGravity;
68                        childBox.Image = imageArea;
69                        childBox.Mass = this.Mass;
70
71                        childBox.AbsoluteAngle = this.AbsoluteAngle;
72                        childBox.AngularVelocity = this.AngularVelocity;
73
74                        childBox.Position = this.Position + startCorner
75                            + Vector.FromLengthAndAngle(x * pieceWidth, this.AbsoluteAngle) //plus x                                                               
76                            + Vector.FromLengthAndAngle(y * pieceHeight, this.AbsoluteAngle + Angle.RightAngle); //plus y                                         
77
78                        childBox.Velocity = this.Velocity + RandomGen.NextVector(10, 30);
79
80                        if (RandomGen.NextDouble(0, 1) < 0.2)
81                        {
82                            childBox.Break(method, 2, 1);
83                        }
84
85                        Game.Add(childBox);
86                    }
87                }
88                break;
89        }
90    }
91    public MikonParticle(Proto236b parent, double w, double h)
92        : base(w, h)
93    {
94        this.parent = parent;
95        this.IsUpdated = true;
96    }
97}
98public class MikonPhysicsObject : PhysicsObject
99{
100    private bool broken = false;
101    private Proto236b game;
102    public void Break(int method, int pieceCountX = 2, int pieceCountY = 2)
103    {
104        if (this.broken) { return; }
105        this.Destroy();
106        this.broken = true;
107        switch (method)
108        {
109            case 0://uniform break
110                var pieceWidth = this.Width / pieceCountX;
111                var pieceHeight = this.Height / pieceCountY;
112                if (pieceWidth < 4 || pieceHeight < 4) { return; }
113                var cheap = false;
114                if (pieceWidth < 10 || pieceHeight < 10) { cheap = true; }
115                //loop x and y through
116                //calc left corner
117                var startCorner = Vector.FromLengthAndAngle(this.Width / 2 - pieceWidth / 2, this.AbsoluteAngle + Angle.StraightAngle) + Vector.FromLengthAndAngle(this.Height / 2 - pieceHeight / 2, this.AbsoluteAngle - Angle.RightAngle); //vasen alakulma
118
119                for (int y = 0; y < pieceCountY; y++)
120                {
121                    for (int x = 0; x < pieceCountX; x++)
122                    {
123                        int w = this.Image.Width / pieceCountX, h = this.Image.Height / pieceCountY;
124                        /*var imageArea = this.Image.Area(
125                            w * x,
126                            h * (pieceCountY - y - 1),
127                            w * (x + 1),
128                            h * ((pieceCountY - y - 1) + 1)
129                        );*/
130                        if (!cheap)
131                        {
132                            MikonPhysicsObject childBox = new MikonPhysicsObject(this.game, pieceWidth, pieceHeight);
133                            childBox.Tag = this.Tag;
134                            childBox.IgnoresGravity = false;
135                            childBox.Image = this.Image;
136
137                            childBox.AbsoluteAngle = this.AbsoluteAngle;
138                            childBox.AngularVelocity = this.AngularVelocity;
139
140                            childBox.Position = this.Position + startCorner
141                                + Vector.FromLengthAndAngle(x * pieceWidth, this.AbsoluteAngle) //plus x                                                               
142                                + Vector.FromLengthAndAngle(y * pieceHeight, this.AbsoluteAngle + Angle.RightAngle); //plus y                                         
143
144                            childBox.Velocity = this.Velocity + RandomGen.NextVector(10, 30);
145
146                            Game.Add(childBox);
147                        }
148                        else
149                        {
150                            MikonParticle childBox = new MikonParticle(this.game, pieceWidth, pieceHeight);
151                            childBox.Tag = this.Tag;
152                            childBox.IgnoresGravity = this.IgnoresGravity;
153                            childBox.Image = this.Image;
154                            childBox.Mass = this.Mass;
155
156                            childBox.AbsoluteAngle = this.AbsoluteAngle;
157                            childBox.AngularVelocity = Angle.FromDegrees(this.AngularVelocity * 7);
158
159                            childBox.Position = this.Position + startCorner
160                                + Vector.FromLengthAndAngle(x * pieceWidth, this.AbsoluteAngle) //plus x                                                               
161                                + Vector.FromLengthAndAngle(y * pieceHeight, this.AbsoluteAngle + Angle.RightAngle); //plus y                                         
162
163                            childBox.Velocity = this.Velocity + RandomGen.NextVector(10, 30);
164
165                            //if (RandomGen.NextDouble(0, 1) < 0.2)
166                            //{
167                            //    childBox.Break(method, pieceCountX, pieceCountY);
168                            //}
169
170                            Game.Add(childBox);
171                        }
172                    }
173                }
174                break;
175        }
176    }
177    public MikonPhysicsObject(Proto236b game, double w, double h)
178        : base(w, h)
179    {
180        // TODO: Complete member initialization
181        //game.AddCollisionHandler(game.level, this, delegate { this.Break(0, 2, 2); });
182        this.game = game;
183        this.Tag = "breakable";
184    }
185}
Note: See TracBrowser for help on using the repository browser.