Verfolgungs Problem
Übersicht

![]() |
DottakopfBetreff: Verfolgungs Problem |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo !
Ich hab so ein Problem mit ner Verfolgungsfunktion. Die Situation : Ich kann mit einem Player zu einer roten box laufen und sobald ich mit dieser kollidiere wird eine ameise(kugel) erstellt. Diese Ameise soll mich verfolgen was eigentlich auch klappt. Doch sobalt ich eine neue Ameise erstelle, passiert folgendes : - Statt einer A. werden 2 erstellt (und eins folgt mir, das andere steht) - Die A. welche mich vorher verfolgete steht jetzt auch Warum passiert das?? Das ist doch unlogisch vorallem des mit der 2fach erstellung ! Ich stell hier mal den Abschnitt rein indem ich die Ameise erstelle (da is ne bauzeit mit drin..) und wie mich die Ameisen verfolgen sollten. Code: [AUSKLAPPEN] Function ants_create() ;Kollision / bauzeit bis 100 / Ant erstellen /verfolgen If EntityCollided(player,type_bau) Then bau_able = True If bau_able = True Then bau_counter = bau_counter +1 ;bauzeit ;wenn Bauzeit 100 ant erstellen If bau_counter >= 100 Then bau_counter = 0 ;bauprozess zu ende bau_able = False ;bau stoppen info.ant = New ant ;ameise erstellen info\ax = ax info\ay = ay info\az = az For info.ant = Each ant ant = CreateSphere() EntityType ant,TYPE_ANT EntityColor ant,0,100,100 PositionEntity ant, info\ax,info\ay+1,info\az ;ameise setzten Next End If End Function ;--------------------------------- Function update_ant() For info.ant = Each ant ;jetzt müsste mich doch jede Ant verfolgen ?! PointEntity ant,player,1 If EntityDistance(ant,player) >2 Then MoveEntity ant,0,0,0.5 Next End Function Wenn ihr wollt kann ich euch auch den ganzen Quellcode zur genauen veranschaulichung posten (besteht nur aus cuben und spheren/ keine texturen). Ich hoffe das ich euch mein Problem verständlich schildern konnte und danke euch schon einmal für eure Mühe im voraus !!! mfg Dottakopf |
||
![]() |
Christoph |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du musst ein neues Feld in ant anlegen, z.b. entity. Darin speicherst du die Sphere.
und dann machst du statt dem: Code: [AUSKLAPPEN] PointEntity ant,player,1
If EntityDistance(ant,player) >2 Then MoveEntity ant,0,0,0.5 das: Code: [AUSKLAPPEN] PointEntity ant\entity,player,1
If EntityDistance(ant\entity,player) >2 Then MoveEntity ant\entity,0,0,0.5 Dein Fehler ist, dass du immer nur auf Ant zugreifst, welches beim 2./3./4. Mal überschrieben wird, d.h. du greifst immer nur auf das neuste Objekt zu. Du musst für JEDE Ameise eine Variable anlegen, in der die Nummer des Entity gespeichert wird |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok !
Mit neuem Feld anlegen meinst du da einen kompletten type ? Und wie speichere ich das dan rein ? ![]() |
||
![]() |
skey-z |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, keinen neuen Type, du hast ja in deinem schon die Felder ax, ay, und az, du musst nur ein neues "Field entity" in den Type eintragen und beim erstellen
Code: [AUSKLAPPEN] info\entity = createsphere() nun kannst du jede einzelne Kugel direkt ansprechen, weil bei deinem Code wird die Kugel zwar auc herstellt, aber bei jedem weiteren erstellen wird die vorherige Kugel überschrieben, sie besteht zwar noch, hat aber keine Referenz mehr im Speicher. |
||
Awards:
Coffee's Monatswettbewerb Feb. 08: 1. Platz BAC#57: 2. Platz |
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke für die Hilfe ! (habs etz gut verstanden)
Jedoch bekomme ich eine Fehlermeldung "Variable must be a Type" ! Irgendwas stimmt immer noch nicht. Um missverständnissen aus dem Weg zu gehen Poste ich mein Korrekturen: Code: [AUSKLAPPEN] ;hier wurde "entity" in ant aufgenommen Type ant Field ax Field ay Field az Field ant Field entity End Type ;schleife ... Function ants_create() If EntityCollided(player,type_bau) Then bau_able = True If bau_able = True Then bau_counter = bau_counter +1 ;bauzeit ;wenn Bauzeit 100 ant erstellen If bau_counter >= 100 Then bau_counter = 0 ;bauprozess zu ende bau_able = False ;bau stoppen info.ant = New ant ;ameise erstellen info\ax = ax info\ay = ay info\az = az For info.ant = Each ant info\entity = CreateSphere() ;VARIABLE ÜBERGEBEN EntityType ant,TYPE_ANT EntityColor ant,0,100,100 PositionEntity info\entity, info\ax,info\ay+1,info\az+10 ;ameise setzten Next End If End Function ;--------------------------------- Function update_ant() For info.ant = Each ant PointEntity ant\entity,player,1 ;entity einbauen If EntityDistance(ant\entity,player) >2 Then MoveEntity ant\entity,0,0,0.5 Next End Function Hab ich das richtig gemacht ?? |
||
![]() |
Christoph |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nö,
wenn du dein Typ "info" nennst, musst du ihn auch damit ansprechen: Code: [AUSKLAPPEN] For info.ant = Each ant
PointEntity info\entity,player,1 ;entity einbauen If EntityDistance(info\entity,player) >2 Then MoveEntity info\entity,0,0,0.5 Next |
||
BlackTermi |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo, habe mir das Programm jetzt nicht wirklich angesehen, nur eines ist mir gleich ins Auge gesprungen:
Dottakopf hat Folgendes geschrieben: Function update_ant() For info.ant = Each ant PointEntity ant\entity,player,1 ;entity einbauen If EntityDistance(ant\entity,player) >2 Then MoveEntity ant\entity,0,0,0.5 Next End Function [/code] Hab ich das richtig gemacht ?? soweit ich weiss muss da info\ hin, sonst kann es nicht funktionieren, da info die variable ist und ant der Type eintrag. /edit bin ich denn immer zu langsam ![]() |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Huch !!
Hoppla oh man ist das peinlich ![]() Danke leute ! Doch wurde nur das Problem mit der Doppelerscheinung gelöst. Doch Die vorgehende sphere bleibt immer noch stehen. Nur warum ? |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ähmm ja ? Wüsste da einer woran das liegt ?
Nochmal das Problem : Sobald eine neue sphere erstellt wurde, verfolgt mich immer nur diese Spere. Und die anderen zuvor erstellten spheren bleiben stehen. (einfach Geil zu erklären... ) Hmm bitte nicht schimpfen aber ich stelle hier mal den ganzen quellcode rein: Ihr könnt wenn Ihr wollt, den code via strg + c und v in eurer bb einfügen und selbst sehen was da passiert. Also bitte fallt mir nicht an die Gurgel, denn ich weis echt nicht woran das liegt. Code: [AUSKLAPPEN] Graphics3D 800,600,16 SetBuffer BackBuffer() ;constanten Const TYPE_PLAYER = 1,TYPE_ANT = 2,TYPE_BAU = 3 ;globale Global bau_counter = 0,sammler_temp# = 0 Global bau_able = False Global info.ant,ant ;------------------------------ Type ant Field ax Field ay Field az Field entity End Type ;licht Global light = CreateLight() RotateEntity light,90,0,0 ;der spieler Global player = CreateSphere() PositionEntity player,0,1,0 ScaleEntity player,2,2,2 EntityType player,TYPE_PLAYER EntityColor player,255,0,0 ;die camera Global camera = CreateCamera() PositionEntity camera,0,8,-10 TurnEntity camera,20,0,0 ;terrain Global terr = CreateTerrain(128) EntityColor terr,0,80,0 PositionEntity terr,-30,0,-20 ;bau Global bau = CreateCube() ScaleEntity bau,2,2,2 EntityType bau,TYPE_BAU EntityColor bau,255,0,0 PositionEntity bau,10,2,15 Collisions TYPE_PLAYER,TYPE_BAU,2,1 ;//////////////////HAUPTSCHLEIFE\\\\\\\\\\\\\\\\\ While Not KeyHit(1) update_player() update_camera() update_ant() ants_create() UpdateWorld RenderWorld Text 10,100, "bauzeit:" + bau_counter Flip Wend End ;--------------------------------- Function update_player() If KeyDown(200) Then MoveEntity player,0,0, 1 If KeyDown(208) Then MoveEntity player,0,0,-1 If KeyDown(203) Then TurnEntity player,0, 2,0 If KeyDown(205) Then TurnEntity player,0,-2,0 End Function ;--------------------------------- Function update_camera() EntityParent(camera),player,0 End Function ;--------------------------------- Function ants_create() If EntityCollided(player,type_bau) Then bau_able = True If bau_able = True Then bau_counter = bau_counter +1 ;bauzeit ;wenn Bauzeit 100 ant erstellen If bau_counter >= 100 Then bau_counter = 0 ;bauprozess zu ende bau_able = False ;bau stoppen info.ant = New ant ;ameise erstellen info\ax = ax info\ay = ay info\az = az For info.ant = Each ant info\entity = CreateSphere() EntityType info\entity,TYPE_ANT EntityColor info\entity,0,100,100 PositionEntity info\entity, info\ax,info\ay+1,info\az+10 ;ameise setzten Next End If End Function ;--------------------------------- ;--------------------------------- Function update_ant() For info.ant = Each ant PointEntity info\entity,player,1 If EntityDistance(info\entity,player) >2 Then MoveEntity info\entity,0,0,0.5 Next End Function Hinweis: Um die spheren zu erstellen einfach kurz gegen die Rote box fahren. Ich dank euch schon mal imm vorraus !!!!!! mfg Dottakopf |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
So was nennt man pushen, und das mögen wir gar nicht. Lass das bitte in Zukunft (das nächste mal werde ich schliessen).
Zu deinem Problem: Du erstellst in ants_create() eine neue ant und weisst ihr eine Position zu. Mir unverständlicherweise gibst du ihr jedoch dann keine Sphere mit sondern iterierst durch alle vorhandenen instancen und erstellst dort spheres. Lassv die unsinnige for-each dort weg und es läuft. (PS: Debugging hift da enorm.) |
||
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 |
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke für deine Hilfe, es hat funktioniert! ![]() Des mit dem Pushen tut mir leid und kommt auch nicht mehr vor ! mfg Dottakopf |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group