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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

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

Beitrag 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
Zuletzt geändert von Mok am 28.02.2009 14:25, insgesamt 1-mal geändert.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

WType$ und WType.s sind unterschiedliche Variablen und haben beide
keine Strukture

Die Fehlermeldung ist aber ein bissel doof :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Beitrag 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
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag 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.
Win11 x64 | PB 6.20
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Beitrag 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?
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Beitrag 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
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten