Laden...

Forenbeiträge von Tyrael Ingesamt 5 Beiträge

14.03.2019 - 18:43 Uhr

@chilic: genau das möchte ich auch machen.
Die Frage ist, wie ist das umzusetzen?

Ich habe 40 Objekte (alles Ellipsen). Die werden per Zufallsgenerator auf die Canvas verteilt. Der Dispatchtimer ruft bei jedem Tick diese Methode auf, die alle Objekte haben.

Wie kann ich daher festlegen, dass die Objekte sich zunächst für eine Richtung entscheiden, da etwas entlang wabern und dann wieder die Richtung wechseln?

14.03.2019 - 15:32 Uhr

Hallo zusammen,

ich lasse ein paar Ellipsen über den Bildschirm wandern.
Der Code sieht so aus:

 
// Bewegung überschreiben
        public override void bewege()
        {
            if (X < 20)
            {
                X = 590;
            }
            else if (X > 590)
            {
                X = 20;
            }

            if (Y < 20)
            {
                Y = 390;
            }
            else if (Y > 390)
            {
                Y = 20;
            }
            X += rnd.Next(-2, 2);
            Y += rnd.Next(-2, 2);

            
        }

Die Ellipsen wabern jetzt alle mal nach links mal nach rechts. Das finde ich nicht sonderlich sinnvoll. Die Punkte sollen schon irgendwo "Eigenständig" laufen und ihren Weg finden.

Habt ihr Ratschläge, wie ich das lösen/angehen kann?

Danke Euch!

10.03.2019 - 20:17 Uhr

Hallo zusammen,

Ich brauche Eure Hilfe. Den Code poste ich nicht da er so lang und Spaghetti ist, dass ich euch das ersparen möchte. Vereinfacht :

Ich habe eine Klasse einer "Person" und eine Instanz hiervon, nennen wir sie "Martin". Diese hat eine Eigenschaft Alter. Diese verändert sich während der Laufzeit.

Wir haben einen Button und ein Label. In MainWindow Button startet dispatchtimer der ruft bei jedem tick die Methode "Ändere" auf in der die Eigenschaft geändert wird.

In der Methode habe ich Label.Content="" + Martin. Alter;

Mein Problem ist jetzt, dass nur das ursprüngliche Alter was zuerst gesetzt war aufgerufen wird. Das aktualisierte Alter wird nicht übernommen.

Wo ist der Fehler? Das Alter wird aber wenn ich per debug durchgehe innerhalb der Klasse geändert...

10.02.2019 - 12:06 Uhr

Grüßt Euch und erstmal vielen Dank für Eure Rückmeldung.
Der Code sieht insgesamt so aus.

[ public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            timer.Interval = TimeSpan.FromSeconds(.1);
            timer.Tick += Timer_Tick;
            button1.IsEnabled = false;

        }

        const int anzahlZellenBreit = 7;
        const int anzahlZellenHoch = 7;
        Rectangle[,] felder = new Rectangle[anzahlZellenBreit, anzahlZellenHoch];
        DispatcherTimer timer = new DispatcherTimer();
        int generation = 1;
        int lebendeZellen = 0;
        
        
        private void ButtonStart_Click(object sender, RoutedEventArgs e)
        {

            button1.IsEnabled = true;
            button.IsEnabled = false;
            
            Random würfel = new Random();
          
            for (int i = 0; i < anzahlZellenHoch; i++)
            {
                for (int j = 0; j < anzahlZellenBreit; j++)
                {
                    Rectangle r = new Rectangle();
                    r.Width = Zeichenfläche.ActualWidth / anzahlZellenBreit - 2;
                    r.Height = Zeichenfläche.ActualHeight / anzahlZellenHoch - 2;
                    r.Fill = (würfel.Next(0,2)==1)? Brushes.Cyan : Brushes.Red;
                    Zeichenfläche.Children.Add(r);
                    Canvas.SetLeft(r, i * Zeichenfläche.ActualWidth / anzahlZellenBreit);
                    Canvas.SetTop(r, j * Zeichenfläche.ActualHeight / anzahlZellenHoch);


                    felder[i, j] = r;
                    
                    if (felder[i,j].Fill == Brushes.Red)
                    {

                        textBoxLebend.Text = "Lebende Zellen :\n" + ++lebendeZellen;
                    }

                }
            }
           
        }


        private void Timer_Tick(object sender, EventArgs e)
        {
             textBox.Text = "Generation : " + generation++;

            int[,] anzahlNachbarn = new int[anzahlZellenHoch, anzahlZellenBreit];

            for (int i = 0; i < anzahlZellenHoch; i++)
            {
                for (int j = 0; j < anzahlZellenBreit; j++)
                {
                    int nachbarn = 0;

                    int iDarüber = i - 1;
                    if(iDarüber <0)
                    { iDarüber = anzahlZellenHoch - 1; }

                    int iDarunter = i+ 1;
                    if (iDarunter == anzahlZellenHoch)
                    { iDarunter = 0; }

                    int jRechts = j +1;
                    if (jRechts == anzahlZellenBreit)
                    { jRechts = 0; }

                    int jLinks = j -1;
                    if (jLinks <0)
                    { jLinks = anzahlZellenBreit-1; }

                    if (felder[iDarüber,jLinks].Fill==Brushes.Red)
                    { nachbarn++; }
                    if (felder[iDarüber, j].Fill == Brushes.Red)
                    { nachbarn++; }
                    if (felder[iDarüber, jRechts].Fill == Brushes.Red)
                    { nachbarn++; }
                    if (felder[i, jLinks].Fill == Brushes.Red)
                    { nachbarn++; }
                    if (felder[i, jRechts].Fill == Brushes.Red)
                    { nachbarn++; }
                    if (felder[iDarunter, j].Fill == Brushes.Red)
                    { nachbarn++; }
                    if (felder[iDarunter, jLinks].Fill == Brushes.Red)
                    { nachbarn++; }
                    if (felder[iDarunter, jRechts].Fill == Brushes.Red)
                    { nachbarn++; }

                    anzahlNachbarn[i, j] = nachbarn;
                }
            }

            int lebendeZellen1 = lebendeZellen;
      
            for (int i = 0; i < anzahlZellenHoch; i++)
            {
                for (int j = 0; j < anzahlZellenBreit; j++)
                {
                   
                    if (anzahlNachbarn[i, j] < 2 || anzahlNachbarn[i, j] > 3)
                    {
                        felder[i, j].Fill = Brushes.Cyan;
                    }
                    else
                         if (anzahlNachbarn[i, j] == 3)
                    { felder[i, j].Fill = Brushes.Red; }
                    
                    if (felder[i, j].Fill == Brushes.Red)
                    {
                        ++lebendeZellen;
                      
                        textBoxLebend.Text = "Lebende Zellen :\n"+ (lebendeZellen - lebendeZellen1);
                       
                    }
                    if (lebendeZellen - lebendeZellen1 < 2)
                    {
                        textBoxLebend.Text = "Lebende Zellen :\n0";
                    }

                    
                }
                
            }
       
        }
        
        private void Button1_Click(object sender, RoutedEventArgs e)
        {
            
            if (timer.IsEnabled)
            {
                timer.Stop();
               
                button1.Content = "Starte Animation";
                    }
            else
            {
                timer.Start();
             button1.Content = "Stoppe Animation";
              

            }
        }

       
    }]

Den von Th69 vorgeschlagenen Code setze ich an welche Stelle, sodass die Tick Funktion nicht mehr aufgerufen wird?

10.02.2019 - 10:50 Uhr

Hallo zusammen,

ich drehe derzeit wirklich durch und hoffe auf Eure Hilfe.

Ich habe Conways Game of life nachprogrammiert. Bei jedem timer tick, werden neue Generationen gebildet, Zellen sterben, Zellen entstehen usw.

Ich hänge echt fest hinsichtlich des Stoppens des Zählers der Generationen. Zum Einen habe ich einen Zähler eingebaut, der bei jedem Tick die neue Generation mitzählt und die Anzahl der lebenden Zellen darstellt. Jeweils in einer separaten Textbox.
Ich habe also eine Variable deklariert und initialisiert, die bei jedem Tick erhöht wird, bzw. die neuen lebenden Zellen anzeigt.

Wenn sich aber keine weiteren Generationen mehr ausbilden, zB weil alle Zellen gestorben sind und einen stabilen Zustand haben, möchte ich, dass der Counter stehen bleibt bzw. das Tick-Ereignis gestoppt wird.

Mein erster Ansatz war, das Textfeld der lebenden Zellen auszulesen und zu sagen, wenn keine Veränderung mehr stattfindet, dann stoppe auch das TickErignis. Leider habe ich keinen TextBox.HasChanged“ gefunden, um das zu überprüfen.

Nächster Gedanke war ein TextBoxChangeEvent zu initialisieren. Solange durch den Zähler die Anzahl der lebenden Zellen verändert wird, ist eine variable im Event auf true gesetzt.

public void TextBox1_TextChanged(object sender, EventArgs e)  
{  
   bool textLäuft = true; 
} 

Innerhalb der Tickfunktion habe ich dann überprüft, ob diese Variable noch true ist, wenn nicht, soll er eben stoppen. Das hat nicht funktioniert. So habe ich auch das verworfen.

Der letzte Ansatz war, den Zähler der Generationen mit get und set zu versehen. Bei jedem Tick wird durch set der Zähler um eins erhöht. Jedoch bin ich dann ebenfalls hier hängen geblieben zu sagen, was passiert, wenn die Variable nicht mehr erhöht wird. Mir ist hierzu keine logische Schreibweise eingefallen.

Schematisch dargestellt sieht mein Problem ja so aus:

int lebendeZellen = 0;

public void Tick…..
{
// diverse Berechnungen + Ausrechnen der Lebenden Zellen
Textbox.Text =„Lebende Zellen :“ + lebendeZellen;
}

Und jetzt soll, wenn sich die variable lebendeZellen nicht mehr ändert, die Funktion tick beendet werden.

Ich brauche eigentlich eine logische Schreibweise für: solange sich lebendeZellen ändert (egal ob + oder -) ist y true (wäre neu zu erstellen).

Bitte helft mir!

Danke Euch!