NPC's bewegen sich syncron D:

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

MechVisor

Betreff: NPC's bewegen sich syncron D:

BeitragSa, Mai 29, 2004 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Mai 29, 2004 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Am Anfang deines Programms
Code: [AUSKLAPPEN]
SeedRnd MilliSecs()

aufrufen.
 

MechVisor

BeitragSa, Mai 29, 2004 22:34
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Mai 29, 2004 23:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Natürlich nicht in die Hauptschliefe sondern einmal am besten nach Graphics und SetBuffer BackBuffer()
 

MechVisor

BeitragSo, Mai 30, 2004 1:10
Antworten mit Zitat
Benutzer-Profile anzeigen
nö bringt auch nix Sad
Control ur mind -_-;;
 

Dreamora

BeitragSo, Mai 30, 2004 1:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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? Smile

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

BeitragSo, Mai 30, 2004 1:28
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Mai 30, 2004 1:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Mai 30, 2004 1:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, du hast da was falsch verstanden Wink

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 -_-;;

BladeRunner

Moderator

BeitragSo, Mai 30, 2004 13:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Ironstorm

Erstklassiger Contest-Veranstalter

BeitragSo, Mai 30, 2004 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Mai 30, 2004 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group