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

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