0

Hey ici, c'est que j'essaie de changer la santé initiale à 0 une fois qu'ils sont touchés. Mais avec cela, il change un ennemi aléatoire dans le tableau 2D et les fait disparaître à la place de ceux qui sont touchés. J'ai commenté la plupart de mon code espère que cela aide :)
n'a pas pu trouver un poste avec la même question désolé s'il y a ... Toutes les autres suggestions seraient incroyables aussi! MerciMon Hit Détection dans mon tableau 2D est de sortir les gens au hasard à la place de ceux qu'il frappe

 public partial class Form1 : Form 
    { 
     //score & ammo 
     int score = 0; 
     int ammo = 5; 

     //setting cannon 
     int tank = 0; 

     //mouse cords 
     int mouseX = 0; 
     int mouseY = 0; 

     //Small boom 
     int Sboomx = -20; 
     int Sboomy = -20; 

     //random positions for enemys to spawn 
     int MinX = 1020; 
     int MaxX = 7020; 
     int MinY = 350; 
     int MaxY = 400; 

     //speed of them 
     int SpeedMinX = -7; 
     int SpeedMaxX = -2; 

     //array 
     int[,] bads = new int[300, 5]; 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      //setting positions and loading in people 
      Random randNum = new Random(); 

      for (int i = 0; i < 300; i++) 
      { 
       //where they go 
       bads[i,0] = randNum.Next(MinX, MaxX); 
       bads[i, 1] = randNum.Next(MinY, MaxY); 
       //health 
       bads[i, 2] = 1; 

       //how they move 
       //dx 
       bads[i, 3] = randNum.Next(SpeedMinX, SpeedMaxX); 
       //dy 
       bads[i, 4] = 1; 
      }   
     } 

     private void Form1_Paint(object sender, PaintEventArgs e) 
     { 
      //background 
      e.Graphics.DrawImage(Properties.Resources.Background1, 0, 0, 1000, 500); 

      //Aim 
      e.Graphics.DrawImage(Properties.Resources.crosshair, mouseX - 10, mouseY - 10, 20, 20); 

      //explotion 
      e.Graphics.DrawImage(Properties.Resources.small, Sboomx - 285, Sboomy - 298, 600, 600); 

      //Tank cannon   
      if (tank == 1) 
      { 
       e.Graphics.DrawImage(Properties.Resources.Tank__5__copy, 140, 335, 60, 60); 
      } 
      else if (tank == 2) 
      { 
       e.Graphics.DrawImage(Properties.Resources.Tank__10__copy, 140, 335, 60, 60); 
      } 
      else if (tank == 3) 
      { 
       e.Graphics.DrawImage(Properties.Resources.Tank__15__copy, 140, 335, 60, 60); 
      } 
      else if (tank == 4) 
      { 
       e.Graphics.DrawImage(Properties.Resources.Tank_0__copy, 140, 335, 60, 60); 
      } 

      //draw Bad guys 
      for (int i = 0; i < 300; i++) 
      {    
        if (bads[i, 2] == 1) 
        { 
         e.Graphics.FillRectangle(Brushes.Black, bads[i, 0] , bads[i, 1], 10, 20); 
        } 
      } 
      //undrawthem 
      for (int i = 0; i < 300; i++) 
      { 
       if (bads[i, 2] == 0) 
       { 
        e.Graphics.FillRectangle(Brushes.Black, bads[i, 0], bads[i, 1], 0, 0); 
        Sboomx = -20; 
        Sboomy = -20; 
       } 
      } 
     } 

     //Timer 
     private void timer1_Tick(object sender, EventArgs e) 
     { 
      //Collision 
      for (int i = 0; i < 300; i++) 
      { 
       if (Sboomx == bads[i, 0] || Sboomy == bads[i,1]) 
       { 
        bads[i, 2] = 0; 
        ammo++; 
        score = score + 5; ; 
       } 
      } 

       //Score 
      label2.Text = " " + score; 

      //Ammo 
      label1.Text = " " + ammo; 

      //Moving enemys 
      for (int i = 0; i < 300; i++) 
      { 
       bads[i, 0] = bads[i, 0] + bads[i, 3]; 
       bads[i, 1] = bads[i, 1] + bads[i, 4]; 
       if (bads[i, 0] > 2040 || bads[i, 0] < 140) 
       { 
        bads[i, 3] = bads[i, 3] * -1; 
       } 
       if (bads[i, 1] > 335 || bads[i, 1] < 350) 
       { 
        bads[i, 4] = bads[i, 4] * -1; 
       } 
      } 
      this.Refresh(); 
     } 

     private void label1_Click(object sender, EventArgs e) 
     { 
      //Ammo 
     } 

     private void label2_Click(object sender, EventArgs e) 
     { 
      //Customers served 
     } 

     private void Form1_MouseMove(object sender, MouseEventArgs e) 
     { 
      //Control tank cannon 
      mouseY = e.Y; 
      mouseX = e.X; 

      if (mouseY > 350 && mouseY < 375) 
      { 
       tank = 1; 
      } 
      else if (mouseY > 376 && mouseY < 390) 
      { 
       tank = 2; 
      } 
      else if (mouseY > 391) 
      { 
       tank = 3; 
      } 
      else if (mouseY <= 339) 
      { 
       tank = 4; 
      } 
     } 

     private void Form1_MouseClick(object sender, MouseEventArgs e) 
     { 

     } 

     private void Form1_MouseDown(object sender, MouseEventArgs e) 
     { 
      //creates explotion and takes away ammo 
      Sboomx = e.X; 
      Sboomy = e.Y; 
      ammo--; 
     } 

     private void Form1_MouseUp(object sender, MouseEventArgs e) 
     { 
      //moves explosion 
      Sboomx = -20; 
      Sboomy = -20; 
     } 

    } 
} 
+1

Il y a trop de code ici pour que quelqu'un puisse vous aider. Essayez de travailler pour produire une reproduction minimale (en faisant cela, cela vous aidera probablement à résoudre votre problème) –

+0

L'état de santé est mauvais [i, 2]. Lorsque vous déplacez les ennemis, vous ne déplacez pas l'objet 2 dans le tableau, donc il semble qu'un ennemi aléatoire disparaisse. – jdweng

Répondre

0

Si je comprends bien ce que vous essayez de faire, alors, le problème est dans cette ligne:

if (Sboomx == bads[i, 0] || Sboomy == bads[i,1]) 

Le méchant est un rectangle, et la bombe est un point, et ce que vous faites ici est d'essayer de faire correspondre un point de ce rectangle avec la bombe x-coordonnée ou y-coordonnée, ce qui est également faux, vous devez vérifier si les coordonnées de la bombe est à l'intérieur ce rectangle ou non.

De même, il est recommandé de déplacer la boucle "// Collision" vers l'événement Form1_MouseDown pour éviter le délai entre le clic de la souris et la minuterie, notamment parce que vous avez réinitialisé les coordonnées de la bombe dans l'événement Form1_MouseUp.

Une autre chose, « // undrawthem » boucle n'a pas de logique ici, vous dessinez un rectangle avec 0 * 0 dimensions (avez-vous pensé qu'il redimensionner les rectangles existants?), Lorsque vous appelez Refresh(), Invalidate() obtenir appelé à rendre la surface entière invalide, alors Update() est appelée pour mettre à jour la zone invalider, donc les graphismes entiers sont effacés et redessinés quand l'événement Form1_Paint est levé, peu importe ce qui existait auparavant.

Vous pouvez considérer cela, au lieu d'utiliser Refresh(), utilisez Invalidate(invalidate_area) et Update(), de sorte que vous ne rafraîchissez pas la surface:

Rectangle invalidate_area = new Rectangle(0, 0, 100, 50); 
invalidate_area.Inflate(3, 3); //add extra bounds 
Invalidate(invalidate_area); 
Update(); 

mais si vous l'avez fait, vous aurez besoin de prendre soin des morts les méchants, en déplaçant les méchants (mise à jour ancienne zone occupée et le nouveau) et ainsi de suite.

+0

Je viens de commencer à apprendre C# il y a quelques semaines donc cela aide beaucoup merci pour les suggestions –

+0

Vous êtes les bienvenus :) –