If-Abfragen vereinfachen

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:   

If-Abfragen vereinfachen

Beitrag von Mok »

Hi!
Ich gehe mal daveon aus, dass wenige wissen, was VMT ist, daher führe ich euch mal ein:
Ich programmiere für die Source-Mappercommunity auf www.mapping-tutorials.de (bissi Werbung:D) ein Programm, mit dem man VMT komfortabel und einfach machen kann (sozusagen ein "Baukasten"). VMTs sind kleine Files, die der Map-Compiler braucht. In den VMTs steht der Pfad der Textur und vieles mehr. Unter anderem steht auch die Materialeigenschfat, wie z.B. Metall oder Holzkiste drin. (In meinem Programm einfach eine Listview, wo man eine der unten gezeigten auswählen kann, danach schreibt das Programm die Eigenschaft n die VMT-Datei)
Nun zum Problem: das sind ganze 82 Einträge, und ich will keinen If- oder Case/Select-Wirbel mit 82 Abfragen haben :?
Geht das einfacher?
An Arrays hab ich schon gedacht, nur Wenn man für jedes s.g. "Surfaceprop" eine Variable macht, hat man ja einen schönen Klopfer.

Ach ja, hier ist mal die Liste:

Code: Alles auswählen

; surfaceprops library
;

      AddGadgetItem(#Listview_0,0,"<Kein surfaceprop>")
      AddGadgetItem(#Listview_0,1, "SurfaceProp.baserock")
      AddGadgetItem(#Listview_0,2, "SurfaceProp.boulder")
      AddGadgetItem(#Listview_0,3, "SurfaceProp.brick")
      AddGadgetItem(#Listview_0,4, "SurfaceProp.concrete")
      AddGadgetItem(#Listview_0,5, "SurfaceProp.concreteblock")
      AddGadgetItem(#Listview_0,6, "SurfaceProp.gravel")
      AddGadgetItem(#Listview_0,7, "SurfaceProp.rock")
      AddGadgetItem(#Listview_0,8, "SurfaceProp.slime")
      AddGadgetItem(#Listview_0,9, "SurfaceProp.water")
      AddGadgetItem(#Listview_0,10,"SurfaceProp.wade")
      AddGadgetItem(#Listview_0,11,"SurfaceProp.canister")
      AddGadgetItem(#Listview_0,12,"SurfaceProp.chain")
      AddGadgetItem(#Listview_0,13,"SurfaceProp.chainlink")
      AddGadgetItem(#Listview_0,14,"SurfaceProp.combine_metal")
      AddGadgetItem(#Listview_0,15,"SurfaceProp.crowbar")
      AddGadgetItem(#Listview_0,16,"SurfaceProp.floating_metal_barrel")
      AddGadgetItem(#Listview_0,17,"SurfaceProp.grenade")
      AddGadgetItem(#Listview_0,18,"SurfaceProp.gunship")
      AddGadgetItem(#Listview_0,19,"SurfaceProp.metal")
      AddGadgetItem(#Listview_0,20,"SurfaceProp.metal_barrel")
      AddGadgetItem(#Listview_0,21,"SurfaceProp.metal_bouncy")
      AddGadgetItem(#Listview_0,22,"SurfaceProp.metal_box")
      AddGadgetItem(#Listview_0,23,"SurfaceProp.metal_barrel")
      AddGadgetItem(#Listview_0,24,"SurfaceProp.metal_seafloorcar")
      AddGadgetItem(#Listview_0,25,"SurfaceProp.metalgrate")
      AddGadgetItem(#Listview_0,26,"SurfaceProp.metalpanel")
      AddGadgetItem(#Listview_0,27,"SurfaceProp.metalvent")
      AddGadgetItem(#Listview_0,28,"SurfaceProp.metalvehicle")
      AddGadgetItem(#Listview_0,29,"SurfaceProp.paintcan")
      AddGadgetItem(#Listview_0,30,"SurfaceProp.popcan")
      AddGadgetItem(#Listview_0,31,"SurfaceProp.slipperymetal")
      AddGadgetItem(#Listview_0,32,"SurfaceProp.solidmetal")
      AddGadgetItem(#Listview_0,33,"SurfaceProp.strider")
      AddGadgetItem(#Listview_0,34,"SurfaceProp.weapon")
      AddGadgetItem(#Listview_0,35,"SurfaceProp.brakingrubbertire ")
      AddGadgetItem(#Listview_0,36,"SurfaceProp.cardboard")
      AddGadgetItem(#Listview_0,37,"SurfaceProp.carpet")
      AddGadgetItem(#Listview_0,38,"SurfaceProp.ceiling_tile")
      AddGadgetItem(#Listview_0,39,"SurfaceProp.combine_glass")
      AddGadgetItem(#Listview_0,40,"SurfaceProp.computer")
      AddGadgetItem(#Listview_0,41,"SurfaceProp.default")
      AddGadgetItem(#Listview_0,42,"SurfaceProp.default_silent")
      AddGadgetItem(#Listview_0,43,"SurfaceProp.floatingstandable")
      AddGadgetItem(#Listview_0,44,"SurfaceProp.glass")
      AddGadgetItem(#Listview_0,45,"SurfaceProp.glassbottle")
      AddGadgetItem(#Listview_0,46,"SurfaceProp.item")
      AddGadgetItem(#Listview_0,47,"SurfaceProp.jeeptire")
      AddGadgetItem(#Listview_0,48,"SurfaceProp.ladder")
      AddGadgetItem(#Listview_0,49,"SurfaceProp.no_decal")
      AddGadgetItem(#Listview_0,50,"SurfaceProp.paper")
      AddGadgetItem(#Listview_0,51,"SurfaceProp.papercup")
      AddGadgetItem(#Listview_0,52,"SurfaceProp.plaster")
      AddGadgetItem(#Listview_0,53,"SurfaceProp.plastic_barrel")
      AddGadgetItem(#Listview_0,54,"SurfaceProp.plastic_barrel_buoyant")
      AddGadgetItem(#Listview_0,55,"SurfaceProp.plastic_box")
      AddGadgetItem(#Listview_0,56,"SurfaceProp.plastic")
      AddGadgetItem(#Listview_0,57,"SurfaceProp.player")
      AddGadgetItem(#Listview_0,58,"SurfaceProp.player_control_clip")
      AddGadgetItem(#Listview_0,59,"SurfaceProp.pottery")
      AddGadgetItem(#Listview_0,60,"SurfaceProp.rubber")
      AddGadgetItem(#Listview_0,61,"SurfaceProp.rubbertire")
      AddGadgetItem(#Listview_0,54,"SurfaceProp.slidingrubbertire")
      AddGadgetItem(#Listview_0,55,"SurfaceProp.slidingrubbertire_front")
      AddGadgetItem(#Listview_0,56,"SurfaceProp.slidengrubbertire_rear")
      AddGadgetItem(#Listview_0,57,"SurfaceProp.alienflesh")
      AddGadgetItem(#Listview_0,58,"SurfaceProp.antlion")
      AddGadgetItem(#Listview_0,59,"SurfaceProp.armorflesh")
      AddGadgetItem(#Listview_0,60,"SurfaceProp.bloodyflesh")
      AddGadgetItem(#Listview_0,61,"SurfaceProp.flesh")
      AddGadgetItem(#Listview_0,62,"SurfaceProp.foliage")
      AddGadgetItem(#Listview_0,63,"SurfaceProp.watermelon")
      AddGadgetItem(#Listview_0,64,"SurfaceProp.zombieflesh")
      AddGadgetItem(#Listview_0,65,"SurfaceProp.ice")
      AddGadgetItem(#Listview_0,66,"SurfaceProp.snow")
      AddGadgetItem(#Listview_0,67,"SurfaceProp.antilonsand")
      AddGadgetItem(#Listview_0,68,"SurfaceProp.dirt")
      AddGadgetItem(#Listview_0,69,"SurfaceProp.grass")
      AddGadgetItem(#Listview_0,70,"SurfaceProp.mud")
      AddGadgetItem(#Listview_0,71,"SurfaceProp.quicksand")
      AddGadgetItem(#Listview_0,72,"SurfaceProp.sand")
      AddGadgetItem(#Listview_0,73,"SurfaceProp.slippyslime")
      AddGadgetItem(#Listview_0,74,"SurfaceProp.tile")
      AddGadgetItem(#Listview_0,75,"SurfaceProp.wood")
      AddGadgetItem(#Listview_0,76,"SurfaceProp.wood_box")
      AddGadgetItem(#Listview_0,77,"SurfaceProp.wood_crate")
      AddGadgetItem(#Listview_0,78,"SurfaceProp.wood_furniture")
      AddGadgetItem(#Listview_0,79,"SurfaceProp.wood_lowdensity")
      AddGadgetItem(#Listview_0,80,"SurfaceProp.wood_plank")
      AddGadgetItem(#Listview_0,81,"SurfaceProp.wood_panel")
      AddGadgetItem(#Listview_0,82,"SurfaceProp.wood_solid")
Hinzu kommt, dass die Einträge nicht Code-intern sind, sondern in einer Includefile im selben Verzeichnis liegen (damit mein Code noch übersichtlich und nicht so lange ist). Wenn ich die Datei importere, stehen die Einträge aber nicht in der oben gezeigten Reihenfolge, obwohl die Zahl (2. Prarameter) doch absteigend geordnet sind.

MfG, Mok

P.S.: Ja, ich hab nochimmer v3.94, da aucf meinem PC v4.x nicht ganz einwandfrei funzt.
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 »

> An Arrays hab ich schon gedacht, nur Wenn man für jedes s.g. "Surfaceprop" eine Variable macht, hat man ja einen schönen Klopfer.

und wie nennst du das was du jetzt hast?
das wird doch eine Apokalyptische Armee von Klopfern!

also ernsthaft. du hast dort 82 items mit fortlaufenden nummern.
das schreit geradezu nach einem Structured Array.
du kannst die Items fortlaufend nummerieren,
die Namen und Eigenschaften aus ner Datei holen,
in deinem If/Select brauchst du nur die NUMMER prüfen und hast die zuordnung,
was könnte es einfacheres geben?
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 »

Entweder verstehe ich dich flasch, oder du mich...

Die Eigenschaften in einer VMT sehen so aus:

Code: Alles auswählen

"$surfaceprop" "wood_crate"
Das Programm prüft, wenn man einen Button drückt, welcher Eintrag markiert wurde, und schreibt dann z.B. bei '19' "$surfaceprop" "metal" in die VMT.
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 »

dann versteh ich dein problem echt nich.

wozu musst du dann überhaupt was vergleichen?

du hast den string komplett als Item dastehen.
nimm das angeklickte item, fuzzel den string auseinander und schreib ihn in die VMT, egal was drin steht.
wenn dein Programm sonst nix damit machen muss, ist es doch unwichtig,
ob das nun "wood_crate", "zombieflesh" oder "papa_smurf_blue" heißt.
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 »

naja, aber ich muss doch prüfen, welcher eintrag (0-82) ausgewählt wurde (bedeutet schon einmal ein riesiger If-Block), dann muss ich mittels GetGadgetItemText() nur noch den Text ermitteln.
Ich weiß nicht genau, welche Befehle da nötig sind aber ich muss abprüfen

Code: Alles auswählen

If Eintrag 1 wurde gewählt
  <In die VMT schreiben, was im Eintrag 1 steht>
ElseIf Eintrag 2 wurde gewählt
  <In die VMT schreiben, was im Eintrag 2 steht>
Und das 83 mal :shock:
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
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Mok hat geschrieben:naja, aber ich muss doch prüfen, welcher eintrag (0-82) ausgewählt wurde (bedeutet schon einmal ein riesiger If-Block), dann muss ich mittels GetGadgetItemText() nur noch den Text ermitteln.
Ich weiß nicht genau, welche Befehle da nötig sind aber ich muss abprüfen

Code: Alles auswählen

If Eintrag 1 wurde gewählt
  <In die VMT schreiben, was im Eintrag 1 steht>
ElseIf Eintrag 2 wurde gewählt
  <In die VMT schreiben, was im Eintrag 2 steht>
Und das 83 mal :shock:
Dann brauchst Du doch nur ein gutes Array und eine Schleife von 1 bis 83
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

nein, du musst nur
- prüfen "irgendein eintrag gewählt"
- eintrag holen
- in VMT schreiben

für den vorgang ist es dir völlig schnuppe, um welchen eintrag es sich handelt.

falls das aus irgendwelchen gründen doch nicht egal ist, dann nimm halt ein Array.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Einfach 'GetGadgetText(#Gadget)' oder 'GetGadgetItemText(#Gadget, GetGadgetState(#Gadget))'.
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 »

Ok, ich werds dann mal probieren.

Wie kann ich die Einträge in der richtigen Reihenfolge machen? also so, wie's oben steht, weil bei mir sieht's so aus:
Bild
(Wer's nicht bemerkt: In der Liste steht z.B. wood_panel ganz unten. Im Fenster jedoch nicht)
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
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Beitrag von Sven »

Mok hat geschrieben:(Wer's nicht bemerkt: In der Liste steht z.B. wood_panel ganz unten. Im Fenster jedoch nicht)
Wer's nicht bemerkt, Du fängst nach >>61,"SurfaceProp.rubbertire"<< wieder mit >>54,"SurfaceProp.slidingrubbertire"<< an. Klar kommt da die Liste durcheinander. Einträge fügt man am besten mit -1 am Ende der Liste ein.

Wenn die Daten als DATA in einer Include stehen, hol die doch mit einer FOR-NEXT in die Liste. Dann lassen sich auch Änderungen besser einpflegen.
Antworten