Bot verlässt die Map

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

BadDeath

Betreff: Bot verlässt die Map

BeitragMi, Jan 23, 2008 19:44
Antworten mit Zitat
Benutzer-Profile anzeigen
guten abend.

Ich habe Anfang diesen Jahres mit BB3D begonnen und bin nun dabei einen ego-shooter zu programmieren und komme eigentlich auch schon gut zurecht mit BB3D.

Mein Problem: Der zweite Gegner bewegt sich aus der Welt herraus, obwol der erste Gegner nicht diesen Bug besitzt. Er verlässt sofort nach dem Spielstart die Map und fällt dann in die unendliche Tiefe....

Die Bots wurden von mir als Types deklariert und mit zufällig erstellten Wegpunkten "gefüttert":

Code: [AUSKLAPPEN]

Type Gegner
   Field Mesh
   Field WayX[20]
   Field WayY[20]
   Field WayZ[20]
   Field WayN
   Field Leben
   Field Tot
   Field PosX#
   Field PosY#
   Field PosZ#
   Field Aktiv
   Field Speed#
   Field WP#
   Field Winkel#
   Field Winkel2#
End Type

Global Gegner1.Gegner = New Gegner
Gegner1\WayN=10
Gegner1\PosX# = 400
Gegner1\PosY# = 400
Gegner1\Speed= 12
For i = 1 To Gegner1\WayN
 Gegner1\WayX[i] = Rnd(-1000,1000)
 Gegner1\WayY[i] = Rnd(-1000,1000)
Next
Gegner1\Winkel2 = NextWayPoint()


Global Gegner2.Gegner = New Gegner
Gegner2\WayN=2
Gegner2\PosX# = 600
Gegner2\PosY# = 400
Gegner2\Speed= 12
For i = 1 To Gegner2\WayN
 Gegner2\WayX[i] = Rnd(-1000,1000)
 Gegner2\WayY[i] = Rnd(-1000,1000)
Next
Gegner2\Winkel2 = NextWayPoint()


Dann habe ich in die Hauptschleife eingebaut, dass sich die Bots von Punkt zu Punkt bewegen und in Laufrichtung gucken:

Code: [AUSKLAPPEN]
   For Mob.Gegner = Each Gegner
      If Mob\tot = False Then
         Mob\PosX# = Mob\PosX# + Cos(Mob\Winkel2#) * Mob\Speed#
         Mob\PosY# = Mob\PosY# + Sin(Mob\Winkel2#) * Mob\Speed#
         PositionEntity Mob\Mesh#, Mob\PosX#, 60, Mob\PosY#
   
         If Abs(Mob\WayX[Mob\WP#] - Mob\PosX#) =< Mob\Speed# And Abs(Mob\WayY[Mob\WP#] - Mob\PosY#) =< Mob\Speed# Then
            Mob\Winkel2# = NextWayPoint()
            TurnEntity Mob\Mesh,0, 270-EntityYaw#(Mob\Mesh),0
            TurnEntity Mob\Mesh,0,Mob\Winkel2#,0
         End If
      End If
   
      EntityColor Mob\Mesh,c1(w),c2(w),c3(w)
       TranslateEntity Mob\Mesh,0,-100,0         ; Gravitation Gegner
   Next


Dazu gibt es noch eine Hilfsfunktion:

Code: [AUSKLAPPEN]
; Winkel zum nächsten Punkt berechnen
Function NextWayPoint()
For Mub.Gegner = Each Gegner
 Mub\WP = Mub\WP + 1
 If Mub\WP = Mub\WayN - 1 Then Mub\WP = 1
 Mub\Winkel2# = (450 - ATan2((Mub\WayX[Mub\WP] - Mub\PosX), (Mub\WayY[Mub\WP] - Mub\PosY))) Mod 360
 Return Mub\Winkel2#
Next
End Function


Ich weiß, dass die Positionen falsch benannt wurden, ich habe das erst in 2D mit einem Bild gemacht.

Wäre prima von euch, wenn ihr mir helfen könntet.
  • Zuletzt bearbeitet von BadDeath am Do, Jan 24, 2008 18:56, insgesamt einmal bearbeitet

the FR3AK

BeitragMi, Jan 23, 2008 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich empfehle dir es erstmal mit etwas einfacherem zu versuchen...
 

BadDeath

BeitragDo, Jan 24, 2008 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Mhhh, gut ich erhofft mir nun eher eine Antwort, die mir bei meinem Problem weiterhilft.

Aber das kenne ich ja bereits, dass mir hier nicht geholfen wird. Warum, weiß ich auch nicht.... Mögt ihr mich nicht, obwohl ihr mich garnicht kennt, oder wisst ihr es selbst nicht besser?

Wäre jedenfalls nett von euch, wenn ihr mir bei meinem Problem helfen könntet ihr eine Alternative zu eurem Forum nennt.

Danke, BadDeath
 

Dreamora

BeitragDo, Jan 24, 2008 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich seh da mehrere Dinge:

1. Machst du keinen seedrnd(millisecs() ). Damit könntest du ausschliessen, das nicht einfach deine zufallskoordinaten statt wirklichen waypoints das problem sind

2. Mob\WayX[Mob\WP#] -> das geht schonma garnicht, denn indizes sind IMMER int, nie floats. Sprich definier sie auch so im Type.

3. TranslateEntity Mob\Mesh,0,-100,0 ; Gravitation Gegner
Der wird so auch net gehen. Mehr frames -> er fliegt direkt ma nach nirgendwo unten durch. Da musst du eine FPS basierende methode machen, damit er zb 100 einheiten pro Sekunde runterfliegt. nicht 100 pro frame! könnt nämlich sein das er einfach nach vorne läuft, auch nur ein bischen im boden ist und dank der beschleunigung durch den boden geschossen wird Smile (faustregel: move sollte nie grösser werden als 2*kollisionsradius in diese richtung sonst musst du mit linepick und kollisionsradius als dicke der line checken)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

BadDeath

BeitragDo, Jan 24, 2008 20:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Also erst einmal Danke für die Antwort!

Nach ein paar Modifikationen, deine Verbesserungen natürlich einbezogen, geht es nun halb. Es verlässt nun nur noch so im Schnitt 1-2 von 5 Gegnern die Welt.

Hier die aktuellen Code-Ausschnitte:

Erstellen der Gegner-Types:
Code: [AUSKLAPPEN]
SeedRnd MilliSecs()

Type Gegner
   Field Mesh
   Field WayX[20]
   Field WayY[20]
   Field WayZ[20]
   Field WayN
   Field Leben
   Field Tot
   Field PosX#
   Field PosY#
   Field PosZ#
   Field Aktiv
   Field Speed#
   Field WP
   Field Winkel
   Field Winkel2#
End Type

Global Gegner1.Gegner = New Gegner
Gegner1\WayN=10
Gegner1\PosX = 400
Gegner1\PosY = 400
Gegner1\Speed= 12
For i = 1 To Gegner1\WayN
 Gegner1\WayX[i] = Rnd(-1000,1000)
 Gegner1\WayY[i] = Rnd(-1000,1000)
Next

Global Gegner2.Gegner = New Gegner
Gegner2\WayN=10
Gegner2\PosX = 600
Gegner2\PosY = 400
Gegner2\Speed= 12
For i = 1 To Gegner2\WayN
 Gegner2\WayX[i] = Rnd(-1000,1000)
 Gegner2\WayY[i] = Rnd(-1000,1000)
Next

Global Gegner3.Gegner = New Gegner
Gegner3\WayN=10
Gegner3\PosX = 600
Gegner3\PosY = 400
Gegner3\Speed= 12
For i = 1 To Gegner3\WayN
 Gegner3\WayX[i] = Rnd(-1000,1000)
 Gegner3\WayY[i] = Rnd(-1000,1000)
Next

Global Gegner4.Gegner = New Gegner
Gegner4\WayN=10
Gegner4\PosX = 600
Gegner4\PosY = 400
Gegner4\Speed= 12
For i = 1 To Gegner4\WayN
 Gegner4\WayX[i] = Rnd(-1000,1000)
 Gegner4\WayY[i] = Rnd(-1000,1000)
Next

Global Gegner5.Gegner = New Gegner
Gegner5\WayN=10
Gegner5\PosX = 600
Gegner5\PosY = 400
Gegner5\Speed= 12
For i = 1 To Gegner5\WayN
 Gegner5\WayX[i] = Rnd(-1000,1000)
 Gegner5\WayY[i] = Rnd(-1000,1000)
Next


Laden der Gegner:
Code: [AUSKLAPPEN]
Gegner1\Mesh=LoadMesh("gfx\Figur 1.3ds")
PositionEntity Gegner1\Mesh, Gegner1\PosX, 900, Gegner1\PosY
EntityType Gegner1\Mesh,3
ScaleEntity Gegner1\Mesh,0.3,0.3,0.3
EntityPickMode Gegner1\Mesh,2
Gegner1\Leben = 100
NameEntity Gegner1\Mesh,"Gegner 1"
Gegner1\Winkel2 = NextWayPoint("Gegner 1")

Gegner2\Mesh=LoadMesh("gfx\Figur 2.3ds")
PositionEntity Gegner2\Mesh, Gegner2\PosX, 900, Gegner2\PosY
EntityType Gegner2\Mesh,3
ScaleEntity Gegner2\Mesh,0.3,0.3,0.3
EntityPickMode Gegner2\Mesh,2
Gegner2\Leben = 100
NameEntity Gegner2\Mesh,"Gegner 2"
Gegner2\Winkel2 = NextWayPoint("Gegner 2")

Gegner3\Mesh=LoadMesh("gfx\Figur 1.3ds")
PositionEntity Gegner3\Mesh, Gegner3\PosX, 900, Gegner3\PosY
EntityType Gegner3\Mesh,3
ScaleEntity Gegner3\Mesh,0.3,0.3,0.3
EntityPickMode Gegner3\Mesh,2
Gegner3\Leben = 100
NameEntity Gegner3\Mesh,"Gegner 3"
Gegner3\Winkel2 = NextWayPoint("Gegner 3")

Gegner4\Mesh=LoadMesh("gfx\Figur 2.3ds")
PositionEntity Gegner4\Mesh, Gegner4\PosX, 900, Gegner4\PosY
EntityType Gegner4\Mesh,3
ScaleEntity Gegner4\Mesh,0.3,0.3,0.3
EntityPickMode Gegner4\Mesh,2
Gegner4\Leben = 100
NameEntity Gegner4\Mesh,"Gegner 4"
Gegner4\Winkel2 = NextWayPoint("Gegner 4")

Gegner5\Mesh=LoadMesh("gfx\Figur 1.3ds")
PositionEntity Gegner5\Mesh, Gegner5\PosX, 900, Gegner5\PosY
EntityType Gegner5\Mesh,3
ScaleEntity Gegner5\Mesh,0.3,0.3,0.3
EntityPickMode Gegner5\Mesh,2
Gegner5\Leben = 100
NameEntity Gegner5\Mesh,"Gegner 5"
Gegner5\Winkel# = NextWayPoint("Gegner 5")


Positionsänderungen in der Hauptschleife:
Code: [AUSKLAPPEN]

   For Mob.Gegner = Each Gegner
      If Mob\tot = False Then
         Mob\PosX = Mob\PosX + Cos(Mob\Winkel2) * Mob\Speed#
         Mob\PosY = Mob\PosY + Sin(Mob\Winkel2) * Mob\Speed#
         PositionEntity Mob\Mesh#, Mob\PosX, 60, Mob\PosY
   
         If Abs(Mob\WayX[Mob\WP] - Mob\PosX) =< Mob\Speed# And Abs(Mob\WayY[Mob\WP] - Mob\PosY) =< Mob\Speed# Then
            Namee$ = EntityName$(Mob\Mesh)
            Mob\Winkel2 = NextWayPoint(Namee)
            TurnEntity Mob\Mesh,0, 270-EntityYaw#(Mob\Mesh),0
            TurnEntity Mob\Mesh,0,Mob\Winkel2,0
         End If
      End If
      
      If Mob\tot = True And Mob\Winkel# < 10 Then
         TurnEntity Mob\Mesh,9,0,0
         Mob\Winkel# = Mob\Winkel# + 1
      End If
      EntityColor Mob\Mesh,c1(w),c2(w),c3(w)
       TranslateEntity Mob\Mesh,0,-30,0         ; Gravitation Gegner
   Next


Ausrichtungs-Funktion:
Code: [AUSKLAPPEN]
Function NextWayPoint(BotName$)
For Mub.Gegner = Each Gegner
   If EntityName$ (Mub\Mesh) = BotName$ Then Exit
Next

 Mub\WP = Mub\WP + 1
 If Mub\WP = Mub\WayN - 1 Then Mub\WP = 1
 Mub\Winkel2 = (450 - ATan2((Mub\WayX[Mub\WP] - Mub\PosX), (Mub\WayY[Mub\WP] - Mub\PosY))) Mod 360
 Return Mub\Winkel2
End Function


PS: Das mit dem SeedRnd war vorher auch schon eingebaut, wurde aber nicht von mir mit gepostet, da ich dachte, dass es nicht von Belangen sei.

MfG, BadDeath
 

Dreamora

BeitragDo, Jan 24, 2008 21:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Und die koordinaten - 1000 bis +1000 sind alle in der Welt? sprich es ist nicht möglich das du da koordinaten generierst die draussen sind?

und eine gravitation von 30 ist einige welten zu gross, nach wie vor.

normalerweise hat man 10-15 pro Sekunde. Du hast etwa 2000 pro sekunde.


Ach ja benutz Moveentity für das vorwärts / seitwärts bewegen. dann brauchst du net mit cos und sin die position zu errechnen, das macht die entity transformations matrix schon nach dem turn.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

BadDeath

BeitragDo, Jan 24, 2008 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Jap, die Punkte liegen alle auf der Map, die ist sogar rund 4x so groß wie der Zufallsbereich...
Und das mit der Gravitation ist ja erstmal eine Nebensache, würde ich meinen, da es ja so auch reibungslos läuft, aber dennoch Danke für den Tipp, werde es einbauen. Zudem werde ich das mit dem Cosinus und so ersetzen, so wie du es sagst und das Ergebnis hier rein editieren.

Danke, BadDeath

Edit:

So, entweder stehe ich gerade auf dem Schlauch, oder es geht wirklich nicht, was ich aber nicht glaube. Es rennen nun nämlich alle in irgendwelche Richtungen. Wenn man die beiden Zeilen rausnimmt, die ich mit *** makierte, stecken in Alle in einem.

Code: [AUSKLAPPEN]
   For Mob.Gegner = Each Gegner
      If Mob\tot = False Then   
         If Abs(Mob\WayX[Mob\WP] - EntityX#(Mob\Mesh)) =< Mob\Speed# And Abs(Mob\WayY[Mob\WP] - EntityZ#(Mob\Mesh)) =< Mob\Speed# Then
            Namee$ = EntityName$(Mob\Mesh)
            Mob\Winkel2 = NextWayPoint(Namee$)
            TurnEntity Mob\Mesh,0, 270-EntityYaw#(Mob\Mesh),0
            TurnEntity Mob\Mesh,0,Mob\Winkel2,0
         End If

         TurnEntity Mob\Mesh,0, 270-EntityYaw#(Mob\Mesh),0   ;*******
         TurnEntity Mob\Mesh,0,Mob\Winkel2,0               ;*******
         MoveEntity Mob\Mesh,0,0,12
      End If
      
      If Mob\tot = True And Mob\Winkel# < 10 Then
         TurnEntity Mob\Mesh,9,0,0
         Mob\Winkel# = Mob\Winkel# + 1
      End If
      EntityColor Mob\Mesh,c1(w),c2(w),c3(w)
       TranslateEntity Mob\Mesh,0,-15,0         ; Gravitation Gegner
   Next


Code: [AUSKLAPPEN]
; Winkel zum nächsten Punkt berechnen
Function NextWayPoint(BotName$)
For Mub.Gegner = Each Gegner
   If EntityName$ (Mub\Mesh) = BotName$ Then Exit
Next

 Mub\WP = Mub\WP + 1
 If Mub\WP = Mub\WayN - 1 Then Mub\WP = 1
 Mub\Winkel2 = (450 - ATan2((Mub\WayX[Mub\WP] - EntityX#(Mub\Mesh)), (Mub\WayY[Mub\WP] - EntityZ#(Mub\Mesh)))) Mod 360
 Return Mub\Winkel2
End Function
 

BadDeath

BeitragSo, Jan 27, 2008 2:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Verzeiht mir bitte, dass ich so drängel, aber:

Hat denn wirklich keiner von euch eine Idee?

BladeRunner

Moderator

BeitragSo, Jan 27, 2008 12:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn einer eine hätte (oder grad das Interesse sich reinzudenken) würde er es schon posten. Bitte unterlasse solche Pushereien, darauf reagieren wir äusserst allergisch (mit Threadschliessung).
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group