Problem mit indizierten Types

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Rongo Matane

Betreff: Problem mit indizierten Types

BeitragDo, Mai 17, 2007 17:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, vorweg schonmal sorry, falls es so einen Thread schon gibt, ich konnte mit der Suche nix finden.
Ich programmier gerade eine Art rennspiel, bei dem man auf der Autobahn gegen jmd anders fährt. Dort gibts natürlich auch Verkehr. Ich hatte das Spiel vor Jahren fertig, will a ber jetz quasi eine Neuauflage mit mehr Features machen.

Das ursprüngliche Problem war, dass ich die Types untereinander abfragen wollte, um Kollisionen zu prüfen. Nach kurzer Suche hab ich im Typetutorial von Lars Roth die Möglichkeit der Indizierung der Types entdeckt. Euch war das sicher schon vorher bekannt, und nun zu meinem jetzigen Probelm.
hier der Quallcodeauszug:

Code: [AUSKLAPPEN]
Type Tkfzdaten
Field typ
Field speed#
Field posy
Field varx#
Field skill#
Field character#
Field lane
Field road
End Type

Type Tkfz
Field kfz.Tkfzdaten
Field entries
Field curentry
End Type

Global kfzdb.Tkfz = New Tkfz
kfzdb\entries=0
kfzdb\curentry=0

Dim kfzdaten(4,3)
;(x,0) Name
;(x,1) Speed
;(x,2) width
;(x,3) length

kfzdaten(1,0)="Opel"
kfzdaten(1,1)=8
kfzdaten(1,2)=32
kfzdaten(1,3)=65

kfzdaten(2,0)="LKW"
kfzdaten(2,1)=5
kfzdaten(2,2)=50
kfzdaten(2,3)=140

Dim skill#(2)
Dim character#(2)

skill(0)=0.3;"bad"
skill(1)=0.2;"average"
skill(2)=0.1;"good"

character(0)=0.8;"slow"
character(1)=1;"normal"
character(2)=1.2;"aggressive"

Dim lane(3,1)

lane(0,0)=248   ;Standstreifen links
lane(1,0)=288
lane(2,0)=353
lane(3,0)=418
lane(0,1)=741  ;Standstreifen rechts
lane(1,1)=674
lane(2,1)=609
lane(3,1)=544


Tkfz ist sozusagen das Haupttype, wie oben zu sehen ist der Type in dem letztlich die daten wie speed gespeichert werden, ein field dieses Types. Naja, dann wird das Haupttype erstellt...

Code: [AUSKLAPPEN]
If KeyHit(2) Then
kfzdb\kfz.Tkfzdaten = Last Tkfzdaten
kfzdb\kfz.Tkfzdaten = New Tkfzdaten
kfzdb\curentry=kfzdb\entries+1
kfzdb\entries=kfzdb\entries+1
kfzdb\kfz\lane=Rand(1,3)
kfzdb\kfz\road=road
kfzdb\kfz\skill=skill(Rand(0,2))
kfzdb\kfz\character=character(Rand(0,2))
kfzdb\kfz\varx=(lanesize-kfzdaten(kfzdb\kfz\typ,2))/2
kfzdb\kfz\speed=8*kfzdb\kfz\character
kfzdb\kfz\posy=1024
EndIf


Das war eigentlich als Funktion gedacht, aber um Fehler auszuschlieen hab ichs wieder zurück in den Hauptteil genommen. Wenn die 1 gedrückt wird, soll ein Auto erstellt werden.

Code: [AUSKLAPPEN]
Text 1,1,Handle(kfzdb\kfz)

Text 1,20,kfzdb\entries


Das lass ich mir zum schluss anzeigen. die entries stimmen, die werden immer eins mehr. Aber das handle liefert nie was zurück, sprich der Auto-Type der erstellt werden sollte funktioniert nicht. ich hatte auch mal zum testen ein a?kfzdb\kfz\lane drin. Das a hatte immer die richtigen werte, also die wurden schon an die Variable übergeben. handle liefert aber nichts zurück.

Also, habt ihr eine Ahnung wo hier ein Fehler stecken könnte? Thx schonmal im Voraus^^

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Mai 17, 2007 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne jetzt meine Hand aufs Feuer zu legen, würde ich mal folgendes machen:

Code: [AUSKLAPPEN]
If KeyHit(2) Then
 kfzdb\kfz.Tkfzdaten=New Tkfzdaten
 kfzdb\curentry=kfzdb\entries+1
 kfzdb\entries=kfzdb\entries+1
 kfzdb\kfz\lane=Rand(1,3)
 kfzdb\kfz\road=road
 kfzdb\kfz\skill=skill(Rand(0,2))
 kfzdb\kfz\character=character(Rand(0,2))
 kfzdb\kfz\varx=(lanesize-kfzdaten(kfzdb\kfz\typ,2))/2
 kfzdb\kfz\speed=8*kfzdb\kfz\character
 kfzdb\kfz\posy=1024
 id=Handle(kfz)
EndIf

Es geht darum, Blitz zu sagen, dass diesem Type keine Handlenummeränderung mehr vorzunehmen darf (was zB dann passiert, wenn mit Delete ein Eintrag irgendwo in der Liste gelöscht wird). Mit dem Aufruf von ''Handle(kfz)'' wird jegliche Handlenummeränderung für später unterbunden. Es bleibt also jede Typehandlenummer für immer bestehen. Dabei ist die Variable (in diesem Fall) id, nicht weiter wichtig, wenn später nicht genau auf dem Typeeintrag zugegriffen werden muss (was aber eher selten ist).

Du musst übrigens nicht vor jedem New ein Last einsetzen. Daher kann die Zeile ''kfzdb\kfz.Tkfzdaten=Last Tkfzdaten'' weg.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Rongo Matane

BeitragDo, Mai 17, 2007 21:53
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, das mit dem last hatte ich auch erst auskommentiert, aber war mir nich ganz sicher^^

das mit dem handle (kfz) funzt nich, da das ja ein field von kfzdb is, es funzt wenn ich id=handle(kfzdb\kfz) schreib, aber autos fahren trotzdem keine, was aber garantiert an dem Type liegt. ich hab ne frühere Version in der Autos gefahren sind, da gabs aber auch noch keinen kfzdb Type.

Ich erklär nochmal kurz was ich bezwecken möchte:
Es gibt beliebig viele Autos, die alle eine Instanz des Types kfzdaten (als kfz) sind. Diese Types hab ich in einem Type, das es nur ein mal gibt, dem kfzdb als Eintrag, zusammen mit dem Primärschlüssel/Index oder wie mans nennen will.
So und nun soll jedes vorhandene Auto mit jedem überprüft werden und falss eine bestimmte Bedingung eintrifft soll zB Auto 32 das dem Auto 55 zu nah gekommen ist, seine geschwindigkeit verringern. Deshalb die Indizes, da ich genau ein bestimmtes Auto ansprechen muss.

Ums besser nachzuvollziehen hab ich mal den Quellcode hochgeladen
http://freenet-homepage.de/sp-illana/blubb.rar

normalerweise wäre alles bmp, aber wär zu viel speicher^^

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Mai 17, 2007 22:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn es nur darum geht, jedes Auto gegen jedes andere zu überprüfen, so würde ich es mit einer doppelt verschachtelten Typeschleife des gleichen Types machen. Trifft dann eine bestimmte Bedingung zu, so würde ich es direkt bearbeiten.

Logischer Aufbau Code: [AUSKLAPPEN]
For var1.Tkfz=Each Tkfz
 For var2.Tkfz=Each Tkfz
  If ErgebnisBeiderSchleifen <> Then
   Hier machen was man will
  End If
 Next
Next
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Rongo Matane

BeitragFr, Mai 18, 2007 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, die Variante würde funktionieren...aber die Autos haben alle die selbe bezeichnung, sprich kfz.Tkfzdaten. Deine Variante würde dann so aussehen:

Code: [AUSKLAPPEN]

For kfz.Tkfzdaten=Each Tkfzdaten
 For kfz.Tkfzdaten=Each Tkfzdaten
  If ErgebnisBeiderSchleifen <> Then
   Hier machen was man will
  End If
 Next
Next


An sowas hab ich auch gedacht, nur dacht ich nich das es möglich is.
Weil wenn ich dann meine Bedingung überprüft hab, wie will ich dann genau das eine Auto ansprechen? Könnte ja genausogut das andere sein...oder??? Eine Anweisung würde ja dann so aussehen:

Code: [AUSKLAPPEN]
if kfz\posy-kfz\posy<minimalerabstand then kfz\speed=kfzspeed-1


->sieht für mich so aus als würds nich funktionieren^^

Oder meinst du, dass ich jedes Auto anders bezeichnen soll, also kfz1.kfzdaten, kfz2.kfzdaten usw. ?
Wenn ja, dann wollte ich das ja über die Indizierung machen, an sich das selbe, nur das die Indizierung noch mehr Möglichkeitgen bietet.

Rongo Matane

BeitragFr, Mai 18, 2007 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
also ich hab mir mal das tutorial von the shadow für Types angeschaut. Ich denk das Problem is gelöst, ich werd das einfach über Handle lösen, so wie dus vorgeschlagen hattest. Ich wusste nich das die direkt durchnummeriert werden, da hätte ich mir den zweiten Type gleich sparen können^^
thx^^

EDIT: Ich hab den Fehler gefunden. Ich ahb den Type wieder rausgemacht udn dann gings auch nich, da ists mir aufgefallen: ich hab vergessen die eigenschaft kfz\typ zu füllen -> es wird nix gezeichnet. Ich hab das eingefügt und es funktioniert wunderbar^^. Ich werd die Indizierte Type-Version behalten, is bei den Abfragen besser^^

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group