source: 2010/27/sijoseha/BuildingBuilder/Peli.cs @ 1327

Revision 1327, 6.4 KB checked in by sijoseha, 11 years ago (diff)

Commit, jotta voin jatkaa kotona.

Line 
1using System;
2using System.Collections.Generic;
3using Jypeli;
4using Jypeli.Widgets;
5using Jypeli.Assets;
6using Jypeli.Effects;
7
8public class Peli : PhysicsGame
9{
10    PhysicsObject newestBlock, dropArrow, ground;
11    Stack<PhysicsObject> tower;
12    enum DropArrowDirection
13    {
14        Left,
15        Right
16    }
17    DropArrowDirection dAD;
18    Image dropArrowImage = LoadImage("dropArrow");
19    Image perfect = LoadImage("perfectText");
20    Boolean drop, cameraMoving;
21    double startZoom, towerH;
22    Label towerHeight;
23    ParticleSystem scoreEffect;
24    HighScoreList highestTowers;
25
26    protected override void Begin()
27    {
28        LoadContent();
29
30        StartGame();
31       
32        LoadEffect();
33    }
34    void LoadContent()
35    {
36        highestTowers = HighScoreList.LoadOrCreate("highestTowers.cmo", 20);
37    }
38
39    void LoadEffect()
40    {
41        scoreEffect = new ParticleSystem(perfect, 10, false);
42        scoreEffect.MaxAcceleration = 1;
43        scoreEffect.MinAcceleration = 1;
44        scoreEffect.MaxVelocity = 0;
45        scoreEffect.MinVelocity = 0;
46        scoreEffect.MinScale = 0.7;
47        scoreEffect.MaxScale = 1.0;
48        scoreEffect.MaxRotation = 0;
49        scoreEffect.MinRotation = 0;
50        scoreEffect.MaxRotationSpeed = 0;
51        scoreEffect.MinRotationSpeed = 0;
52        scoreEffect.MaxLifetime = 2;
53        scoreEffect.MinLifetime = 1;       
54        Add(scoreEffect);
55    }
56
57    void StartGame()
58    {
59        ClearAll();
60        towerHeight = new Label();
61        towerHeight.TextColor = Color.Black;
62        towerHeight.SizeMode = TextSizeMode.AutoSize;
63        towerHeight.DecimalPlaces = 2;
64        towerHeight.X = Camera.X + 300;
65        Add(towerHeight);
66        tower = new Stack<PhysicsObject>();
67        Level.Width = 3000;
68        Gravity = new Vector(0, -400);
69        CreateDropArrow();
70        Keyboard.Listen(Key.Space, ButtonState.Released, CreateBlock, "");
71        NewGame();
72    }
73
74    void NewGame()
75    {
76        while (tower.Count > 0)
77        {
78            tower.Pop().Destroy();
79        }
80        ground = Level.CreateGround(Level.Bottom, 40, 20, Color.Green, 20);
81        //tower.Push(ground);
82        drop = true;
83        cameraMoving = false;
84        startZoom = Camera.Y - ground.Y;
85        Camera.Zoom(0.8);
86        dropArrow.Position = new Vector(Camera.X, Camera.Y + 380);
87    }
88
89    void CreateDropArrow()
90    {
91        dropArrow = new PhysicsObject(48, 48);
92        dropArrow.Image = dropArrowImage;
93        dropArrow.IgnoresGravity = true;
94        Add(dropArrow);
95    }
96
97    void CreateBlock()
98    {
99        if (drop)
100        {
101            drop = false;
102            PhysicsObject block = new PhysicsObject(100, 100, Shapes.Rectangle);
103            block.Position = new Vector(dropArrow.X, Camera.Y + 200);
104            block.KineticFriction = 1.0;
105            block.Color = Color.Red;
106            block.AngularVelocity = 0;
107            block.AngularDamping = 0.3;
108            //block.CanRotate = false;
109            block.LinearDamping = 1.0;
110            block.Restitution = 0.1;
111            block.Tag = "block";
112            Add(block);
113            newestBlock = block;
114            AddCollisionHandler(block, BlockCollision);
115        }
116    }
117
118    void BlockCollision(PhysicsObject collider, PhysicsObject target)
119    {
120        if (collider == newestBlock)
121        {
122            drop = true;
123        }
124        if (collider.Y > Camera.Y)
125        {
126            //cameraMoving = true;
127            //UpdateDropArrowBrain();
128        }
129        if (collider == newestBlock && target == ground && tower.Count == 0)
130        {
131            tower.Push(collider);
132            tower.Peek().Tag = "base";
133        }
134        if (collider.Tag.ToString() == "block" && target == ground)
135        {
136            GameOver();
137        }
138        if (collider == newestBlock && target == tower.Peek())
139        {
140            if (tower.Peek().X - 5 < collider.X && collider.X < tower.Peek().X + 5)
141            {
142                collider.X = tower.Peek().X;
143                //tower.Peek().Angle = collider.Angle;
144                tower.Peek().Stop();
145                collider.Stop();
146                scoreEffect.AddEffect(Camera.X, Camera.Y, 1);
147            }
148            tower.Peek().Color = Color.White;
149            tower.Push(collider);
150            //hittedBlock = collider;
151            //hittedBlock.Color = Color.Green;
152            tower.Peek().Color = Color.Green;
153            cameraMoving = true;
154        }
155    }
156
157    void GameOver()
158    {
159        int roundedHeight = (int)Math.Round(towerH, 0);
160        highestTowers.Show(roundedHeight);
161        KysyUusipeli();
162    }
163
164    void KysyUusipeli()
165    {
166        PushButton aloitaUusipeli = new PushButton(50, 20, "Uusi peli");
167        PushButton lopetaPeli = new PushButton(50, 20, "Lopeta peli");
168        aloitaUusipeli.Clicked +=new Action(NewGame);
169        lopetaPeli.Clicked += new Action(QuitGame);
170    }
171
172    void QuitGame()
173    {
174        Exit();
175    }
176
177    protected override void Update(Time time)
178    {
179        if (tower.Count > 0)
180        {
181            if (towerH < Math.Round(tower.Peek().Y - ground.Y, 2))
182                towerH = Math.Round(tower.Peek().Y - ground.Y, 2);
183            towerHeight.Text = "Tornin korkeus: " + Math.Round(tower.Peek().Y - ground.Y, 2).ToString()
184                + " metriä\nTornin suurin korkeus: " + towerH + " metriä";
185        }
186        towerHeight.Y = 360;
187        if (tower.Count > 0 && tower.Peek().Y < Camera.Y - 400 && tower.Peek().Tag.ToString() == "block" && Camera.ZoomFactor > (startZoom/(Camera.Y-ground.Y)-0.05))
188        {
189            Camera.Zoom(0.9);
190        }
191        dropArrow.Y = Camera.Y + 380;
192        if (cameraMoving)
193        {
194            Camera.Y += 2;
195            if (tower.Peek().Y < Camera.Y)
196            {
197                cameraMoving = false;
198            }
199        }
200        if (tower.Count > 0 && Camera.Y < tower.Peek().Y)
201        {
202            cameraMoving = true;
203        }
204
205        if (dAD == DropArrowDirection.Left)
206        {
207            dropArrow.X -= 5;
208            if (dropArrow.X <= -150)
209                dAD = DropArrowDirection.Right;
210        }
211        else if (dAD == DropArrowDirection.Right)
212        {
213            dropArrow.X += 5;
214            if (dropArrow.X >= 150)
215                dAD = DropArrowDirection.Left;
216        }
217        base.Update(time);
218    }
219}
Note: See TracBrowser for help on using the repository browser.