NPC's bewegen sich syncron D:
Übersicht

MechVisorBetreff: NPC's bewegen sich syncron D: |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe heute mal versucht einen NPC zu basteln. Die NPC's hab ich in einem Type gespeichert. Also:
Code: [AUSKLAPPEN] Type npc Field npc_img Field npc_x Field npc_y Field npc_stand End Type Function NPCErstellen() x = Rand(100,500) y = Rand(100,400) n.npc = New npc n\npc_img = npc_animation n\npc_x = x n\npc_y = y n\npc_stand = 0 End Function Die Funktion legt einen neuen NPC an. Geht auch über Dim() etc. So das Problem ist nun folgendes: Nachdem ich 2 NPC's in die Containervariable n abgelegt hab, und beide nach Zufallsprinzip umher laufen lasse bewegen sich beide voll syncron. Das heißt, wenn der 1. nach Norden läuft, läuft der 2. auch nach Norden ^^ Das sieht natürlich blöd aus. Wie ändere ich das, das beide in verschiedene Richtungen laufen. Oder muss ich da dann 2 Containervariablen anlegen? |
||
Control ur mind -_-;; |
zocker2150 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Am Anfang deines Programms
Code: [AUSKLAPPEN] SeedRnd MilliSecs()
aufrufen. |
||
MechVisor |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hab ich auch schon versucht, laufen trotzdem noch syncron.
Edit: Hier mal der komplette Code, sorry das er so noobig aussieht und nicht kommentiert ist: Code: [AUSKLAPPEN] ;=====================================Globale Variablen Global figur Global x Global y ;=====================================Typ für die Gegner Type gegner Field gegner_img Field gegner_x Field gegner_y Field gegnerwait End Type ;=====================================Hauptprogramm Graphics 640,480,32,1 SetBuffer BackBuffer() figur = LoadAnimImage("charsets\sniper.png",32,32,0,24) MaskImage figur,255,0,255 ;=====================================Hauptschleife Repeat Cls SeedRnd MilliSecs() If MilliSecs() > tmranim + 100 Then tmranim = MilliSecs() gegner_front = 0 + (gegner_front + 1) Mod 3 gegner_right = 3 + (gegner_right + 1) Mod 3 gegner_back = 6 + (gegner_back + 1) Mod 3 gegner_left = 9 + (gegner_left + 1) Mod 3 gegner_ldown = 12 + (gegner_ldown + 1) Mod 3 gegner_rdown = 15 + (gegner_rdown + 1) Mod 3 gegner_lup = 18 + (gegner_lup + 1) Mod 3 gegner_rup = 21 + (gegner_rup + 1) Mod 3 EndIf ;=====================================Gegner-KI For g.gegner = Each gegner Select a Case 0 ;rechts If g\gegner_x < (640 - 32) g\gegner_x = g\gegner_x + 1 DrawImage g\gegner_img,g\gegner_x,g\gegner_y,gegner_right If MilliSecs() > wait + Rand(1000,3000) Then wait = MilliSecs() a = Rand(0,7) EndIf ElseIf Not g\gegner_x < (640 - 32) Then DrawImage g\gegner_img,g\gegner_x,g\gegner_y,gegner_right If MilliSecs() > wait + Rand(1000,3000) Then wait = MilliSecs() a = Rand(0,7) EndIf EndIf Case 1 ;links If g\gegner_x > -2 g\gegner_x = g\gegner_x - 1 DrawImage g\gegner_img,g\gegner_x,g\gegner_y,gegner_left If MilliSecs() > wait + Rand(1000,3000) Then wait = MilliSecs() a = Rand(0,7) EndIf ElseIf Not g\gegner_x > -2 Then DrawImage g\gegner_img,g\gegner_x,g\gegner_y,gegner_left If MilliSecs() > wait + Rand(1000,3000) Then wait = MilliSecs() a = Rand(0,7) EndIf EndIf Case 2 ;unten If g\gegner_y < (480 - 32) Then g\gegner_y = g\gegner_y + 1 DrawImage g\gegner_img,g\gegner_x,g\gegner_y,gegner_front If MilliSecs() > wait + Rand(1000,3000) Then wait = MilliSecs() a = Rand(0,7) EndIf ElseIf Not g\gegner_y < (480 - 32) Then DrawImage g\gegner_img,g\gegner_x,g\gegner_y,gegner_front If MilliSecs() > wait + Rand(1000,3000) Then wait = MilliSecs() a = Rand(0,7) EndIf EndIf Case 3 ;oben If g\gegner_y > -2 Then g\gegner_y = g\gegner_y - 1 DrawImage g\gegner_img,g\gegner_x,g\gegner_y,gegner_back If MilliSecs() > wait + Rand(1000,3000) Then wait = MilliSecs() a = Rand(0,7) EndIf ElseIf Not g\gegner_y > -2 Then DrawImage g\gegner_img,g\gegner_x,g\gegner_y,gegner_back If MilliSecs() > wait + Rand(1000,3000) Then wait = MilliSecs() a = Rand(0,7) EndIf EndIf Case 4 ;unten rechts If g\gegner_x < (640 - 32) And g\gegner_y < (480 - 32) Then g\gegner_x = g\gegner_x + 1 g\gegner_y = g\gegner_y + 1 DrawImage g\gegner_img,g\gegner_x,g\gegner_y,gegner_rdown If MilliSecs() > wait + Rand(1000,3000) Then wait = MilliSecs() a = Rand(0,7) EndIf ElseIf Not g\gegner_x < (640 - 32) And g\gegner_y < (480 - 32) Then DrawImage g\gegner_img,g\gegner_x,g\gegner_y,gegner_rdown If MilliSecs() > wait + Rand(1000,3000) Then wait = MilliSecs() a = Rand(0,7) EndIf EndIf Case 5 ;unten links If g\gegner_x > -2 And g\gegner_y < (480 - 32) Then g\gegner_x = g\gegner_x - 1 g\gegner_y = g\gegner_y + 1 DrawImage g\gegner_img,g\gegner_x,g\gegner_y,gegner_ldown If MilliSecs() > wait + Rand(1000,3000) Then wait = MilliSecs() a = Rand(0,7) EndIf ElseIf Not g\gegner_x > -2 And g\gegner_y < (480 - 32) Then DrawImage g\gegner_img,g\gegner_x,g\gegner_y,gegner_ldown If MilliSecs() > wait + Rand(1000,3000) Then wait = MilliSecs() a = Rand(0,7) EndIf EndIf Case 6 ;oben rechts If g\gegner_x < (640 - 32) And g\gegner_y > -2 Then g\gegner_x = g\gegner_x + 1 g\gegner_y = g\gegner_y - 1 DrawImage g\gegner_img,g\gegner_x,g\gegner_y,gegner_rup If MilliSecs() > wait + Rand(1000,3000) Then wait = MilliSecs() a = Rand(0,7) EndIf ElseIf Not g\gegner_x < (640 - 32) And g\gegner_y > -2 Then DrawImage g\gegner_img,g\gegner_x,g\gegner_y,gegner_rup If MilliSecs() > wait + Rand(1000,3000) Then wait = MilliSecs() a = Rand(0,7) EndIf EndIf Case 7 ;oben links If g\gegner_x > -2 And g\gegner_y > -2 Then g\gegner_x = g\gegner_x - 1 g\gegner_y = g\gegner_y - 1 DrawImage g\gegner_img,g\gegner_x,g\gegner_y,gegner_lup If MilliSecs() > wait + Rand(1000,3000) Then wait = MilliSecs() a = Rand(0,7) EndIf ElseIf Not g\gegner_x < -2 And g\gegner_y > -2 Then DrawImage g\gegner_img,g\gegner_x,g\gegner_y,gegner_lup If MilliSecs() > wait + Rand(1000,3000) Then wait = MilliSecs() a = Rand(0,7) EndIf EndIf End Select Next If KeyHit(57) Then GegnerErstellen() EndIf Flip Until KeyHit(1) End ;=====================================Ende Hauptprogramm ;=====================================Funktion um einen Gegner zu erstellen Function GegnerErstellen() x = Rand(100,500) y = Rand(100,400) g.gegner = New gegner g\gegner_img = figur g\gegner_x = x g\gegner_y = y g\gegnerwait = 0 End Function |
||
Control ur mind -_-;; |
zocker2150 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Natürlich nicht in die Hauptschliefe sondern einmal am besten nach Graphics und SetBuffer BackBuffer() | ||
MechVisor |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
nö bringt auch nix ![]() |
||
Control ur mind -_-;; |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
sie können sich auch garnicht asynchron bewegen wenn sie alle über die gleiche variable getimed sind ( wait )
Code: [AUSKLAPPEN] If MilliSecs() > wait + Rand(1000,3000) Then wait = MilliSecs() a = Rand(0,7) EndIf vielleicht solltest du auch die type eigenen waittimer verwenden, meinst net? ![]() zusätzlich is das ganze programm total verbugt: nach der for bla.type = each type gehört noch vor das select hin ob der npc sich überhaupt bewegen darf ... nicht irgendwo intern nach der positionsabfrage UND nachdem er bereits bewegt wurde ... |
||
MechVisor |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hm ok, gut ich hätte erst abfragen sollen ob der NPC sich überhaupt von der Startposition aus bewegen kann...
Aber hey ich weiß ja das er das kann von daher ist das ja jetzt unwichtig. Dem Type einen waittimer geben? Dann wären nur die Startpositionen der NPC's woanders aber nicht die Bewegungen jedes einzelnen oder hab ich da jetzt was falsch verstanden? lol -.- nicht mal den Scheiss krieg ich hin :/ |
||
Control ur mind -_-;; |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
du verstehst glaub net was ich meine
ERST musst du überprüfen ob der Timer abgelaufen ist und sich somit der NPC bewegen darf. Das Problem ist, du bewegst ihn und tust alles und erst ganz am Schluss prüfst du den Timer ... dann ist es jedoch schnuppe ob er abgelaufen ist oder nicht, da bereits die gesammte Bewegung erfolg ist! |
||
MechVisor |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hm, du hast da was falsch verstanden ![]() Und zwar ergibt sich durch die Überprüfung des Timers ein Wert zwischen 1000 und 3000 Millisekunden. Das heißt das sich der NPC zwischen 1 bis 3 Sekunden in die Richtung bewegt und danach eine andere zufällige Richtung einschlägt. Und es funktioniert!!! ^^ Ausserdem ist mein Problem das sie synchron laufen. Nehmen wir an, der 1. NPC startet auf x100 y100 und der 2. auf x200 y200. So, jetzt läuft der 1. NPC nach Norden, was der 2. auch macht, danach läuft der 1. nach rechts und der 2. zum selben Zeitpunkt auch. Das liegt daran das ich mit den If-Abfragen alle NPC's aus der Containervariable "g" bewege. Edit: Falls du ICQ besitzt könnte ich dir das png des NPC's geben. |
||
Control ur mind -_-;; |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also: du bewegst ALLE gegner nach dem Wert einer einzelnen Variable (a). da bei allen Gegnern a denselben wert hat, können sie ja gar nicht in verschiedene Richtungen wandern.
Füg deinem Gegner-Type noch ein Field Richtung hinzu und überprüfe das. Du kannst ja die Startrichtung zufällig initialisieren lassen. |
||
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 |
![]() |
IronstormErstklassiger Contest-Veranstalter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Warum macht ihr einfach nicht zwei Containerdateien? Is zwar aufwendig aber was solls! | ||
..:: blackbird design : blackbird photography : Futuro Verde : X-Commander ::..
MacBook | Intel Core 2 Duo 2,1 GHz | 2048 MB RAM | 80 GB HDD | Mac OS X 10.6.2 (Snow Leopard) | Adobe CS4 Design Premium |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
wir haben das per ICQ geklärt
Er verwendet nun einfach noch nen Richtungsvektor ... das lässt vor allem auch dieses unnütze Select - Case weg ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group