source: 2014/27/AleksanteriV/Protokolla236/Protokolla236/Protokolla236/MikonPhysicsObject.cs @ 5354

Revision 5354, 6.0 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 Protokolla236 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    public override void Update(Time time)
21    {
22        this.Position += this.velocity / this.mass / 20;
23        if (!this.ignoresGravity)
24        {
25            this.Velocity += this.parent.Gravity / 120;
26        }
27        this.Angle += this.angularVelocity;
28        if (this.parent.Level.Left > this.Position.X || this.parent.Level.Right < this.Position.X)
29        {
30            this.Destroy();
31        }
32        if (this.parent.Level.Bottom > this.Position.Y || this.parent.Level.Top < this.Position.Y)
33        {
34            this.Destroy();
35        }
36        base.Update(time);
37    }
38    public MikonParticle(Protokolla236 parent, double w, double h)
39        : base(w, h)
40    {
41        this.parent = parent;
42        this.IsUpdated = true;
43    }
44}
45public class MikonPhysicsObject : PhysicsObject
46{
47    private bool broken = false;
48    private Protokolla236 game;
49    public void Break(int method, int pieceCountX = 2, int pieceCountY = 2)
50    {
51        if (this.broken) { return; }
52        this.Destroy();
53        this.broken = true;
54        switch (method)
55        {
56            case 0://uniform break
57                var pieceWidth = this.Width / pieceCountX;
58                var pieceHeight = this.Height / pieceCountY;
59                if (pieceWidth < 1 || pieceHeight < 1) { return; }
60                var cheap = false;
61                if (pieceWidth < 10 || pieceHeight < 10) { cheap = true; }
62                //loop x and y through
63                //calc left corner
64                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
65
66                for (int y = 0; y < pieceCountY; y++)
67                {
68                    for (int x = 0; x < pieceCountX; x++)
69                    {
70                        int w = this.Image.Width / pieceCountX, h = this.Image.Height / pieceCountY;
71                        var imageArea = this.Image.Area(
72                            w * x,
73                            h * (pieceCountY - y - 1),
74                            w * (x + 1),
75                            h * ((pieceCountY - y - 1) + 1)
76                        );
77                        if (!cheap)
78                        {
79                            MikonPhysicsObject childBox = new MikonPhysicsObject(this.game, pieceWidth, pieceHeight);
80                            childBox.Tag = this.Tag;
81                            childBox.IgnoresGravity = this.IgnoresGravity;
82                            childBox.Image = imageArea;
83
84                            childBox.AbsoluteAngle = this.AbsoluteAngle;
85                            childBox.AngularVelocity = this.AngularVelocity;
86
87                            childBox.Position = this.Position + startCorner
88                                + Vector.FromLengthAndAngle(x * pieceWidth, this.AbsoluteAngle) //plus x                                                               
89                                + Vector.FromLengthAndAngle(y * pieceHeight, this.AbsoluteAngle + Angle.RightAngle); //plus y                                         
90
91                            childBox.Velocity = this.Velocity;
92
93                            //childBox.Position += offset;
94
95                            //if (RandomGen.NextDouble(0, 1) < 0.2)
96                            //{
97                            //    childBox.Break(method, pieceCountX, pieceCountY);
98                            //}
99
100                            Game.Add(childBox);
101                        }
102                        else
103                        {
104                            MikonParticle childBox = new MikonParticle(this.game, pieceWidth, pieceHeight);
105                            childBox.Tag = this.Tag;
106                            childBox.IgnoresGravity = this.IgnoresGravity;
107                            childBox.Image = imageArea;
108                            childBox.Mass = this.Mass;
109
110                            childBox.AbsoluteAngle = this.AbsoluteAngle;
111                            childBox.AngularVelocity = Angle.FromDegrees(this.AngularVelocity * 7);
112
113                            childBox.Position = this.Position + startCorner
114                                + Vector.FromLengthAndAngle(x * pieceWidth, this.AbsoluteAngle) //plus x                                                               
115                                + Vector.FromLengthAndAngle(y * pieceHeight, this.AbsoluteAngle + Angle.RightAngle); //plus y                                         
116
117                            childBox.Velocity = this.Velocity + RandomGen.NextVector(10, 30);
118
119                            //if (RandomGen.NextDouble(0, 1) < 0.2)
120                            //{
121                            //    childBox.Break(method, pieceCountX, pieceCountY);
122                            //}
123
124                            Game.Add(childBox);
125                        }
126                    }
127                }
128                break;
129        }
130    }
131    public MikonPhysicsObject(Protokolla236 game, double w, double h)
132        : base(w, h)
133    {
134        // TODO: Complete member initialization
135        //game.AddCollisionHandler(game.level, this, delegate { this.Break(0, 2, 2); });
136        this.game = game;
137    }
138}
Note: See TracBrowser for help on using the repository browser.