Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

11

22.10.2012, 14:14

Wurde doch oben schon gesagt. Du hast den Code in der Map Klasse. Wenn ein Spieler nun schießt, dann merkt sich deine Map Klasse, dass ein Projektil existiert. Solange ein Projektil existiert darf kein neues erzeugt werden. Das ist an sich ganz logisch. Wenn du willst, dass jeder Spieler nur eine Kugel abfeuern kann, bis er einen weiteren Schuss abgibt, dann lös das in der Spieler Klasse.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

12

22.10.2012, 14:52

OK. Nur um sicher zu gehen. Dann muss ich ja die bulletslist und die Kugeln in der Enemy-Klasse erstellen. Richtig?

C#-Quelltext

1
2
List<Bullet> bulletslist = new List<Bullet>();
...


Hat das RemoveAll irgendwelche Vorteile gegenüber meiner for-Schleifen? So wie ich es gemacht habe funktioniert es doch auch.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

13

22.10.2012, 15:05

Dafür gibt es viele Möglichkeiten. Aber an sich solltest du vielleicht erst mal was einfacheres machen. Da sind allgemein Grundlegendere Probleme vorhanden. Hast du ein vernünftiges buch mit dem du lernst? Das kann dir viel Arbeit und Nerven ersparen.
Das löschen mit der for-Schleife funktioniert natürlich auch. Es geht halt nicht immer nur darum ob etwas funktioniert, sondern ob es übersichtlich und auch schnell ist. Google doch einfach mal nach der Funktion.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

14

22.10.2012, 23:48

Ich habe den Code jetzt so geändert wie du es mir geraten hast. Also, die Projektile in der Enemy-Klasse zu erstellen. Jedoch bekomme ich nun immer folgende Fehlermeldung in der letzten Zeile der Bullet-Klasse: This method does not accept null for this parameter. Parameter name: texture

Ich gehe davon aus dass es daran liegt dass ich in der LoadContent-Methode der Map-Klasse nicht enemieslist.Load(content) eingeben kann. Das geht ja so nicht da es sich um eine Liste handelt.
Wie kann man das Problem lösen?

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public class Map{
    Texture2D myEnemy;
    Player Player;
    List<Enemy> enemieslist = new List<Enemy>();    

    float fNextEnemy = 0.0f;
    float fEnemyFreq = 3.0f;
    int fMaxEnemy = 3;

    Vector2 Startposition = new Vector2(200, 200);
    GraphicsDeviceManager graphicsDevice; 

    public Map(GraphicsDeviceManager device) 
    { 
        graphicsDevice = device;
    } 

    public void Load(ContentManager content)
    {
    myEnemy = content.Load<Texture2D>("gegner");
    Player = new Player(graphicsDevice);
    Player.Load(content);
    }

    public void Update(GameTime gameTime)
    {
        Player.Update(gameTime);
        float delta = (float)gameTime.ElapsedGameTime.TotalSeconds;

         for(int i = enemieslist.Count - 1; i >= 0; i--) 
        {
        // Update Enemy
        Enemy enemy = enemieslist[i];
        enemy.Update(gameTime, this.graphicsDevice, Player.spielershape.Position, delta);
        // Try to remove an enemy
        if (enemy.Remove == true)
        {
            enemieslist.Remove(enemy);
            enemy.Remove = false;
        }
        }

        this.fNextEnemy += delta;
        //New enemy
        if (fMaxEnemy > 0)
        {
        if ((this.fNextEnemy >= fEnemyFreq) && (enemieslist.Count < 3))
        {
            Vector2 enemyDirection = Vector2.Normalize(Player.playershape.Position - Startposition) * 100f;
            enemieslist.Add(new Enemy(Startposition, enemyDirection, Player.playershape.Position));
            fMaxEnemy -= 1;
            fNextEnemy -= fEnemyFreq;
        }
        }        
  }

    public void Draw(SpriteBatch batch)
    {
        Player.Draw(batch);
        foreach (Enemy enemies in enemieslist)
        {
            enemies.Draw(batch, myEnemy);
        }
    }      
}

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
public class Enemy{
    List<Bullet> bulletslist = new List<Bullet>();
    Texture2D myBullet;

 private float nextShot = 0;
 private float shotFrequency = 2.0f;  

    Vector2 vPos;
    Vector2 vMove;
    Vector2 vPlayer;
    public bool Remove;
    public bool Shot;

    public Enemy(Vector2 Pos, Vector2 Move, Vector2 Player)
    {
        this.vPos = Pos;
        this.vMove = Move;
        this.vPlayer = Player;
        this.Remove = false;
        this.Shot = false;
    }

    public void Load(ContentManager content)
    {
        myBullet = content.Load<Texture2D>("bullet");
    }

    public void Update(GameTime gameTime, GraphicsDeviceManager graphics, Vector2 PlayerPos, float delta)
    {           
        nextShot += delta;

        for (int i = bulletslist.Count - 1; i >= 0; i--)
        {
            // Update Bullet
            Bullet bullets = bulletslist[i];
            bullets.Update(gameTime, graphics, delta);

            // Try to remove a bullet... Collision, hit, or outside screen.
            if (bullets.Remove == true)
                bulletslist.Remove(bullets);
            bullets.Remove = false;
        }

        if (nextShot >= shotFrequency)
        {
            this.Shot = true;
            nextShot -= shotFrequency;
        }

        // Does the enemy shot?
        if ((Shot == true) && (bulletslist.Count < 1))
        // New bullet
        {
            Vector2 bulletDirection = Vector2.Normalize(PlayerPos - this.vPos) * 200f;
            bulletslist.Add(new Bullet(this.vPos, bulletDirection, PlayerPos));
            Shot = false;
        }

        if (!Remove)
        {
            this.vMove = Vector2.Normalize(PlayerPos - this.vPos) * 100f;
            this.vPos += this.vMove * delta;

            if (this.vPos.X > graphics.PreferredBackBufferWidth + 1)
            {
                this.Remove = true;
            }

            else if (this.vPos.X < -20)
            {
                this.Remove = true;
            }

            if (this.vPos.Y > graphics.PreferredBackBufferHeight + 1)
            {
                this.Remove = true;
            }

            else if (this.vPos.Y < -20)
            {
                this.Remove = true;
            }
        }
    }

    public void Draw(SpriteBatch batch, Texture2D myTexture)
    {
        if (!Remove)
        {
            batch.Draw(myTexture, this.vPos, Color.White);
        }
        foreach (Bullet bullets in bulletslist)
        {
            bullets.Draw(batch, myBullet);
        } 
    }
}


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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class Bullet{
    Vector2 vPos;
    Vector2 vMove;
    Vector2 vPlayer;
    public bool Remove;

    public Bullet(Vector2 Pos, Vector2 Move, Vector2 Player)
    {
        this.Remove = false;
        this.vPos = Pos;
        this.vMove = Move;
        this.vPlayer = Player;
    }


    public void Update(GameTime gameTime, GraphicsDeviceManager graphics, float delta)
    {
            if (!Remove)
            {
                this.vPos += this.vMove * delta;                  

                if (this.vPos.X > graphics.PreferredBackBufferWidth +1)
                {
                    this.Remove = true;
                }

                else if (this.vPos.X < -20)
                {
                    this.Remove = true;
                }

                if (this.vPos.Y > graphics.PreferredBackBufferHeight +1)
                {
                    this.Remove = true;
                }

                else if (this.vPos.Y < -20)
                {
                    this.Remove = true;
                }
            }         
    }

    public void Draw(SpriteBatch spriteBatch, Texture2D myTexture)
    {
        if (!Remove)
        {
            spriteBatch.Draw(myTexture, this.vPos, Color.White);
        }
    }
}

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

15

23.10.2012, 00:44

du rufst für erzeugte Enemy-Objekte nicht die Load-Methode auf, um die Textur zu laden - dadurch bleibt die Variable null, wird so ana Projektil übergeben und dort kommt dann der Fehler

dein Code ist leider immer noch nicht so wirklich gut strukturiert
du übergibst der Draw-Methode per Parameter die vom Objekt benötigte Textur
allerdings speicherst du die Enemy-Textur in der Map und die Bullet-Textur im Enemy
entweder sollte alles in der Map liegen oder alles in den Klassen, die diese Texturen benötigen
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

16

23.10.2012, 10:04

Wenn ich alles in der Map-Klasse lade, sollte ich dann auch alles in der Map-Klasse zeichnen? Oder wo sollte man die Texturen am besten zeichnen?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

17

23.10.2012, 13:53

Es gibt da auch wieder viele verschiedene Wege die dich zum Ziel bringen. Für den Anfang sollte es einfach und verständlich sein. Überleg dir bei jeder Klasse was sie ist. Die Logik die dieses Objekt benötigt kommt dann in die Klasse und wenn das Objekt gezeichnet werden soll, dann kommt das auch in die jeweilige Klasse. Alles was zusammen gehört packst du zusammen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

18

24.10.2012, 17:38

Ich lade die Kugel jetzt in der Map-Klasse. Aus irgendeinem Grund schießen die Gegner aber nicht und ich bekomme auch keine Fehlermeldung?(
Hier mal der geänderte Code:

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
public class Map{
    Texture2D myEnemy, myBullet ;
    Player Player;
    List<Enemy> enemieslist = new List<Enemy>();
    List<Bullet> bulletslist = new List<Bullet>();     

    float fNextEnemy = 0.0f;
    float fEnemyFreq = 3.0f;
    int fMaxEnemy = 3 ;

    Vector2 Startposition = new Vector2(200, 200);

    GraphicsDeviceManager graphicsDevice; 

    public Map(GraphicsDeviceManager device) 
    { 
        graphicsDevice = device;
    } 

    public void Load(ContentManager content)
    {
    myEnemy = content.Load<Texture2D>("enemy");
    myBullet = content.Load<Texture2D>("bullet");
    Player = new Player(graphicsDevice);
    Player.Load(content);
    }

    public void Update(GameTime gameTime)
    {
        Player.Update(gameTime);
        float delta = (float)gameTime.ElapsedGameTime.TotalSeconds;

         for(int i = enemieslist.Count - 1; i >= 0; i--) 
        {
        // Update Enemy
        Enemy enemy = enemieslist[i];
        enemy.Update(gameTime, this.graphicsDevice, Player.playershape.Position, delta);
        // Try to remove an enemy
        if (enemy.Remove == true)
        {
            enemieslist.Remove(enemy);
            enemy.Remove = false;
        }
        }

        this.fNextEnemy += delta;
        //New enemy
        if (fMaxEnemy > 0)
        {
        if ((this.fNextEnemy >= fEnemyFreq) && (enemieslist.Count < 3))
        {
            Vector2 enemyDirection = Vector2.Normalize(Player.playershape.Position - Startposition) * 100f;
            enemieslist.Add(new Enemy(Startposition, enemyDirection, Player.playershape.Position));
            fMaxEnemy -= 1;
            fNextEnemy -= fEnemyFreq;
        }
        }

  }

    public void Draw(SpriteBatch batch)
    {
        Player.Draw(batch);
        foreach (Enemy enemies in enemieslist)
        {
            enemies.Draw(batch, myEnemy);
        }
        foreach (Bullet bullets in bulletslist)
        {
            bullets.Draw(batch, myBullet);
        } 
    }      
}

public class Enemy
{
    List<Bullet> bulletslist = new List<Bullet>();

    private float nextShot = 0;
    private float shotFrequency = 2.0f;  
    Vector2 vPos;
    Vector2 vMove;
    Vector2 vPlayer;
    public bool Remove;
    public bool Shot;

    public Enemy(Vector2 Pos, Vector2 Move, Vector2 Player)
    {
        this.vPos = Pos;
        this.vMove = Move;
        this.vPlayer = Player;
        this.Remove = false;
        this.Shot = false;
    }

    public void Update(GameTime gameTime, GraphicsDeviceManager graphics, Vector2 PlayerPos, float delta)
    {           
        nextShot += delta;

        for (int i = bulletslist.Count - 1; i >= 0; i--)
        {
            // Update Bullet
            Bullet bullets = bulletslist[i];
            bullets.Update(gameTime, graphics, delta);

            // Try to remove a bullet... Collision, hit, or outside screen.
            if (bullets.Remove == true)
            {
                bulletslist.Remove(bullets);
                bullets.Remove = false;
            }
        }

        if (nextShot >= shotFrequency)
        {
            this.Shot = true;
            nextShot -= shotFrequency;
        }

        // Does the enemy shot?
        if ((Shot == true) && (bulletslist.Count < 1))
        // New bullet
        {
            Vector2 bulletDirection = Vector2.Normalize(PlayerPos - this.vPos) * 200f;
            bulletslist.Add(new Bullet(this.vPos, bulletDirection, PlayerPos));
            Shot = false;
        }


        if (!Remove)
        {
            this.vMove = Vector2.Normalize(PlayerPos - this.vPos) * 100f;
            this.vPos += this.vMove * delta;

            if (this.vPos.X > graphics.PreferredBackBufferWidth + 1)
            {
                this.Remove = true;
            }

            else if (this.vPos.X < -20)
            {
                this.Remove = true;
            }

            if (this.vPos.Y > graphics.PreferredBackBufferHeight + 1)
            {
                this.Remove = true;
            }

            else if (this.vPos.Y < -20)
            {
                this.Remove = true;
            }
        }
    }

    public void Draw(SpriteBatch batch, Texture2D myTexture)
    {
        if (!Remove)
        {
            batch.Draw(myTexture, this.vPos, Color.White);
        }           
    }
}

public class Bullet
{
    Vector2 vPos;
    Vector2 vMove;
    Vector2 vPlayer;
    public bool Remove;

    public Bullet(Vector2 Pos, Vector2 Move, Vector2 Player)
    {
        this.Remove = false;
        this.vPos = Pos;
        this.vMove = Move;
        this.vPlayer = Player;
    }


    public void Update(GameTime gameTime, GraphicsDeviceManager graphics, float delta)
    {
            if (!Remove)
            {
                this.vPos += this.vMove * delta;                  

                if (this.vPos.X > graphics.PreferredBackBufferWidth +1)
                {
                    this.Remove = true;
                }

                else if (this.vPos.X < -20)
                {
                    this.Remove = true;
                }

                if (this.vPos.Y > graphics.PreferredBackBufferHeight +1)
                {
                    this.Remove = true;
                }

                else if (this.vPos.Y < -20)
                {
                    this.Remove = true;
                }
            }         
    }

    public void Draw(SpriteBatch spriteBatch, Texture2D myTexture)
    {
        if (!Remove)
        {
            spriteBatch.Draw(myTexture, this.vPos, Color.White);
        }
    }
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

19

24.10.2012, 18:37

Ich glaube, Du bist Dir eines wichtigen Tools noch nicht bewusst. Es heißt Debugger. Nutze es!
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

20

24.10.2012, 19:34

Den Debugger solltest du wirklich lernen zu nutzen. Eines der mächtigsten Mittel die dir als Entwickler zur Verfügung stehen und sobald du dich dran gewöhnt hast ihn zu benutzen fragst du dich warum du nur so lange ohne konntest.
Kleiner Hinweis um es dir etwas zu vereinfachen. Setz mal einen Breakpoint an die Stelle, an der du Bullets in der Enemy Klasse erstellst. Zum Beispiel Zeile 116. Dann siehst du ob diese Zeile überhaupt ausgeführt wird. Wenn ja, dann geh mal Schritt für Schritt weiter und guck ob die nächste If-Abfrage auch ausgeführt wird (Zeile 121 und Rest). Dann siehst du ob die Bullets überhaupt erzeugt werden. Das sollte dir schon viele gute Informationen zum Problem geben.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige