Problem mit indizierten Types
Übersicht BlitzBasic Beginners-Corner
Rongo MataneBetreff: Problem mit indizierten Types |
Do, Mai 17, 2007 17:32 Antworten mit Zitat |
|
---|---|---|
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^^ |
||
hecticSieger des IS Talentwettbewerb 2006 |
Do, Mai 17, 2007 21:18 Antworten mit Zitat |
|
---|---|---|
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 |
Do, Mai 17, 2007 21:53 Antworten mit Zitat |
|
---|---|---|
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^^ |
||
hecticSieger des IS Talentwettbewerb 2006 |
Do, Mai 17, 2007 22:11 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Mai 18, 2007 12:36 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Mai 18, 2007 16:25 Antworten mit Zitat |
|
---|---|---|
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^^ |
||
Übersicht BlitzBasic Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group