Seite 1 von 3

°GELÖST° "Die folgende Variable hat eine Structure: 'WT

Verfasst: 27.02.2009 17:18
von Mok
Servus!

Ich hab mein Aimer-Projekt wiederaufgenommen, und gleich ein wenig ausgebaut: Man kann nun am Anfang zwischen 3 Waffen wählen (Glock [Glock 19], ak74 [AK-74], Pump [Pumpgun])
Ich dachte mir zur einfacheren Handhabung mach ich da ne Structure, wo das ganze Klump gepeichert wird:

Code: Alles auswählen

WType.s = ""
ShotsLeft = Magazine

;-STRUKTUREN
Structure Weapons
  Magazine.b
  ShootSound.s
  DrySound.s
  MuniSprite.s
  TickShot.b
  TickDry.b
  TickReload.b
EndStructure

Global ak74.Weapons, pump.Weapons, glock.Weapons

;PUMPGUN SETTINGS
Pump\Magazine = 8
ShotsLeft = Pump\Magazine
Pump\TickShot = 10
Pump\TickDry = 2
Pump\TickReload = 17

;AK74 SETTINGS
AK74\Magazine = 30
ShotsLeft = AK74\Magazine
AK74\TickShot = 2
AK74\TickDry = 3
AK74\TickReload = 23

;GLOCK 19 SETTINGS
Glock\Magazine = 30
ShotsLeft = Glock\Magazine
Glock\TickShot = 7
Glock\TickDry = 3
Glock\TickReload = 10
Der Name der Waffe (siehe oben, also z. B. "glock" oder "pump") wird in dem String WType.s gespeichert (deshalb String, weil ich Dateien lade wie "pump_shot.wav" und somit WType$+"_shot" beutzen kann). Wenn ich aber nachher z. B. den TickDry von der Waffe WType auslesen will und

Code: Alles auswählen

TimeCounter = WType$\TickShot
schreibe bekomme ich den Fehler. :|
Warum?

MfG, Mok

Edit
Bild

Verfasst: 27.02.2009 17:28
von ts-soft
WType$ und WType.s sind unterschiedliche Variablen und haben beide
keine Strukture

Die Fehlermeldung ist aber ein bissel doof :wink:

Verfasst: 27.02.2009 17:33
von Mok
ts-soft hat geschrieben:WType$ und WType.s sind unterschiedliche Variablen und haben beide
keine Strukture
Aber Variable1$ und Variable1.s ist doch in PB dasselbe (beides String, oder nich :?
Außerdem: Warum sollte(n) die ne Struct haben? Sie wurde(n) doch vorher schon (ausserhalb der Struct) deklariert

Verfasst: 27.02.2009 17:39
von Andesdaf
Mok hat geschrieben:Aber Variable1$ und Variable1.s ist doch in PB dasselbe (beides String, oder nich :?
Nein. Variable$ ist immer mit Dollar und hat mit Variable1.s nichts zu tun.

Verfasst: 27.02.2009 17:45
von DarkDragon
Zur Verdeutlichung:

Code: Alles auswählen

abc.s = "Hallo"
abc$ = "Welt"
Debug abc
Debug abc$
Es sind 2 Variablen (Beide String) nur werden sie unterschiedlich gehandhabt.

Und man kann nicht einfach

Code: Alles auswählen

Structure STRUKTUR
  a.l
EndStructure
Global test.STRUKTUR

Blah$ = "test"
Debug Blah$\a
Machen, da die Namen ja nach dem kompillieren garnichtmehr existieren.

Verfasst: 27.02.2009 18:18
von Kaeru Gaman
die zweite Hälfte von Didis Post ist die eigentliche Antwort.
man kann einen String nicht als Variablennamen verwenden.

dass Bla$ und Bla.s zwei verschiedene Variablen sind, ist natürlich auch so.
der erste Name hat vier Zeichen, der Zweite nur drei, also wie könnten die identisch sein?


für solche strukturierten objekte musst du Arrays oder Listen anlegen:

Code: Alles auswählen

;-STRUKTUREN
Structure Weapons
  Name.s
  Magazine.b
  ShootSound.s
  DrySound.s
  MuniSprite.s
  TickShot.b
  TickDry.b
  TickReload.b
EndStructure

Global Dim Guns.Weapons(2)

;PUMPGUN SETTINGS
Guns(0)\Name = "Pumpgun"
Guns(0)\Magazine = 8
Guns(0)\TickShot = 10
Guns(0)\TickDry = 2
Guns(0)\TickReload = 17

;AK74 SETTINGS
Guns(1)\Name = "AK74"
Guns(1)\Magazine = 30
Guns(1)\TickShot = 2
Guns(1)\TickDry = 3
Guns(1)\TickReload = 23

;GLOCK 19 SETTINGS
Guns(2)\Name = "Glock 19"
Guns(2)\Magazine = 30
Guns(2)\TickShot = 7
Guns(2)\TickDry = 3
Guns(2)\TickReload = 10 
und es bringt nichts, ShotsLeft= bei der initialisierung der Waffentypen einzusetzen.
das muss in die Routine wo er die Waffen wechselt, bzw. wo er nachlädt.

Verfasst: 27.02.2009 18:28
von Mok
Kaeru Gaman hat geschrieben: das muss in die Routine wo er die Waffen wechselt, bzw. wo er nachlädt.
Die Waffe kann man nur ganz am Anfang auswählen

Edit
was muss ich jetzt mit 'Name' machen? Soll ich alle WTypes durch Name.s\XXX ersetzen?

Verfasst: 27.02.2009 18:40
von Kaeru Gaman
Mok hat geschrieben:Edit
was muss ich jetzt mit 'Name' machen? Soll ich alle WTypes durch Name.s\XXX ersetzen?
guck in meinen code!

name.s\XXX GEHT NICHT!
Kaeru Gaman hat geschrieben:man kann einen String nicht als Variablennamen verwenden.


> Die Waffe kann man nur ganz am Anfang auswählen

na und?
aber nachladen kann man doch?

also muss dein
ShotsLeft = Guns( ChosenWeapon )\Magazine
in deine Nachladeroutine

Verfasst: 27.02.2009 21:37
von Mok
Ich würde ja gerne probieren, ob's geht, aber bei ExamineKeyboard() und ExamineMouse() haut's mich immer raus (reimt sich sogar <) )
Hier ein Snippet:
cont ist kurz für continue, was ich nicht benutzen konnte, da es ein Schlüsselwort ist:

Code: Alles auswählen

While cont = 0
  
  If ExamineKeyboard() = 0 Or ExamineMouse() = 0 ;Eines der Beiden oder beides ist NULL (warum?)
    CloseScreen()
    MessageRequester("Info","Fehler!",0)
    End
  EndIf
  
  MouseX = MouseX() : MouseY = MouseY()
  
  DisplayTransparentSprite(1,0,0);
  DisplayTransparentSprite(2,500,200);
  DisplayTransparentSprite(3,800,400);
  DisplayTransparentSprite(012,MouseX(),MouseY());
  
  If MouseButton(#PB_MouseButton_Left)
    WType.s = "ak74"
    ChosenGun = 0
    cont = 1
  EndIf
  
  If MouseButton(#PB_MouseButton_Right)
    WType.s = "glock"
    ChosenGun = 2
    cont = 1
  EndIf
  
  If MouseButton(#PB_MouseButton_Middle)
    WType.s = "pump"
    ChosenGun = 1
    cont = 1
  EndIf
  
  StartDrawing(ScreenOutput())
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawingFont(fontID)
      DrawText(5,20,Str(coll),RGB(255,255,255))    
    DrawText(5,5,"ESC - Beenden" )
  StopDrawing()
  
  FlipBuffers()
  
  If KeyboardPushed(#PB_Key_Escape)
    End
  EndIf
  
Wend
Edit
Ja, ich habe zuvor InitSprite() und OpenScreen() aufgerufen

Verfasst: 27.02.2009 21:46
von Kaeru Gaman
> If ExamineKeyboard() = 0 Or ExamineMouse() = 0

hier brauchst du keinen Rückgabewert prüfen.
du brauchst nur beide inits benutzen.

prüfen tust du dann die Rückgabewerte der Auswertungsfunktionen...


und wenn du die rückgaben von MouseX() und MouseY() schon zwischenspeicherst,
solltest du im Display auch die Variablen und nicht die Funktionen verwenden.


und wenn du das Cont Flag innerhalb der Schleife setzt,
solltest du es am ende der schleife abfragen nicht am anfang,
also Repeat:Until verwenden.