Bot verlässt die Map
Übersicht

BadDeathBetreff: Bot verlässt die Map |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich empfehle dir es erstmal mit etwas einfacherem zu versuchen... | ||
BadDeath |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
BadDeath |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Verzeiht mir bitte, dass ich so drängel, aber:
Hat denn wirklich keiner von euch eine Idee? |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group