Det här med script-språk är ingen lätt sak, och det finns inget standardsvar som passar alla situationer.
Det viktigtaste i sammanhanget är att
väldigt precis definiera vad man vill få ut av scriptspråket, vad man vill använda det till, och först därefter se till vilken lösning som passar bäst i just detta specifika fall(oavsett om det är en egenkonstruerad, off-the-shelf eller ett mellanting). Man kommer inte att använda samma scriptspråk till alla projekt, och man kommer inte att använda samma format för att lagra all data för sitt projekt.
Det är viktigt att skilja mellan
data-definition och
scriptning. Att använda ett fullfjädrat script-språk i ett sammanhang där man egentligen bara är ute efter att definiera data är en säker väg till kaos - speciellt om man är flera personer inblandade. När jag jobbade på Tycoon City: New York, fick jag surt erfara effekterna av detta, vilket kanske var rätt åt mig eftersom det var jag som valt att använda LUA flera år tidigare, den första vändan jag jobbade på företaget. Med tiden hade det hela växt till ett riktigt monster, så det var näst-intill omöjligt att göra nåt så enkelt som att debugga inladdningen av en modell och dess material, i alla hopp mellan lua-kod och host-funktioner. Och laddningen var hur långsam som helst - tror det tog ca 15 minuter att ladda upp en level.
Att definiera data externt, utanför källkoden, kan förstås vara praktiskt ibland... Om man är flera personer som jobbar på projektet, och en del av dem inte är programmerare, t.ex. Men det är viktigt att tänka på vad det är för data, och hur man vill jobba med den... Om datamängden är stor, eller den inte behöver kunna redigeras för hand, då är ju ett binärt format det bästa - snabbare laddning är trevligt bara det. Att ha en specialskriven editor för att redigera datafiler är ett måste om man har störe team med många som jobbar med det - annars kommer det garanterat att uppstå fel. Men för de tillfällen då man inte har resurser för att skriva och underhålla en specialeditor, och behöver externt lagrad data som kan editeras för hand, är ju nån slags text-baserat format lösningen. Man kan ju använda något enkelt, som gamla ini-filer, men det blir knöligt att uttrycka hierarkiska samband. XML är en kanonbra lösning för detta, då det är en standardiserad form för att uttrycka data och dess relationer. XML är dock ett långsamt format, och blir ännu värre om man använder DOM-läsare som TinyXML, som läser in hela filen och skapar en trädstruktur. Använd en SAX parser istället, som läser lite i taget och låter anroparen sköta lagringen. Mer om det här:
http://www.tophatarcade.com/dev/article ... medata.phpNär jag jobbade med Hospital Tycoon, så använde vi XML som scriptspråk. Vi började med att använda det för att låta våra designers beskriva patientbehandlingsprocesserna (vilken ordning olika behandlingssteg skulle utföras). De behövde dock mer och mer kontroll, till den grad att de ville kunna ange positioner och animationer för alla aktörer (patient/personal/maskiner/behandlingsrum etc) i en process, och göra saker som att upprepa vissa steg tills ett visst villkor var uppfyllt. Dessa utökade krav kom steg för steg (eftersom mycket av designarbetet gjordes on-the-fly, då vi var sena med projektet innan vi hade börjat på det), så vi gick från enkel, strukturerad databeskrivning, till ett primitivt med kraftfullt scriptspråk. Det fungerade i slutändan ganska bra, men det var svårt att debugga, och vi behövde hela tiden fixa till olika speciallösningar. Så hade det varit bättre att t.ex. använda LUA? Antagligen inte, eftersom ingen av de som skrev scripten var programmerare - de hade fullt upp med att lära sig dom väldigt specifika "kommandon" som vi skapade specifikt för deras behov i vårt "script"-språk - att de dessutom skulle ha behövt lära sig ens ett minimum av specifika LUA koncept hade varit orimligt inom den tid vi hade.
Om jag hade vetat i början vart vi skulle hamna med script-språket på Hospital Tycoon, då skulle jag antingen ha tilldelat en av mina programmerare till att vara exklusivt patientprocess-programmerare under hela projektet - att jobba direkt med designersarna och skriva processerna i C++, eller också ha valt att skriva ett eget, specialiserat scriptspråk för att hantera patientprocesser. För om man ska ha ett scriptspråk för att låta icke-programmerare kontrollera funktionalitet, då ska det vara ett språk som är specifikt anpassat för ändamålet i fråga. Ett generellt script-språk som t.ex. LUA är något man programmerar i, och därför kräver programmerare, och det kommer aldrig att bli lika anpassat för en specifik problemdomän, och därmed inte heller lika lätt att använda för icke-programmerare, som ett specialskrivet språk.
Det är ju också så, att script-språk har sällan eller aldrig samma kraftfulla debugging möjligheter som t.ex. Visual Studio, så innan man bestämmer sig för att ha externt definierad kod (snarare än bara externt definierad data), bör man ta sig en rejäl funderare på
varför, och
vem som i så fall ska skriva koden. När jag jobbade på Heart of Empire:Rome, så hade vi samma LUA-drivna spelmotor som för Tycoon City:New York - men vi hade inga scriptare anställda för projektet, så det blev programmerarna som fick skriva den spel-specifika koden i LUA. Och dom verkligen hatade det, eftersom dom inte hade samma debugging möjligheter som i C++, och eftersom de inte var lika hemma i LUA som språk. I det fallet fanns det ingen som helst fördel att använda LUA för att scripta scenarion - det hade varit mycket bättre att bara "hårdkoda" dem i spelkoden. Tycoon City-projektet, som ju använde samma motor, använde dock inte LUA för att scripta scenarion (utan bara som datalagringsformat) - där använde man istället Visio (diagramritningsprogram från office-paketet) för att rita upp flödesscheman över scenarion, som sen lästes in av spelet och tolkades om till instruktioner - detta funkade mycket bättre, då designersarna själva kunde arbeta med det.
Om man bara är
en ensam programmerare , så är det ofta ingen mening med att använda externa data-definitoner: lägg in det som statiska arrayer/variabler i C++ koden, använd "Edit-and-continue", och kom fort framåt på projektet. Och det finns i princip aldrig nån anledning att ha externt definierad script-kod - skriv funktionaliteten direkt i C++ iställer - det är så man kommer framåt och får till projekt som
gör något (t.ex. spelbara spel), och inte bara "frameworks" eller "motorer" eller annan tråkig teknologi som man ändå aldrig kommer att använda till nåt, eftersom det är för klumpigt, tråkigt och besvärligt att skapa de script som behövs för att fylla dem med innehåll...
