Jump to content
php.lv forumi

Spēļu izstrādāšana


nemec

Recommended Posts

Man ir viens serveris, kas saņem komandas no lietotājiem (ieiet serverī, ielogojas, ieiet kādā istabā). Viss ir ok līdz šim brīžam. Spēle ir action, tas ir notiek kustības un darbības nepārtraukti. Lietotājs nosūta komandu, ka viņš kustās pa kreisi. Tad man šis te jāpārbauda un jāaizsūta viņam atpakaļ apstiprinājums (nu un protams visiem pārējiem istabas biedriem). Pēc kāda laika lietotājs var atdurties sienā, tātad serverim šis te ir jāizskaitļo un visiem jānosūta, ka šis lietotājs jāapstādina pie sienas. Tā principā notiek visa spēle. Sanāk, ka visu karti izskaitļo uz servera, lietotāji tikai sūta komandas - pa labi, pa kreisi, šaut utt. Serveris visu koordinē!

Tad sanāk, ka man servera pusē jātaisa lūps (while), kas visu laiku pārbauda vai kāds kustīgs objekts jau ir pietuvinājies sienai (tas ir piemēram).

Kādi ir varianti tādu realizēt?

Ja par pamatu ņemam python twisted.

Link to comment
Share on other sites

varianti:

1) Taisīt TCP serveri un klientu (visdrīzāk FLASH, jo to var izmantot kā TCP klientu), kur ir nepārtraukta konekcija starp visiem lietotājiem un serveri. Tad parasti ir eventi onrecieve, kurā saņemot datus no kāda klienta, tie tiek apstrādāti un aizsūtīti pārējiem klientiem, kuriem, tas ir nepieciešams.

2) Taisīt HTTP requestu, kurš tiek turēts, piemēram, 30 sekundes un atkal atjaunots, kad pārtrūksts. Tad tiešām ir cikls ar sleep aizturi, lai nenokarinātu serveri un kaut kādu mehānimsu (memcache ???), kā apmainīties ar informāciju starp dažādu klientu konekciju procesiem.

Link to comment
Share on other sites

varianti:

1) Taisīt TCP serveri un klientu (visdrīzāk FLASH, jo to var izmantot kā TCP klientu), kur ir nepārtraukta konekcija starp visiem lietotājiem un serveri. Tad parasti ir eventi onrecieve, kurā saņemot datus no kāda klienta, tie tiek apstrādāti un aizsūtīti pārējiem klientiem, kuriem, tas ir nepieciešams.

2) Taisīt HTTP requestu, kurš tiek turēts, piemēram, 30 sekundes un atkal atjaunots, kad pārtrūksts. Tad tiešām ir cikls ar sleep aizturi, lai nenokarinātu serveri un kaut kādu mehānimsu (memcache ???), kā apmainīties ar informāciju starp dažādu klientu konekciju procesiem.

1. pagājušā gada beigās šī problēma tika atrisināta ar websocketiem. Ja ir vēlme var izmantot flash tuneli priekš pārējiem "moderniem" pārlūkiem.

2. to sauc par cometu, šo tehnoloģiju nav vērts izmantot, izejot no 1. punkta

 

 

 

Pastāstīšu vairāk. Tātad klienta pusē man ir <canvas>, kas atbild par kartes attēlošanu (pašas spēles). Klients slēdzas serverim caur websocketiem (twisted jau ir tāds modulis, kas nevar nepriecināt :)) vai flash tunelis, bet tas neko daudz nemaina. Šeit problēmu lielu nav. Sūtam komandas uz serveri. Saņemam komandas no servera un attēlojam rezultātu.

Serveris klausās komandas un rīkojas.

Ja salīdzina ar zoli, tad tur bija soļu spēle. Lietotājs izdara gājienu, serveris izskaitļo un nosūta atbildi. Šajā gadījumā arī viss diez gan vienkārši.

Bet ja ir action spēle. Lietotājs nosūta komandu kustēties, tad pēc kāda laika (piemēram 10 sek) viņš var atdurties sienā un viņu ir jāapstādina. Serveris šajā gadījumā nevar momentā izskaitļot un atbildēt, tad ir jāatbild pēc 10 sekundēm (ja nekas nemainās protams). Karte tiek apstrādāta uz servera, tāpēc to ir visu laiku jālaiž pārbaudēs un nebeidzamos ciklos (while).

Tāpēc jautāju, kā to labāk realizēt?

Interesē kāda pieredze ir citiem, kas taisa multiplayer spēlītes?

 

Pagaidām esmu apstājies pie viena varianta. Tātad jātaisa divi serveri. 1. ir parasts, kas atbild par lietotājiem - ielogošana, istabā ielogošana utt (tur kur nav vajadzīgs cikls).

2. serveris ir pati spēle. Tātad 1. serveris nosūta komandu 'uztaisīt karti'. Tad tiek uztaisīta karte, tiek palaists cikls (while) un pārbauda kas tur notiek, sanāk, ka atbild par pašu karti un tur notiekošo. 2. serveris sūta 1. serverim komandas, piemēram lietotājs 1 ir atduries pret sienu utt. Lietotājs komunicē tikai ar 1. serveri, tad 1. serveris pēc vajadzībām pieprasa datus 2. serverim un arī saņem kādus datus par kartes stāvokli no 2. servera.

Link to comment
Share on other sites

Normālās multiplayer spēlēs serveris ir mūžīgais cikls. Atsevišķā normālā stand-alone izpildāmā failā. Ciklā tas apstrādā saņemto informāciju no tīkla, simulē fiziku/kolīzijas/punktu rēķināšanu un sūta atpakaļ atbildes klientiem. Praktiski visas ne-gājienu tīkla spēles ir realizētas tieši šādi.

Ja vajag papildus tam rādīt informāciju lapā no spēles datiem, tad abi var sadarboties izmantojot vai nu kādu DB datubāzi, vai memcached (vai kādu tā alternatīvu), vai nu jebkuru citu procesu - kā tev pašam ērtāk.

dev.gamez'ā vari apvaicāties elvman, manuprāt viņš ar flašu un multipleijeru spēles ir taisīji. vdl's šķiet arī ko līdzīgu ir taisījis.

Link to comment
Share on other sites

Manuprāt, ka tas viss jātaisa līdzīgi ZOlei... ;) Tikai ar to atšķirību, ka "vari izlaist gājienus" un gājiena ilgums ir dažas desmitdaļas no sekundes.

 

Respektīvi serveris pieņem gājienus kvantēti reizi X sekundēs (vai sekundes daļās) - šajā īsajā laika posmā pieņemtos gājienus pieņem, apstrādā atbilstoši spēles loģikai un aizsūta atpakaļ datus atbilstoši katram dalībniekam un viņa POV (Point of View) - rupji runājot aizūta atpakaļ info klienta pusē esošajam renderētājam par to, kas izmainījies tajā, kas redzams spēlētāja ekrānā.

 

Nezinu, vai šis palīdz, vai nē :) Pieredzes spēļu taisīšanā man nav.

Link to comment
Share on other sites

Uzhakojam klientu un nosūtam koordinātes, kas ir "aiz sienas". Un varam staigāt kur patīk..?

priekš tam ir antihack, kas nočeko aizdomīgas darbības. antihack tooļus uzliek client pusē (tie playeri, kuriem tas ir svarīgi). līdz ar to serverim nav jāseko līdzi cheateriem, vai kāds gadījumā izgāja cauri sienai, vai nē (un nav jātērē servera jauda uz to)

Link to comment
Share on other sites

2easy, jebkas, kas ir klienta pusē pēc definīcijas ir nedrošs. Ja paskatamies piemeeram to pashu caropia.com, tad iedomaajies kas notiktu, ja servera pusee netiktu paarbaudiita mashiinas atrashanaas vieta trasee - speele piestarteejas, es aizsuutu seciigi visu checkpointu koordinaatas serverim un esmu vinneejis, lai gan reaali braucis neesmu.

Link to comment
Share on other sites

ok, ir jāsūta darbība - user action. to salīdzina ar iepriekšējo stāvokli un tad updeito koordinātes un aizsūta visiem pārējiem

 

vnk lai sienā ieskriešanas gadījumā būtu ātrāks response, dažas lietas var pārbaudīt uzreiz uz client pc. tb šī pārbaude ir paša spēlētāja labā, taču serveris pārbauda tikai vai nenotiek cheatošana

Edited by 2easy
Link to comment
Share on other sites

http://dev.gamez.lv mēģināji interesēties?

pagaidām nē, nav tur vienkārši piereģistrēties.

 

 

 

Normālās multiplayer spēlēs serveris ir mūžīgais cikls. Atsevišķā normālā stand-alone izpildāmā failā. Ciklā tas apstrādā saņemto informāciju no tīkla, simulē fiziku/kolīzijas/punktu rēķināšanu un sūta atpakaļ atbildes klientiem. Praktiski visas ne-gājienu tīkla spēles ir realizētas tieši šādi.

īsti nesapratu. Tu domā taisīt pašu spēli stand-alone?

Es domāju veidot atsevišķi spēles skriptu un pašu servera skriptu (serveris būtībā arī sanāk, ka ir mūžīgs cikls, kas pārbauda vai no lietotājiem nav kas atnācis). Tieši šī iemesla dēļ, sanāk ka jābūt diviem mūžīgiem cikliem.

Vai arī jāskatās man uz multiprocessingu labāk?

 

Vēl iedomājos, ka spēle varētu būt kā klients, kas padod serverim komandas vai saņem.

 

to vai atduras pret sienu, pārbauda lokāli. pa tīklu aizsūta tikai playera koordinātes, lai arī citi zin, kur viņš ir

Man tomēr patīk savādāks modelis: lietotājs nospiež komandu (piemēram uz augšu), sūtam uz serveri, serveris visiem klientiem sūta ka lietotājs kustās (uz augšu), serveris (pēc 10sek) sūta, ka lietotājs apstājies pie sienas (var ar koordinātēm, lai izlīdzināt kartes izskatu). Sanāk diezgan mazs trafiks un tur nav par ko uztraukties.

 

 

Manuprāt, ka tas viss jātaisa līdzīgi ZOlei... ;) Tikai ar to atšķirību, ka "vari izlaist gājienus" un gājiena ilgums ir dažas desmitdaļas no sekundes.

 

Respektīvi serveris pieņem gājienus kvantēti reizi X sekundēs (vai sekundes daļās) - šajā īsajā laika posmā pieņemtos gājienus pieņem, apstrādā atbilstoši spēles loģikai un aizsūta atpakaļ datus atbilstoši katram dalībniekam un viņa POV (Point of View) - rupji runājot aizūta atpakaļ info klienta pusē esošajam renderētājam par to, kas izmainījies tajā, kas redzams spēlētāja ekrānā.

 

Nezinu, vai šis palīdz, vai nē :) Pieredzes spēļu taisīšanā man nav.

Zoles gadījumā, kaut kāda aktivitāte notiek tikai tad, ja kāds izdara kādas kustības (gājienu). Ja neviens neko nedara, tad serveris arī neko nedara un nerēķina. Bet manā gadījumā serverim ir visu laiku jārēķina. Var protams raustīt serveri, bet manuprāt tas ir perversi :)

Link to comment
Share on other sites

pagaidām nē, nav tur vienkārši piereģistrēties.

Atsūti savu emailu man, padošu ziņu adminam lai apstiprina.

 

īsti nesapratu. Tu domā taisīt pašu spēli stand-alone?

Jā, tieši tā. Tas ir vienkāršākais veids.

 

Vai arī jāskatās man uz multiprocessingu labāk?

Tas atkarīgs no spēles veida. Vienkārši multithreadingu pielikt nesanāks, tur ir jāpadomā.

 

Vēl iedomājos, ka spēle varētu būt kā klients, kas padod serverim komandas vai saņem.

 

Man tomēr patīk savādāks modelis: lietotājs nospiež komandu (piemēram uz augšu), sūtam uz serveri, serveris visiem klientiem sūta ka lietotājs kustās (uz augšu), serveris (pēc 10sek) sūta, ka lietotājs apstājies pie sienas (var ar koordinātēm, lai izlīdzināt kartes izskatu). Sanāk diezgan mazs trafiks un tur nav par ko uztraukties.

Protams, tā var - tas viss atkarīgs no spēles veida.

 

Bet manā gadījumā serverim ir visu laiku jārēķina. Var protams raustīt serveri, bet manuprāt tas ir perversi :)

Tieši tāpēc saku - taisīt spēli kā atsevišķu procesu uz servera. Tā visi dara :)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...