/// <summary> /// Új játék indítása. /// </summary> /// <param name="Mode">Új játékmód beállítása, amennyiben van értéke</param> void LaunchGame(GameModes?Mode = null) { if (Mode.HasValue) { GameMode = Mode.Value; } DespawnMenu(); Dispenser.DispenserReset(); Playing = true; Score = 0; ThisCombo = 0; SinceLastCombo = 0; if (GameMode == GameModes.Arcade) // Induljon hiperaktívan az árkád mód { Time.timeScale = ArcadeSpeed; } // Score attack / multiplayer Lives = 3; LoseLife = false; // Time attack / arcade TimeRemaining = 60; // Multiplayer ScoreP2 = 0; CurrentController = Controllers.LeapMotion + Convert.ToInt32(HoloLensMode) * (Controllers.HoloLens - Controllers.LeapMotion); }
/// <summary> /// Küldje be a kért mennyiségű tárgyat. /// </summary> void LateUpdate() { Delay -= Time.deltaTime; if (Delay <= 0) { Dispenser.ForceDispense(); Delay = 1 / (float)ObjectsPerSec; } }
/// <summary> /// Képernyőről kieséskor hívódik meg. /// </summary> public void Fell() { Dispenser.ObjectDespawned(); // Tudassuk a dobálóval, hogy valami eltűnt if (Type == Types.Grenade) // A gránátnál az a jó, ha leesik { Destroy(gameObject); return; } GameObject Marker = new GameObject(); // Jelző a képernyőre Marker.transform.position = transform.position; Marker.AddComponent <FallMarker>().Duration *= Time.timeScale; Game.LoseLife = true; // Életvesztés }
/// <summary> /// Képkockafrissítés. /// </summary> void Update() { // Menüműveletek kezelése if (SelectedMenuItem != -1) { switch (SelectedMenu) { case 0: // Főmenü switch (SelectedMenuItem) { case 0: SpawnModeSelect(); break; // Új játék case 1: SpawnCustomizationMenu(); break; // Testreszabás case 2: Application.Quit(); return; // Kilépés } break; case 1: // Testreszabás int BladeCount = Blades.Length; if (SelectedMenuItem == BladeCount + Wallpapers.Length) // Vissza { SpawnMainMenu(); } else if (SelectedMenuItem != -1) // Kiválasztott elemek { if (SelectedMenuItem < BladeCount) { if (!MenuItems[SelectedMenuItem].Action.StartsWith("Reach")) { PlayerPrefs.SetInt("Blade", SetBlade(SelectedMenuItem)); } } else { if (!MenuItems[SelectedMenuItem].Action.StartsWith("Combo")) { PlayerPrefs.SetInt("Wallpaper", SetBackground(SelectedMenuItem - BladeCount)); } } SpawnCustomizationMenu(SelectedMenuItem < BladeCount + Wallpapers.Length ? SelectedMenuItem : -1); } break; case 2: // Játékmódválasztó if (SelectedMenuItem == 0) { SpawnMainMenu(); } else { LaunchGame((GameModes)SelectedMenuItem); } break; case 3: // Game Over if (SelectedMenuItem == 0) // Újra { LaunchGame(); // Új játék SelectedMenu = 0; // Enélkül maradna a Game Over UI } else // Főmenü { GameMode = GameModes.ScoreAttack; // Ha többjátékos lenne, használható lenne a player 2 pointer, árkádban pedig powerupok kerülnének a menübe SpawnMainMenu(); // Menü megjelenítése } break; default: break; } DisableInput = .25f; } SelectedMenuItem = -1; // Játék kezelése if (Playing) { Dispenser.DispenserUpdate(); // Dobáló frissítése // Kombó kiértékelése SinceLastCombo += Time.deltaTime; if (SinceLastCombo > .15f && GameMode != GameModes.Multiplayer) { if (ThisCombo > 2) { if (BestCombo < ThisCombo) { BestCombo = ThisCombo; } GameObject Marker = new GameObject(); Marker.transform.position = LastHit; ComboMarker ComboMark = Marker.AddComponent <ComboMarker>(); ComboMark.Combo = ThisCombo; ComboMark.Duration *= Time.timeScale; Score += ThisCombo; } ThisCombo = 0; } // Pontgyűjtő módok if (GameMode == GameModes.ScoreAttack || GameMode == GameModes.Multiplayer) { if (LoseLife) { if (--Lives == 0) { Playing = false; GameOver(); } LoseLife = false; } // Idő elleni módok } else if (GameMode == GameModes.TimeAttack || GameMode == GameModes.Arcade) { TimeRemaining -= Time.deltaTime / Time.timeScale; if (TimeRemaining <= 0) { Playing = false; GameOver(); } } } // Menüobjektumok elhelyezése for (int i = 0; i < MenuItems.Length; i++) { MenuItems[i].Obj.transform.position = new Vector3(Mathf.Lerp(CloserBL.x, CloserBR.x, MenuItems[i].ScreenPos.x), Mathf.Lerp(CloserBL.y, CloserTL.y, MenuItems[i].ScreenPos.y), Mathf.Lerp(CloserBL.z, CloserBR.z, MenuItems[i].ScreenPos.x)); MenuItems[i].ActualScrPos = Camera.main.WorldToScreenPoint(MenuItems[i].Obj.transform.position); } // Kurzor helye a kijelzőn és a világban Vector2 LookPosition = new Vector2(-1, -1), OldPosition = new Vector2(), OldP2Position = new Vector2(); switch (PreviousController) { case Controllers.Mouse: OldPosition = MousePosition; LookPosition = MousePosition = Input.mousePosition; if (Leap.SinglePointOnScreen().x != -1) // Ha megmozdul a LeapMotion, váltson rá { CurrentController = Controllers.LeapMotion; } break; case Controllers.LeapMotion: int HalfLeapSpaceHeight = (int)(Screen.height * (Leap.LeapUpperBounds.x - Leap.LeapLowerBounds.x) / Screen.width) / 2; Leap.LeapLowerBounds.y = 200 - HalfLeapSpaceHeight; Leap.LeapUpperBounds.y = 200 + HalfLeapSpaceHeight; int ExtendedFingers = Leap.ExtendedFingers(); if (Leap.GetHandCount() != 0 && ExtendedFingers != 0) { OldPosition = LeapPosition; LookPosition = LeapPosition = ExtendedFingers == 1 ? Leap.SinglePointOnScreen() : Leap.PalmOnScreen(); } if (GameMode == GameModes.Multiplayer) { OldP2Position = MousePosition; MousePosition = Input.mousePosition; } else if (MousePosition.x != Input.mousePosition.x || MousePosition.y != Input.mousePosition.y) // Ha megmozdul az egér, váltson rá { CurrentController = Controllers.Mouse; } break; case Controllers.HoloLens: OldPosition = LookPosition = new Vector2(Screen.width / 2, Screen.height / 2); break; } if (PreviousController != CurrentController || (LookPosition.x == -1 && LookPosition.y == -1)) { OldPosition = LookPosition; // Ha bármiféle eszközcsere/inputkiesés történt, ne vágjon semmit... Pointer.GetComponent <TrailRenderer>().Clear(); // ...és az előző vágási nyomvonal tűnjön el, mivel nem az folytatódik már } PreviousController = CurrentController; PointerHandler(ref Pointer, ref OldPosition, ref LookPosition, ref Score, ref LookPoint); if (GameMode == GameModes.Multiplayer) { PointerHandler(ref Player2, ref OldP2Position, ref MousePosition, ref ScoreP2, ref LookPointP2); } }
/// <summary> /// Találatkor hívódik meg. /// </summary> /// <param name="Score">Elvágó játékos pontszáma</param> public void Hit(ref int Score) { if (GotHit || !Body) { return; } GotHit = true; // Ha ez nincs, rengetegszer meghívódna a függvény if (name.StartsWith("Menu")) { Game.SelectedMenuItem = Convert.ToInt32(name.Substring(4)); // A kiválasztott menüelem száma a névben van } if (Game.Playing) // Csak játék közben módosítson statisztikákat, mert a Game Over menüvel nem tűnnek el -> nem bug, feature { Dispenser.ObjectDespawned(); Game.SinceLastCombo = 0; Game.ThisCombo++; Game.LastHit = transform.position; if (Type == Types.Grenade) { ((GameObject)Instantiate(Game.Instance.Explosion, transform.position, transform.rotation)).transform.localScale *= Game.Instance.Scale * .1f; // Nagyobb robbanás effekt foreach (Rigidbody EachBody in FindObjectsOfType(typeof(Rigidbody))) // Lökjön el mindent magától { if (EachBody != Body) { Destroy(EachBody.gameObject.GetComponent <Target>()); EachBody.gameObject.AddComponent <DespawnTime>(); Dispenser.ObjectDespawned(); } EachBody.AddExplosionForce(Game.Instance.Scale * 50, transform.position, Game.Instance.Scale + Game.Instance.Scale); } Game.LoseLife = true; if (Game.GameMode == GameModes.Multiplayer) // Többjátékos módban pontlevonás is jár a gránátért { Score -= 25; } Game.ThisCombo = 0; } else { Score++; } // Ha power up vágódott el, aktiválódjon if (PowerUp != PowerUps.None) { switch (PowerUp) { case PowerUps.DoubleScore: PwrDoubleScore.Activate(); break; case PowerUps.Itemstorm: PwrItemstorm.Activate(); break; case PowerUps.SlowMotion: PwrSlowMotion.Activate(transform.position); break; } } } Vector3 ParentVelocity = Body.velocity; foreach (GameObject Shrapnel in Shrapnels) // Essen szét darabokra { Shrapnel.transform.parent = null; Shrapnel.AddComponent <Despawner>(); Rigidbody ChildBody = Shrapnel.AddComponent <Rigidbody>(); ChildBody.AddForce(ParentVelocity); ChildBody.AddTorque(new Vector3(Random.value * 100, Random.value * 100, Random.value * 100)); ChildBody.AddExplosionForce(Game.Instance.Scale * 6, transform.position, 10); } ((GameObject)Instantiate(Game.Instance.Explosion, transform.position, transform.rotation)).transform.localScale *= Game.Instance.Scale * .02f; // Robbanás effekt SingleShotAudio.Play(Game.Instance.SliceSounds[Random.Range(0, Game.Instance.SliceSounds.Length)], transform.position); // Vágás hangja Destroy(gameObject); }