Пример #1
0
        /// <summary>
        /// Sprawdzanie kolizji spadającego klocka
        /// </summary>
        private void UpdateBlockCollision()
        {
            // Jeżeli nastąpił kontakt spadającego klocka z jakimś
            // Innym ciałem, zmien flagę, że można puścić następny kloc.

            // TODO: Ogarnąć czy to jest dokladny sposob bo chyba nie.
            if (CurrentBlock.myBody.ContactList != null)
            {
                // Zmien flage.
                blockOnHisWay = false;

                //CurrentBlock.myBody.LinearVelocity = Vector2.Zero;
                //CurrentBlock.myBody.IgnoreGravity = false;
                // Zapomnij tego klocka jako currenta.
                CurrentBlock = null;
            }
        }
Пример #2
0
        /// <summary>
        /// Procedura resetujaca swiat fizyczny i wszystkie danye, oraz zaczynajaca gre od nowa
        /// </summary>
        private void ResetLevelProcedure()
        {
            // reset flag zwyciestwa
            failFlag = false;
            winFlag = false;
            afterWinProcedureDone = false;
            highestBodyPosition = 1000;
            // wyzerowanie obecnie spadajacego bloku - referencji, ona i tak bedzie null, po ponizszej isntrukcji
            // ale dla pewnosci
            CurrentBlock = null;

            // zresetuj czas zeby nie bylo zadnych bugow silnika fizycznego
            this.Game.ResetElapsedTime();

            world.Clear();

            // Tworzenie podlogi od nowa bo cos sie chrzanilo
            _floor = BodyFactory.CreateRectangle(world,
                                                ConvertUnits.ToSimUnits(GraphicsDevice.Viewport.Width),
                                                ConvertUnits.ToSimUnits(floorHeight),
                                                10f);
            //_floor.Position = ConvertUnits.ToSimUnits(GraphicsDevice.Viewport.Width / 2, GraphicsDevice.Viewport.Height - 50);
            Vector2 posi = new Vector2(GraphicsDevice.Viewport.Width / 2, GraphicsDevice.Viewport.Height - floorHeight / 2);
            _floor.Position = ConvertUnits.ToSimUnits(posi);
            _floor.BodyType = BodyType.Static;
            _floor.IsStatic = true;
            _floor.Restitution = 0.1f;
            _floor.Friction = 2.5f;
            _floor.OnCollision += new OnCollisionEventHandler(CheckFloorCollision);
            // Tworzenie platformy
            _platform = BodyFactory.CreateRectangle(world,
                                                ConvertUnits.ToSimUnits(platformWidth),
                                                ConvertUnits.ToSimUnits(platformHeight),
                                                10f);
            //_platform.Position = ConvertUnits.ToSimUnits(GraphicsDevice.Viewport.Width / 2, GraphicsDevice.Viewport.Height - 100);
            Vector2 posi2 = new Vector2(GraphicsDevice.Viewport.Width / 2, GraphicsDevice.Viewport.Height - platformHeight / 2 - floorHeight);
            _platform.Position = ConvertUnits.ToSimUnits(posi2);
            _platform.BodyType = BodyType.Static;
            _platform.IsStatic = true;
            _platform.Restitution = 0.1f;
            _platform.Friction = 5.0f;

            // usuniecie z listy
            //blocksOnPlatform.RemoveRange(0, blocksOnPlatform.Count);

            // Zmienna umozliwiajaca pszczenie nastepnego bloku
            blockOnHisWay = false;

            timer.Start();
        }
Пример #3
0
        /// <summary>
        /// Update logiki, sterowanie itp
        /// </summary>
        /// <param name="gameTime"></param>
        public void Update(GameTime gameTime)
        {
            // Jeżeli poprzedni blok został usytuowany
            if (!blockOnHisWay)
            {
                // Losowanie randomowego typu bloku
                var random = new Random();
                var type = random.Next(1,7);

                // Losowanie randomowego obrotu klocka, od 0 do 360
                float rot = (float)random.Next(0,360);

                // Stworzenie bloku = jednoznacze z dodaniem go do świata
                CurrentBlock = new Block(ref world, tex, (BLOCKTYPES)type, rot);
                //CurrentBlock.myBody.IgnoreGravity = true;
                //CurrentBlock.myBody.LinearVelocity = new Vector2(0, 1);
                blockOnHisWay = true;
            }

            // Aktualizacja fizyki
            //world.Step((float)gameTime.ElapsedGameTime.TotalMilliseconds*0.001f);
              world.Step(Math.Min((float)gameTime.ElapsedGameTime.TotalMilliseconds * 0.001f, (1f / 3f)));

            // Usunięcie Boxów które wypadły za świat
            foreach (var box in from box in world.BodyList
                                let pos = ConvertUnits.ToDisplayUnits(box.Position)
                                where pos.Y > SharedGraphicsDeviceManager.Current.GraphicsDevice.Viewport.Height
                                select box)
            {
                world.RemoveBody(box);
            }

            // Sprawdzanie kolizji spadającego klocka
            UpdateBlockCollision();

            //Pętla odczytujaca gesty z ekranu
            while (TouchPanel.IsGestureAvailable)
            {
                //odczyt gestu z ekranu
                GestureSample gesture = TouchPanel.ReadGesture();

                //switch sprawdzający który z gestów z Initialize jest wykonywany
                switch (gesture.GestureType)
                {
                    case GestureType.VerticalDrag:
                        if (CurrentBlock != null) CurrentBlock.myBody.Rotation += 0.01f * gesture.Delta.Y;
                        break;
                    case GestureType.HorizontalDrag:
                        if (CurrentBlock != null) CurrentBlock.myBody.Position += 0.01f * gesture.Delta;
                        break;
                }

            }
        }
Пример #4
0
        /// <summary>
        /// Update
        /// </summary>
        /// <param name="gameTime"></param>
        public override void Update(GameTime gameTime)
        {
            base.Update(gameTime);

            // PAUZA WŁĄCZONA - FREEZE THE GAME, nie odswiezamy silnika fizycznego
            if (pauseFlag)
            {

                // zresetuj czas zeby nie bylo zadnych bugow silnika fizycznego
                this.Game.ResetElapsedTime();
            }
            else
            {
                // Klocek nie spadl na ziemie, gra się toczy
                if (!failFlag && !winFlag && !countDownStarted)
                {
                    // Jeżeli poprzedni blok został usytuowany
                    if (!blockOnHisWay)
                    {
                        // Losowanie randomowego typu bloku
                        var random = new Random();

                        int type = 0;

                        // Losowanie kształtu teraz i następnego
                        if (nextShape == 0)
                        {
                            var firstType = random.Next(1, 7);
                            var next = random.Next(1, 7);

                            nextShape = next;
                            type = firstType;
                        }
                        else
                        {
                            type = nextShape;
                            var next = random.Next(1, 7);

                            nextShape = next;
                        }

                        // Losowanie randomowego obrotu klocka, od 0 do 360
                        float rot = (float)random.Next(0, 360);

                        // Stworzenie bloku = jednoznacze z dodaniem go do świata
                        CurrentBlock = new Block(GraphicsDevice, ref world, ShapesTextures[(BLOCKTYPES)type], (BLOCKTYPES)type, rot);

                        // Dodanie handlera odpalanego przy kolizji
                        CurrentBlock.myBody.OnCollision += new OnCollisionEventHandler(myBody_OnCollision);
                        CurrentBlock.myBody.IgnoreGravity = true;
                        CurrentBlock.myBody.LinearVelocity = new Vector2(0f, GameCC.BlockSpeed);

                        blockOnHisWay = true;

                    }

                    // Aktualizacja fizyki

                    world.Step(Math.Min((float)gameTime.ElapsedGameTime.TotalMilliseconds * 0.001f, (1f / 3f)));

                    // Sprawdzanie kolizji spadającego klocka
                    UpdateLevelData();

                    // Zmiana pozycji kamery ze względu na wysokość wieży
                    // UpdateHighestBodyPos();

                }

                // Jeżeli osiągnięto wysokosc, zacznij odliczanie
                else if (countDownStarted)
                {
                    // Update timera
                    CountDownTimer.Update(gameTime);

                    // Jeżeli update osiagnal 0, to znacyz ze wygrana
                    if (CountDownTimer.countEnded)
                    {
                        if (!failFlag)
                            winFlag = true;
                        countDownStarted = false;
                    }
                    // Jeżeli nie osiagnal zera, to aktualizuj fizyke, jeżeli klocek jakiś spadnie, to kolizja z podloga wywola flage fail
                    else
                    {
                        world.Step(Math.Min((float)gameTime.ElapsedGameTime.TotalMilliseconds * 0.001f, (1f / 3f)));

                        // Jeżeli zmienilo cialo swoje polozenie gruboa
                        if (Math.Abs(WinningBody.Position.X - WinningBodyPos.X) > 0.15f || Math.Abs(WinningBody.Position.Y - WinningBodyPos.Y) > 0.15f)
                        {
                            failFlag = true;
                            notStableFlag = true;
                            countDownStarted = false;
                        }
                        // OSTATECZNA WYGRANA - AKCJE ZWIAZANE Z AKTUALIZACJA GRY PO WYGRANEj
                        else
                        {
                            AfterWinProcedure();
                        }
                    }

                }

            }

            // Update input niezaleznie od tego jaki stan
            UpdateInput();
        }