public void addButton() { //nb = nombre de boutons à spawn en même temps int nb = 1; //On sélectionne un nombre entre 0 et 100... float probaNombreSpawn = (float)(rand.Next(10000)) / 100.0f; //... on a 0.5% de chance d'avoir 4 touches en même temps... if (probaNombreSpawn > 99.5f) { nb = 4; } //... 5% d'en avoir 3... else if (probaNombreSpawn > 94.5f) { nb = 3; } //... 7% d'en avoir 2... else if (probaNombreSpawn > 84.5f) { nb = 2; } //... 87.5% d'en avoir 1 (on ne met pas la valeur car elle est déjà à 1). //On fait un tableau avec les numéros des colonnes possibles List <int> position = new List <int>() { 0, 1, 2, 3 }; //On ajoute nb boutons for (int i = 0; i < nb; i++) { //On selectionne une colonne au hasard int column = position[rand.Next(position.Count)]; //On crée le bouton SpriteButton button = new SpriteButton(column); buttons.Add(button); //On enlève la colonne de la liste des colonnes dispo position.Remove(column); } }
public void update(float delta) { //On ajoute delta aux chronos lastSpawnTime += delta; lastChange += delta; float timeRatio = (SpriteButton.speed / SpriteButton.baseSpeed); if (lastSpawnTime * timeRatio > spawnTime) { //On doit ajouter un bouton addButton(); lastSpawnTime = 0; } if (lastChange * timeRatio > changeTime) { //On doit changer le temps entre chaque spawn de bouton //On sélectionne un nombre au hasard entre 0.30 et 0.33 secondes spawnTime = Math.Max((float)rand.Next(200) / 1000.0f, 0.33f); //On change la durée de la phase avant le prochain changement changeTime = (float)rand.Next(10000) / 1000.0f; lastChange = 0; } //On regarde si les touches sont appuyées quand le bouton est proche de la fin Keys[] inputs = new Keys[] { Keys.D, Keys.F, Keys.J, Keys.K }; //Les boutons les plus proches sont ceux qui sont les premiers dans la liste //On vérifie les 4 premier boutons au cas où on en aurait 4 en même temps List <SpriteButton> premiersBoutons = new List <SpriteButton>(); float lastY = 0; for (int i = 0; i < Math.Min(4, buttons.Count); i++) { if (i == 0) { lastY = buttons[i].position.Y; premiersBoutons.Add(buttons[i]); } if (buttons[i].position.Y == lastY) { premiersBoutons.Add(buttons[i]); } } for (int j = 0; j < inputs.Count(); j++) { //Si la touche est appuyée à l'instant on regarde if (Keyboard.GetState().IsKeyDown(inputs[j]) && !lastState.IsKeyDown(inputs[j])) { for (int i = 0; i < premiersBoutons.Count(); i++) { if (premiersBoutons[i].column == j) { float distance = OTRGame.getInstance().getHeight() - (premiersBoutons[i].position.Y + premiersBoutons[i].texture.Height + 156); //On a appuyé sur la touche correspondante au bouton, on vérifie si il est proche (- de 150px) if (distance < 150) { //Il est proche. On calcule le score que l'on obtient. int scoreTouche = Math.Abs(50 * ((int)(distance % 3) + 1)); score += scoreTouche; fails = (fails <= 0) ? 0 : fails - 1; buttons.Remove(premiersBoutons[i]); break; } } } } } //On met à jour les boutons et on vérifie que les boutons ne descendent pas trop bas, sinon on les détruits for (int i = buttons.Count - 1; i >= 0; i--) { SpriteButton button = buttons[i]; button.update(delta); if ((button.position.Y) > (OTRGame.getInstance().getHeight() - 156)) { buttons.Remove(button); fails++; if (fails >= maxFails) { OTRGame.getInstance().setScreen(new PerduScreen(score)); } } } //On met à jour les effets des touches foreach (SpriteLight light in lightSprites) { light.update(delta); } //On change la vitesse du niveau si on vient d'appuyer sur F3 (baisser vitesse) ou F4 (augmenter vitesse) float pallier = (50.0f); if (Keyboard.GetState().IsKeyDown(Keys.F3) && !lastState.IsKeyDown(Keys.F3)) { if (SpriteButton.speed <= (50.0f)) { SpriteButton.speed = (50.0f); } else { SpriteButton.speed -= pallier; } } else if (Keyboard.GetState().IsKeyDown(Keys.F4) && !lastState.IsKeyDown(Keys.F4)) { SpriteButton.speed += pallier; } lastState = Keyboard.GetState(); }