/// <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; } }
/// <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(); }
/// <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; } } }
/// <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(); }