2009-11-11 5 views
0

Je travaille sur la compréhension de la détection de collision et j'ai décidé de créer un programme qui simule Pacman. Tout simplement quand un Pacman se heurte à un fantôme, il meurt.Problèmes de dessin à mon ClientRectangle en utilisant GDI + & C#

Je spécifie combien de Pacmen je voudrais et dans mon MainForm_Paint (appelé quand mon contrôle doit peindre) je crée un tableau de la quantité spécifiée d'une classe que j'ai créée appelée Pacman. Je continue ensuite à construire chaque Pacman dans le tableau avec les paramètres spécifiés.

Quand tout est dit et fait, je continue ensuite à essayer de dessiner tous les Pacmen à l'intérieur d'une boucle. Un seul dessin à l'intérieur du ClientRectangle, quel que soit le nombre de dessins que je spécifie. Quand j'élargis mon ClientRectangle, je vois des petites lignes ou ce qui semble être un ruban d'un Pacman. J'ai vérifié pour s'assurer que les positions de départ sont dans le système ClientRectangles x, y et ils sont. Je suis juste perplexe quant à pourquoi ils ne dessinent pas à l'intérieur du ClientRectangle cependant. . :(Toute aide serait appréciée ici

est ce que j'ai codé pour MainForm_Paint

private void MainForm_Paint(object sender, PaintEventArgs e) 
    { 
     Graphics g = e.Graphics;   
     Rectangle rect = this.ClientRectangle; 
     Pacman[] pacmen = new Pacman[parameters[0]];    
     int whichPacman = 0; 

     for (int i = 0; i < parameters[0]; i++) 
     { 
      pacmen[i] = new Pacman(rect, parameters[1]);     
     } 

     while (play) 
     { 
      pacmen[whichPacman].PacmanDraw(g, rect); 
      // Must reset whichPac if whichPac + 1 == parameters[0] 
      // Break out while testing 
      if ((whichPacman + 1) == parameters[0]) 
      { 
       break; 
      } 
      else 
      { 
       whichPacman++; 
      } 
     } 
    } 

Voici ce que j'ai codé pour ma classe Pacman:

public Pacman(Rectangle rect, int radius) 
    { 
     Random rand = new Random();      
     this.xpos = rand.Next(rect.Left, rect.Left + rect.Width); 
     this.ypos = rand.Next(rect.Top, rect.Top + rect.Height); 
     this.radius = radius;    
    } 

    public void PacmanDraw(Graphics g, Rectangle rect) 
    {       
     GraphicsPath path = new GraphicsPath();   
     path.AddArc(this.xpos, this.ypos, (float) this.radius * 2, (float) this.radius * 2, 0, 360);    
     path.CloseFigure(); 
     g.FillPath(new SolidBrush(Color.AliceBlue), path); 
     path.Dispose(); 
    } 

Merci pour votre aide et désolé si c'est une utilisation inappropriée de SOF

Répondre

0

Vous créez une nouvelle graine pour votre générateur de nombres aléatoires chaque fois que vous appelez le constructeur Pacman. Comme vous faites ceci dans une boucle serrée tous les Pacmen finiront au même endroit. C'est parce que Random utilise la date/heure dans le cadre de sa graine.

La génération de nombre aléatoire commence à partir d'une valeur de départ. Si la même graine est utilisée plusieurs fois, la même série de nombres est générée. Une façon de produire des séquences différentes est de rendre la valeur de départ dépendante du temps, produisant ainsi une série différente avec chaque nouvelle instance de Random. Par défaut, le constructeur sans paramètre de la classe Random utilise l'horloge système pour générer sa valeur de départ, tandis que son constructeur paramétré peut prendre une valeur Int32 basée sur le nombre de ticks de l'heure actuelle. Cependant, comme l'horloge a une résolution finie, l'utilisation du constructeur sans paramètre pour créer différents objets aléatoires en succession rapprochée crée des générateurs de nombres aléatoires qui produisent des séquences identiques de nombres aléatoires. L'exemple suivant illustre que deux objets aléatoires qui sont instanciés en succession rapprochée génèrent une série identique de nombres aléatoires.

Créez le générateur de nombres aléatoires en dehors de la boucle et transmettez-le dans le constructeur.

0

Vous devez tenir compte du fait que vous spécifiez le en haut à gauche de l'objet; vos xpos et ypos ne peuvent atteindre qu'un maximum de width - object width afin de le garder entièrement visible.

this.xpos = rand.Next(rect.Left, rect.Left + rect.Width - radius * 2.0); 
this.ypos = rand.Next(rect.Top, rect.Top + rect.Height - radius * 2.0);