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

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

11

12.04.2016, 14:57

Da du ja um deine Performance Angst hast, habe ich das ganze mal optimiert. ;) Wenn du was nicht verstehst, dann kann ich dir das gerne per PM erklären!

C-/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
// Typ von monster->tempDir
enum Directions
{
    UP_LEFT    = 0,
    UP         = 1,
    UP_RIGHT   = 2,

    LEFT       = 3,
    NONE       = 4, // Kannste weglassen, aber mit ist das vielleicht verständlicher
    RIGHT      = 5,

    DOWN_LEFT  = 6,
    DOWN       = 7,
    DOWN_RIGHT = 8
};

// Differenzen berechnen
int hDiff = player->x - monster->x;
int vDiff = player->y - monster->y;

// Differenzen normieren (auf -1, 0 und 1)
hDiff /= Math.abs(hDiff);
vDiff /= Math.abs(vDiff);

// Bewegen
monster->moveX = monster->SPEED * hDiff;
monster->moveY = monster->SPEED * vDiff;
monster->tempDir = (hDiff + 1) + 3 * (vDiff + 1)

Ich vermute, dass die Monster aus 2 Gründen eiern:
  1. In der chase-Funktion kann es bei monster->SPEED > 1 passieren, dass die Differenz nie 0 wird. Stattdessen pendelt dein Monster ständig zwischen einer Differenz > 0 und einer < 0 herum. Stell dir vor, die horizontale Differenz liegt bei 1, der Spieler steht horizontal still und und das Monster bewegt sich mit einem Speed von 2. Im nächsten Frame ist hDiff -1. Dann wieder 1, -1, usw...
  2. In der move-Funktion prüfst du auf Kollision bevor das Monster bewegt wird. Deine Monster kollidieren also erst und dann sagt move, dass sich nicht mehr bewegt werden darf. Du musst beim Kollisionstest dx und dy mit einbeziehen!
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »CeDoMain« (12.04.2016, 15:37)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

12

12.04.2016, 18:52

@Schorsch. Mit karthesischen Koordinaten komme ich da nicht hin, sondern ich muss die umrechnen in Polarkoordinaten. Dafür nehme ich eine Vector 2D-Bibliothek und da gibt es dann solche Funktionen (das ist AS3):

Und was hat das jetzt mit dem zu tun was ich geschrieben hatte?
„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.“

bumu

Frischling

  • »bumu« ist der Autor dieses Themas

Beiträge: 32

Wohnort: Weit weg

Beruf: Pixelschieber

  • Private Nachricht senden

13

12.04.2016, 19:24

@Schorsch. Mit karthesischen Koordinaten komme ich da nicht hin, sondern ich muss die umrechnen in Polarkoordinaten. Dafür nehme ich eine Vector 2D-Bibliothek und da gibt es dann solche Funktionen (das ist AS3):

Und was hat das jetzt mit dem zu tun was ich geschrieben hatte?


Das sollte nur heissen, dass ich die Steering Behaviours kenne und dein Posting gelesen habe. Nichts für ungut. Ich hab schon früher viel Animationen in Flash gemacht, da gibts Bücher von einem Keith Peters, von dem ich viele grundlegende Dinge gelernt habe, die allgemein gelten u.a. Auch The Nature of Code ist sehr erhellend. Einige andere Sachen könnte ich auch noch nennen, wo ich mein Wissen herziehe. Jetzt mache ich erstmal ein bisschen weiter bei diesem kleinen Ballerspiel und dann sehen wir mal weiter. Eigentlich wollte ich ja in OpenGL machen, aber das ist ein dicker Brocken.
Multikulti ist, wenn ein Programm unter Linux, Mac und Windows läuft.

bumu

Frischling

  • »bumu« ist der Autor dieses Themas

Beiträge: 32

Wohnort: Weit weg

Beruf: Pixelschieber

  • Private Nachricht senden

14

12.04.2016, 19:38

Da du ja um deine Performance Angst hast, habe ich das ganze mal optimiert. ;) Wenn du was nicht verstehst, dann kann ich dir das gerne per PM erklären!

C-/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
// Typ von monster->tempDir
enum Directions
{
    UP_LEFT    = 0,
    UP         = 1,
    UP_RIGHT   = 2,

    LEFT       = 3,
    NONE       = 4, // Kannste weglassen, aber mit ist das vielleicht verständlicher
    RIGHT      = 5,

    DOWN_LEFT  = 6,
    DOWN       = 7,
    DOWN_RIGHT = 8
};

// Differenzen berechnen
int hDiff = player->x - monster->x;
int vDiff = player->y - monster->y;

// Differenzen normieren (auf -1, 0 und 1)
hDiff /= Math.abs(hDiff);
vDiff /= Math.abs(vDiff);

// Bewegen
monster->moveX = monster->SPEED * hDiff;
monster->moveY = monster->SPEED * vDiff;
monster->tempDir = (hDiff + 1) + 3 * (vDiff + 1)

Ich vermute, dass die Monster aus 2 Gründen eiern:
  1. In der chase-Funktion kann es bei monster->SPEED > 1 passieren, dass die Differenz nie 0 wird. Stattdessen pendelt dein Monster ständig zwischen einer Differenz > 0 und einer < 0 herum. Stell dir vor, die horizontale Differenz liegt bei 1, der Spieler steht horizontal still und und das Monster bewegt sich mit einem Speed von 2. Im nächsten Frame ist hDiff -1. Dann wieder 1, -1, usw...
  2. In der move-Funktion prüfst du auf Kollision bevor das Monster bewegt wird. Deine Monster kollidieren also erst und dann sagt move, dass sich nicht mehr bewegt werden darf. Du musst beim Kollisionstest dx und dy mit einbeziehen!

Da muss ich erstmal ein bisschen drüber nachdenken, aber deine Hinweise sind hilfreich.
Multikulti ist, wenn ein Programm unter Linux, Mac und Windows läuft.

CeDoMain

Alter Hase

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

15

12.04.2016, 19:46

Da muss ich erstmal ein bisschen drüber nachdenken, aber deine Hinweise sind hilfreich.
Funktioniert mein Programm denn überhaupt? Ich habe das nur im Kopf durchgerechnet... :D
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

bumu

Frischling

  • »bumu« ist der Autor dieses Themas

Beiträge: 32

Wohnort: Weit weg

Beruf: Pixelschieber

  • Private Nachricht senden

16

12.04.2016, 19:54

Da muss ich erstmal ein bisschen drüber nachdenken, aber deine Hinweise sind hilfreich.
Funktioniert mein Programm denn überhaupt? Ich habe das nur im Kopf durchgerechnet... :D


Scherzkeks, wenn ichs wüsste, hätte ich das schon geschrieben. Geht euch das nicht auch so, dass man manchmal an Sachen tagelang hängenbleibt? Das Problem ist sicher nicht so gross hier, das kann man schon lösen... also am Flocking habe ich vor 5 Jahren oder so auch 2 Wochen lang rumgekaut. Manch einer bekommt sein Spiel auch nie fertig...
Multikulti ist, wenn ein Programm unter Linux, Mac und Windows läuft.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

17

12.04.2016, 19:59

Das sollte nur heissen, dass ich die Steering Behaviours kenne und dein Posting gelesen habe. Nichts für ungut. Ich hab schon früher viel Animationen in Flash gemacht, da gibts Bücher von einem Keith Peters, von dem ich viele grundlegende Dinge gelernt habe, die allgemein gelten u.a. Auch The Nature of Code ist sehr erhellend. Einige andere Sachen könnte ich auch noch nennen, wo ich mein Wissen herziehe. Jetzt mache ich erstmal ein bisschen weiter bei diesem kleinen Ballerspiel und dann sehen wir mal weiter. Eigentlich wollte ich ja in OpenGL machen, aber das ist ein dicker Brocken.

Ich weiß nicht ob du mich da vielleicht falsch verstanden hast. Das Buch behandelt auch nicht nur die SBs sondern noch einige Themen mehr. Aber wenn es nichts für dich ist gibt es natürlich noch viele andere Bücher die hilfreich sein können.
Ob du jetzt mit OpenGL oder womit auch immer arbeitest ist von der KI ja eigentlich auch erst mal unabhängig. Aber erst mal zu testen und auszuprobieren ist sicherlich ein guter Ansatz. Dabei lernst du zumindest was.
„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.“

bumu

Frischling

  • »bumu« ist der Autor dieses Themas

Beiträge: 32

Wohnort: Weit weg

Beruf: Pixelschieber

  • Private Nachricht senden

18

12.04.2016, 20:14

Das sollte nur heissen, dass ich die Steering Behaviours kenne und dein Posting gelesen habe. Nichts für ungut. Ich hab schon früher viel Animationen in Flash gemacht, da gibts Bücher von einem Keith Peters, von dem ich viele grundlegende Dinge gelernt habe, die allgemein gelten u.a. Auch The Nature of Code ist sehr erhellend. Einige andere Sachen könnte ich auch noch nennen, wo ich mein Wissen herziehe. Jetzt mache ich erstmal ein bisschen weiter bei diesem kleinen Ballerspiel und dann sehen wir mal weiter. Eigentlich wollte ich ja in OpenGL machen, aber das ist ein dicker Brocken.

Ich weiß nicht ob du mich da vielleicht falsch verstanden hast. Das Buch behandelt auch nicht nur die SBs sondern noch einige Themen mehr. Aber wenn es nichts für dich ist gibt es natürlich noch viele andere Bücher die hilfreich sein können.
Ob du jetzt mit OpenGL oder womit auch immer arbeitest ist von der KI ja eigentlich auch erst mal unabhängig. Aber erst mal zu testen und auszuprobieren ist sicherlich ein guter Ansatz. Dabei lernst du zumindest was.


Jo. Es gibt bestimmt 10 000 Bücher zur Spieleprogrammierung. Genau deswegen weiss ich, was ich weiss. Wo solls auch sonst herkommen? Über mir wohnt ein Stückgutfahrer und neben mir ein Rettungssanitäter. Die kann ich schlecht fragen :) Den Mat Buckland, den du meinst, den hatte ich schon mal auf der Platte, bis ihn ein Crash weg gefegt hatte. Aber ich hol ihn mir wieder, das ist sicher!
Multikulti ist, wenn ein Programm unter Linux, Mac und Windows läuft.

Werbeanzeige