"Schlangen"-Problem

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

toni123

Betreff: "Schlangen"-Problem

BeitragDi, Nov 02, 2010 18:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute,

ich hab folgendes Problem. Ich möchte ein Objekt eines bestimmten Types im Punkt 0 erstellen. Dieses Objekt wird dann um 5 verschoben (eine sichtbare verschiebung). Wenn das Objekt bei 5 ist, wird ein Neues Objekt im Punkt 0 erstellt und anschliessend bewegen sich beide bis jetzt erstellte Objekte wieder um 5. Anschliessend wird wieder ein neues Objekt am Punkt 0 erstellt und die drei bewegen sich um 5 usw. Das ganze wird sooft gemacht, bis eine bestimmte anzahl Objekte entstanden ist und sich bewegt hat.
Ich habe für die bewegung mal einen Pseudocode geschrieben, bei dem Ich als Grundlage genommen habe, dass alle Objekte einen definierten Vorgänger und nachfolger haben. Dieser Code hinkt zwar ziemlich hinterher, aber ich habe bis jetzt keinen besseren Denkansatz.
Pseudocode:
Code: [AUSKLAPPEN]

Type Element
   Field entity
   Field nachfolger
End Type

Beliebig viele Elemente am Punkt 0 erstellen

///Pseudo///

Pivot am Punkt 0

Function Start(objekt)
bewege objekt um 0.1
Wenn EntityDistance(objekt, Pivot) = 5
Dann Bewegen(Nachfolger)
End Function

Function Bewegen(objekt)
bewege Objekt um 0.1
bewege Vorgänger um 0.1
Wenn EntityDistance(objekt, Pivot) = 5
Dann Bewegen(Nachfolger)
End Function



Und ein Ansatzcode für die Types:
Code: [AUSKLAPPEN]

Graphics3D 1440, 900
SetBuffer BackBuffer()

Local ms = MilliSecs()
Global Entfernung#


camera = CreateCamera()
PositionEntity camera, 0, 0, -50

Global test = CreateSphere()
PositionEntity test, 0, 0, 0


;Global test2 = CreateSphere()
;PositionEntity test2, 4, 0, 0

light = CreateLight(1)


Type Element
   Field entity
End Type

For i=0 To 10
Local a.Element
   a.Element = New Element
   a\entity= CreateSphere()
   ;PointEntity a\entity, test, 0
Next   
   

   
While Not KeyHit(1)
   
   MoveEntity First a.Element\entity, 0.1, 0, 0

RenderWorld
Flip
Wend


Bei diesem Code sagt er mir allerdings "Expecting Wend"

Hat jemand eine Idee wie ich mein Problem lösen könnte oder wie ich sinnvoller drangehe?

Viele Grüße

Toni

Xeres

Moderator

BeitragDi, Nov 02, 2010 18:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
MoveEntity First a.Element\entity, 0.1, 0, 0
... das geht so nicht. First erwartet den Namen der Type-Kollektion und liefert die erste Instanz.

Eher so:
Code: [AUSKLAPPEN]

a.Element = First Element
MoveEntity a\entity, 0.1, 0, 0

Bei Fehlermeldungen bitte generell den Debugger einschalten und die Fehlerhafte Zeile mit nennen - macht alles hier einfacher Wink

Da Types schon verkettete Listen sind, müsstest du nur mir Before und After arbeiten können; wenn du's anders machen willst, oder musst (mehrere Schlangen) kannst du auch Instanzen als Field Festlegen:

BlitzBasic: [AUSKLAPPEN]
Type Element
Field entity
Field nachfolger.Element
End Type
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

toni123

BeitragDi, Nov 02, 2010 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm,

das mit den Aufrufen werde ich wirklich mit Before und After machen, ich habe die Bewegung aller Teilchen jetzt einfach so gelöst, dass ich gesagt habe, jedes Objekt, dass nicht am Punkt 0 ist, soll bewegt werden.
Ich bekomme allerdings mit folgendem Code die Fehlermeldung "Index Variable is not a NewType"
Code: [AUSKLAPPEN]

Graphics3D 1440, 900
SetBuffer BackBuffer()

Local ms = MilliSecs()
Global Entfernung#


camera = CreateCamera()
PositionEntity camera, 0, 0, -50

Global test = CreateSphere()
PositionEntity test, 0, 0, 0


;Global test2 = CreateSphere()
;PositionEntity test2, 4, 0, 0

light = CreateLight(1)


Type Element
   Field entity
End Type

Local a.Element

For i=0 To 10
   a = New Element
   a\entity= CreateSphere()
   ;PointEntity a\entity, test, 0
Next   
   

   
While Not KeyHit(1)
   
   UpdateBlocks()
   
RenderWorld
Flip
Wend


Function UpdateBlocks()
   For a = Each Element
      If Not EntityX(a\entity) = 0
         MoveEntity a\entity, 0.1, 0, 0
      EndIf
   Next
End Function

faeX

BeitragDi, Nov 02, 2010 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Fehlerhafte Zeile mitnennen.

Edit: Du musst das a.Element nochmal Local in deiner Funktion definieren, da das Local a.Element im Hauptprogramm nicht bis in Funktionen hineinreicht.
 

toni123

BeitragDi, Nov 02, 2010 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
danke alter, klappt super
 

toni123

BeitragMi, Nov 03, 2010 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe nun einfach immer abgefragt, ob sich das objekt im Abstand 5 zum Nullpunkt befindet, und ob der Nachfolger sich am Nullpunkt befindet, wenn der Fall vorliegt, soll der nachfolger sich bewegen und das Objekt.
Allerdings liefert er mir die Fehlermeldung "Memory Acces Violation" zurück.

hat jemand eine Idee warum?

Code: [AUSKLAPPEN]

Graphics3D 1440, 900
SetBuffer BackBuffer()

Local ms = MilliSecs()
Global Entfernung#


camera = CreateCamera()
PositionEntity camera, 0, 0, -50

Global test = CreateSphere()
PositionEntity test, 0, 0, 0


;Global test2 = CreateSphere()
;PositionEntity test2, 4, 0, 0

light = CreateLight(1)


Type Element
   Field entity
End Type

Local a.Element

For i=0 To 10
   a = New Element
   a\entity= CreateSphere()
   PositionEntity a\entity, 0, 0, 0
Next

Local g.Element = First Element
PositionEntity g\entity, 5, 0, 0

   
While Not KeyHit(1)
   
   UpdateBlocks()
   
RenderWorld
Flip
Wend


Function UpdateBlocks()
   Local a.Element
   Local b.Element = After a
   
   For a = Each Element
      If Int(EntityDistance (test, a\entity)) = 5
         MoveEntity b\entity, 0.1, 0, 0
      EndIf
      If Not EntityX(a\entity) = 0
         MoveEntity a\entity, 0.1, 0, 0
      EndIf
   Next
End Function

Xeres

Moderator

BeitragMi, Nov 03, 2010 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
   Local a.Element
   Local b.Element = After a
Das ist nicht sinnvoll. Instanz a wird Local initialisiert mit NULL - dazu gibt es kein Objekt das danach kommen könnte.
Ferner iterierst du in a alle Elemente durch, und gibst aber das selbe nicht existente b bei den Bewegung an (MAV)...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

toni123

BeitragMi, Nov 03, 2010 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
alter, du bist super Wink Jetzt funktionierts endlich super, hab b einfach in der For / Next schleife definiert

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group