|
dev.gamez.lv Latvian Game Developers Community
|
View previous topic :: View next topic |
Author |
Message |
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Thu Mar 01, 2007 11:09 pm Post subject: Skripta valodas izveele |
|
Man vienam projektam vajadzeetu izveeleeties visatbilstoshaako skriptu valodu, bet peec ilgas lasiishanas iisti vairs nesaprotu, kuru izveeleeties.
Tipisks kods no taa, ko veelos sasniegt ir:
Code: | t=funkcija(2,player,player.health<4,player.XP>3);
foreach(t as x)
{
damage(x,8);
} |
Shis kods dara sekojosho: izveelas 2 speeleetaajus, kuru veseliiba ir mazaaka par 4 un XP lielaaks par 3 un katram no vinjiem nodara 8 bojaajumus.
Iisti nezinaaju, kaa savaadaak to kodu pierakstiit.
Kas man vajadziigs ir: pirmais funkcijas parametrs ir speeleetaaju skaits, tachu tas var buut arii keywords (C++ tas buutu typedef enum) enemy|ally un to kombinaacijas (piemeeram - enemy and ally). Attieciigi, funkcijai ar typeof buutu jaanosaka, kaads ir parametra tips. Treshais, ceturtais utt. ir kriteerijs, peec kuriem tiek atlasiiti speeleetaaji (parametru skaits neierobezhots, C++ tas buutu - ...).
Taatad kas man ir vajadziigs - weak typings (AngelScript uzreiz atkriit). Keywordu atbalsts (iisti nevareeju atrast manuaaljos kautko taadu). Nenoteikts parametru skaits (ja shis galiigi nav iespeejams, tad varu tos parametrus salikt vienaa stringaa un peec tam ar roku parseet).
Iespeejams, ka esmu uzrakstijis nedaudz par sarezhgjiitu, bet ja gadijumaa kaads vareetu iedomaaties kaadu valodu, kas man vareetu dereet, padodiet zinju. _________________ long time; /* know C */ |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Thu Mar 01, 2007 11:53 pm Post subject: |
|
1) Python:
Code: | t = filter(lambda p: p.health<4 and p.XP>3 and p.type==2, all_players) |
vai
Code: | t = [p for p in all_players if p.health<4 and p.XP>3 and p.type==2] |
2) ECMAScript:
Code: | function filter(array, func)
{
var result = [];
for (var i=0; i<array.length; i++)
{
if (func(array[i]))
{
result.push(array[i]);
}
}
return result;
}
var t = filter(all_players, function(p) { return p.health<4 && p.XP>3 && p.type==2; }); |
3) .NET'ā un Javā arī var kautko līdzīgu izdarīt
4) sava valoda (nav nemaz tik sarežģīti tādu izveidot)
P.S. Es, protams, par 1. variantu ;) |
|
Back to top |
|
|
Vecais_Dumais_Laacis Guru
Joined: 29 Jan 2004 Posts: 800
|
Posted: Fri Mar 02, 2007 12:05 am Post subject: |
|
python [battlefield 2]
lua [stepmania] _________________ ...un ja bites buutu laachi... |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Fri Mar 02, 2007 12:36 am Post subject: |
|
Sorry, drusku pārpratu vajadzīgo (par to spēlētāju skaitu).
Es to tavu "funkcija" rakstītu šādi Python'ā:
Code: | def funkcija(all_players, f, limit=None):
res = filter(f, all_players)
if limit is not None: res = random.sample(res, limit) #random.saples ir pitona standart libā nākoša funkcija
return res
#izvēlās visus ALLY tipa spēlētājus ar atbilstošiem kritērijiem
t = funkcija(all_players, lambda p: p.health<4 and p.XP>3 and p.type==Player.ALLY)
#izvēlās gan ALLY, gan ENEMY tipa spēlētājus ar atbilstošiem kritērijiem
t = funkcija(all_players, lambda p: p.health<4 and p.XP>3 and (p.type==Player.ALLY or p.type==Player.ENEMY))
#izvēlās ALLY tipa spēlētājus max 2 gabalus ar atbilstošiem kritērijiem
t = funkcija(all_players, lambda p: p.health<4 and p.XP>3 and p.type==Player.ALLY, limit=2)
#izvēlās jebkāda tipa spēlētājus max 4 gabalus ar atbilstošiem kritērijiem
t = funkcija(all_players, lambda p: p.health<4 and p.XP>3, 4) |
Iesaku padomāt vai šī p.type==Player.ALLY vietā labāk negribētu rakstīt kautko šādu: p.is_ally(), tb funkciju, kas atgriež booleanu.
Visu šo pašu var uzrakstīt arī ECMAScriptā, taču ar drusku garāku sintaksi..
Ja grib vēl "īsāk" tavu vajadzīgo pierakstītu (tb ar visu damage izdarīšanu), tad jādara kautkā šādi:
Code: | def funkcija(all_players, f, limit=None, call=None):
res = filter(f, all_players)
if limit: res = random.sample(res, limit)
if call is None: return res
map(x, res)
funkcija(all_players, # spēlētāju masīvs
lambda p: p.health<4 and p.XP>3, # nosacījums pēc kā filtrēt
2, # uz cik limitēt (opcionāli)
lambda p: damage(p, 8)) # izsaucamā funkcija uz katru no beigās palikušajiem (opcionāli)
|
(funkcija joprojām darbojas arī uz tiem iepriekšējā koda piemērā sarakstītajiem izsaukumiem)
Funkcionālā programmēšana ;) |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sun Mar 04, 2007 9:21 pm Post subject: |
|
Paldies par atbildem! Tiko visu parlasiju un domaaju, ka tas man neder. Man tomeer laikam vajadzeetu sajuugt to visu kopaa ar C++. Funkcijai vajadzeetu buut deklareetai ieksh C++ (to vareetu izsaukt ar skriptiem). Man neder visi tie if'i utt., jo speeleetaajam buus jaaizveelas meerkjis (ko dariis C++) un vinsh varees izveeleeties tikai taadus meerkjus, kas atbilst visiem kriteerijiem. Apmeeram izdomaaju, kaa to vareetu panaakt.
Code: |
//Skripta kods
#define enemy -1
#define ally -2
#define player 1
#define creature 2
funkcija(count,type,criteria)
{
return istafunkcija(count,type,criteria); //izsaucam C++ funkcija
}
|
Code: |
//C++ kods
elementi* istafunkcija(int count,int type,char* criteria)
{
//...
}
|
Attieciigi sho kodu vareetu izmantot apmeeram taa:
Code: |
t=funkcija(enemy,player|creature,"player.health>3,creature.health<4");
foreach t as c
{
//...
}
|
Man shitais variants pagaidam patik vislabak. Un tam ari deretu jebkura valoda (arii strong typinga). Varbut ir kads elementaraks vai smukaks veids?
Ceru, ka saprotat, ko gribu panakt. _________________ long time; /* know C */ |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Mar 04, 2007 9:36 pm Post subject: |
|
No Pitona izsaukt C/C++ funkciju ir diezgan viegli. Un pitons ar mainīga skaita argumentiem sadzīvo ļoti labi. Arī natīvo fju izsaukšanas interfeisā.
Tb tajā manā piemērā to funkcija mierīgi var definēt nevis pašā skriptu valodā (tb pitonā), bet gan kā prastu C fju, kuru ieimportē attiecīgais skripts. Es to funkcija rakstīju pitonā tikai tāpēc, lai tu vieglāk saprastu, ko tā īsti dara.
Arī otrādi - no C/C++ izsaukt Pitona fju - ir izdarāms bez problēmām. |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sun Mar 04, 2007 9:39 pm Post subject: |
|
A kaa ir ar Java? Ir kaada valoda prieksh Java un C++ (abiem reizee). Neesmu nevienu taadu veel atradis. Tas buutu baigi labs variants. _________________ long time; /* know C */ |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Mar 04, 2007 9:49 pm Post subject: |
|
No Javas protams, ka var izsaukt natīvo kodu (kā gan savādāk visādi OpenGL u.c. wrapperi būtu sataisīti). Ar to nu gan nav problēmu. http://java.sun.com/docs/books/jni/
Tik tur, manuprāt, būs neērti - skripti ta būs jākompilē uz baitkodu pirms palaist.
Taču par Javas viltībām es nekā tev nemācēšu pateikt. Javu nezinu, un negribu zināt (nepatīk man tā java).
Bet es nesaprotu, ko tu domā abiem reizē? Ka vienā sources failā var gan c++, gan javu rakstīt vai? |
|
Back to top |
|
|
Kamazs Guru
Joined: 17 Jan 2003 Posts: 829 Location: The glorious ancient city of Loja
|
Posted: Mon Mar 05, 2007 12:40 pm Post subject: |
|
Es izmantoju AngelScriptu. Sorry, neiedziļinājos pārējā posta saturā, gribēju tikai piebilst, ka tāda valoda eksistē, ir brīva, crossplatform un ar C līdzīgu sintaksi (tobiš, gandrīz identisku).
Mājas lapa:
http://www.angelcode.com/angelscript/
Kad bija skriptu izvēles valoda savai spēlei es zināju, ka negribu taisīt savu (pēc Pahra), bet ne LUA, ne Python man neiepatikās, jo gribējās ļoti C veidīgu un vienkāršu lietošanā. Tā nu uzdūros šai, lietoju un nesūdzos. _________________ ...un es uzskatu, ka Fallout ir etalons |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|