Autor Beitrag
GamerIII
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Di 20.11.12 23:23 
Hallo,

Ich bin recht neu in der Welt von C#, habe aber schon so einiges Programmiert. Doch nun stehe ich vor einem Rätsel.
Ich versuche gerade ein kleines Spiel zu machen wo ein Spieler (Player) auf einer PictureBox nach Links oder Rechts läuft.
Wenn ich Leertaste drücke soll er einen Schuss abfeuern. Nun mein Problem: Ich will das der Schuss geradlinig nach oben läuft. Mein jetztiges Können sagt mir
ich soll es mit einem Timer machen der die Y achse um 5 erhöht. nur wenn ich den Timer_Tick Befehl in diesem If-Befehl ausführen will geht das nicht und wenn ich es
wo anders mache ist natürlich der Schuss im Kontext nicht Vorhanden. Wie schaffe ich es den Timer in den If-Befehl zu bekommen?? :gruebel:
Oder wie könnte ich es anders machen?
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
            if (e.KeyCode == Keys.Space)
            {
                int x = Convert.ToInt32(Player.Location.X);
                x = x + 49;
                PictureBox SchussP = new PictureBox();
                SchussP.Height = 10;
                SchussP.Width = 10;
                SchussP.Top = 402;
                SchussP.Left = x;
                SchussP.Image = Spiel.Properties.Resources.Schuss_Spieler;
                this.Controls.Add(SchussP);
                SchussP.BringToFront();
               
               Timer t1 = new Timer();
               t1.Interval = 25
               t1.Tick+=new EventHandler(t1_Tick); 
               t1.Start();

               void t1_Tick(object sender, EventArgs e)
               {
                 SchussP.Top += +5;
               }                
            }


Moderiert von user profile iconTh69: Titel geändert.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 21.11.12 10:43 
Hallo GamerIII :welcome:

ein Timer ist schon die richtige Wahl, nur scheinst du einige Grundlagen der C#-Programmierung noch nicht richtig zu beherschen:
- Methoden können nicht geschachtelt werden, d.h. du mußt die Tick-Methode außerhalb deiner aktuellen Methode definieren
- Um Zugriff von einer anderen Methods aus auf die PictureBox zu erhalten, solltest du diese Variable als Klassenmember (private PictureBox SchussP) anlegen

Wenn es bei dir mehr als einen Schuss parallel geben soll, solltest du die Schüsse in einer Liste List<T> ablegen und dann nur genau einen Timer erzeugen (in dessen Tick-Methode du dann die Liste iterierst und jeden Schuss bewegst).

P.S. Das Koordinatensystem geht bei Windows von oben links nach unten rechts, d.h. damit der Schuss nach oben geht, mußt du SchussP.Top -= 5; benutzen. Außerdem solltest du dann eine Abbruchbedingung benutzen, damit der Schuss nicht ins Unendliche läuft. ;-)
GamerIII Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mi 21.11.12 16:51 
Hallo,

Danke schon mal für die Information jetzt weiß ich das auch :D
Nur es will ihrgend wie noch immer nicht funktionieren. :(
Wenn ich die tick Methode extra schreibe kommt: Der Name "SchussP" ist im Kontext nicht vorhanden
ausblenden C#-Quelltext
1:
2:
3:
4:
        private void Schießen_Tick(object sender, EventArgs e)
        {
            SchussP.Top -= 5;
        }


Und dann kann ich es nicht ausführen.
Und kannst du mir vielleicht kurz so ca. sagen wie das mit der Liste geht?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 21.11.12 17:07 
Zitat:
Wenn ich die tick Methode extra schreibe kommt: Der Name "SchussP" ist im Kontext nicht vorhanden


Du hast diesen Kommentar von user profile iconTh69 überlesen.

Zitat:
- Um Zugriff von einer anderen Methods aus auf die PictureBox zu erhalten, solltest du diese Variable als Klassenmember (private PictureBox SchussP) anlegen


Ähnliches gilt übrigens für den Timer dafür solltest du keine lokale Variable verwenden sondern auch einen Klassenmember. Sonst wird der irgendwann vom System zerstört weil der nicht mehr referenziert wird und feuert den Tick Event nicht mehr. Wie stoppst du den Timer eigentlich? Gar nicht?
GamerIII Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mi 21.11.12 17:19 
Ja habe ich offenbar nur wie soll ich das den machen O.O bin ja noch nicht so lange in C#. :(
Es wird die PictureBox ja erst erstellt wenn ich Leertaste drücke.

Wenn sie oben eine andere PictureBox berührt wird SchussP wieder gelöscht und dabei der timer gestopt. Solange bis ich halt mehrere Schüsse ab gebe.