2016-11-10 3 views
-4

Unten habe ich ein Programm mit C# erstellt, das ein Smiley-Gesicht erzeugt. Es bewegt sich auch über den Bildschirm. Ich kann nicht herausfinden, wie man das Smiley-Gesicht von den Rändern und vom Bildschirm abprallen lässt. Bitte Hilfe. Vielen Dank.Moving Smiling Face C#

*/using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace HappyFace 
{ 
    public partial class HappyFace : Form 
    { 
     int xpos = 0; 
     int ypos = 0; 
     int width = 0; 
     int length = 0; 
     int startAngle = 45; 
     int sweepAngle = 90; 

     public HappyFace() 
     { 
      InitializeComponent(); 
     } 

     private void HappyFace_Load(object sender, EventArgs e) 
     { 

     } 

     private void HappyFace_Paint(object sender, PaintEventArgs e) 
     { 
      Graphics g = e.Graphics; 
      Pen myPen = new Pen(Brushes.Red, 7); 
      Pen myPen2 = new Pen(Brushes.Green, 7); 
      //g.DrawLine(myPen, 0, 0, 500, 500); 
      //g.DrawLine(myPen, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height); 
      //g.DrawLine(myPen2, 0, this.ClientRectangle.Height, this.ClientRectangle.Width, 0); 
      //g.DrawLine(myPen2, this.ClientRectangle.Left, this.ClientRectangle.Bottom, this.ClientRectangle.Right, ClientRectangle.Top); 

      int endX = this.ClientRectangle.Width; 
      int endY = this.ClientRectangle.Height; 

      //string msg = String.Format("endX = {0} endY = {1}", endX, endY); 
      //MessageBox.Show(msg); 

      int xCenter = this.ClientRectangle.Left + (this.ClientRectangle.Width/2); 
      int yCenter = this.ClientRectangle.Top + (this.ClientRectangle.Height/2); 

      Pen circlePen = new Pen(Brushes.Black, 9); 

      //g.DrawEllipse(circlePen, xCenter - 50, yCenter - 50, 100, 100); 
      // g.FillEllipse(Brushes.Orange, xCenter -50, yCenter - 50, 100, 100); 

      Font myFont = new Font("Monotype Corsiva", 43, FontStyle.Bold); 
      g.DrawString("Happy Face", myFont, Brushes.Aqua, 300, 25); 

      //g.DrawArc(circlePen, xpos, width, length, startAngle, sweepAngle); 

      g.DrawEllipse(circlePen, xpos, ypos + 130, 250, 250); 
      g.FillEllipse(Brushes.PeachPuff, xpos, ypos + 130, 250, 250); 
      g.DrawEllipse(circlePen, xpos + 65, ypos + 200, 20, 35); 
      g.FillEllipse(Brushes.Black, xpos + 65, ypos + 200, 20, 35); 
      g.DrawEllipse(circlePen, xpos + 160, ypos + 200, 20, 35); 
      g.FillEllipse(Brushes.Black, xpos + 160, ypos + 200, 20, 35); 
      g.DrawArc(circlePen, xpos + 60, ypos + 215, 130, 120, 35, 115); 

     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      xpos = xpos + 3; 
      if(xpos >= this.ClientRectangle.Right - 250) 
      { 
       xpos = 0; 
      } 
      this.Invalidate(); 
     } 
    } 
}*/ 
+3

Überprüfen Sie einfach, ob die Kante die Wand trifft, ändern Sie die Richtung. – itsme86

+0

Es geht vom Bildschirm und kommt auf der anderen Seite zurück. Wie behebe ich das? –

+0

Wie/wo glaubst du, dass du es reparieren würdest? – itsme86

Antwort

0

Nun, ich war ein bisschen gelangweilt. Ich nehme an, dass sich das Objekt in einer 45 Grad-Flugbahn bewegen wird, und dass es, wenn es mit den Grenzen kollidiert, sich um 90º ändern würde.

Was ich tun würde (dies ist eine sehr einfache Lösung) ist zunächst, die Richtung in beiden Achsen zu definieren, in denen ich den "Smiley" bewegen möchte, den Schritt in jedem Timer tick, die Position des Zentrum und die Größe des Objekts, so etwas wie:

int xpos = 0; 
int ypos = 130; 
int step = 10; 
int width = 250; 
int height = 250; 
int directionX = +1; 
int directionY = -1; 

der Timer würde die x- und y-Positionen nur erhöhen:

private void timer1_Tick(object sender, EventArgs e) 
{ 
    xpos += 10*directionX; 
    ypos += 10*directionY; 
    checkBounds(); //This would check if the object collides with the bounds 
    this.Invalidate(); 
} 

die checkBounds Methode zu überprüfen, ob das Objekt mit den Grenzen stößt:

private void checkBounds() 
{ 
    if (ypos < 0 + step || ypos + height+ step > ClientRectangle.Height) 
    { 
     directionY *= -1; 
    } 

    if (xpos < 0 + step || xpos + width + step > ClientRectangle.Width) 
    { 
     directionX *= -1; 
    } 
} 

Schließlich ist die Methode Paint ähnlich wie bei Ihnen, um nur einige Werte eingestellt:

private void Form2_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics g = e.Graphics; 
    Pen myPen = new Pen(Brushes.Red, 7); 
    Pen myPen2 = new Pen(Brushes.Green, 7); 


    int endX = this.ClientRectangle.Width; 
    int endY = this.ClientRectangle.Height; 


    int xCenter = this.ClientRectangle.Left + (this.ClientRectangle.Width/2); 
    int yCenter = this.ClientRectangle.Top + (this.ClientRectangle.Height/2); 


    Pen circlePen = new Pen(Brushes.Black, 9); 

    Font myFont = new Font("Monotype Corsiva", 43, FontStyle.Bold); 
    g.DrawString("Happy Face", myFont, Brushes.Aqua, 300, 25); 

    g.DrawEllipse(circlePen, xpos, ypos, 250, 250); 
    g.FillEllipse(Brushes.PeachPuff, xpos, ypos, 250, 250); 
    g.DrawEllipse(circlePen, xpos + 65, ypos -130 + 200, 20, 35); 
    g.FillEllipse(Brushes.Black, xpos + 65, ypos-130 + 200, 20, 35); 
    g.DrawEllipse(circlePen, xpos + 160, ypos-130 + 200, 20, 35); 
    g.FillEllipse(Brushes.Black, xpos + 160, ypos-130 + 200, 20, 35); 
    g.DrawArc(circlePen, xpos + 60, ypos-130 + 215, 130, 120, 35, 115); 
} 

Dieser Code könnte stark verbessert werden, aber dies kann Ihnen helfen, denken, wie es getan werden sollte. Ich hoffe es hilft.

+0

Es hat geholfen! Vielen Dank, ich habe einfach nicht die Richtung festgelegt !!! Ich dachte nicht breit genug. Danke noch einmal –