dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Skripta valodas izveele

 
dev.gamez.lv Forum Index -> Programmēšana
View previous topic :: View next topic  
Author Message
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: 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
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
Vecais_Dumais_Laacis
Guru
Guru


Joined: 29 Jan 2004
Posts: 800

PostPosted: Fri Mar 02, 2007 12:05 am    Post subject:

python [battlefield 2]
lua [stepmania]
_________________
...un ja bites buutu laachi...
Back to top
View user's profile
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: 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
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: 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
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
Kamazs
Guru
Guru


Joined: 17 Jan 2003
Posts: 829
Location: The glorious ancient city of Loja

PostPosted: 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
View user's profile Send e-mail Visit poster's website
Display posts from previous:   
dev.gamez.lv Forum Index -> Programmēšana All times are GMT + 2 Hours
Page 1 of 1

 
Jump to:  
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