Seite 1 von 2

If-Abfragen vereinfachen

Verfasst: 02.11.2008 17:13
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.

Verfasst: 02.11.2008 17:18
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?

Verfasst: 02.11.2008 17:24
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.

Verfasst: 02.11.2008 17:29
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.

Verfasst: 02.11.2008 18:50
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:

Verfasst: 02.11.2008 18:54
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

Verfasst: 02.11.2008 18:55
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.

Verfasst: 02.11.2008 18:57
von NicTheQuick
Einfach 'GetGadgetText(#Gadget)' oder 'GetGadgetItemText(#Gadget, GetGadgetState(#Gadget))'.

Verfasst: 02.11.2008 19:04
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)

Verfasst: 02.11.2008 19:28
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.