Skripti za potezno strategijo. Razvoj strategije korak za korakom. Glavne faze oblikovanja strategije

Pozdravljeni vsi skupaj! Zdaj vam bom povedal, kako narediti preprost RTS (RTS - Real Time Strategy, to je strategija v realnem času) odpreti visečo mrežo 8.1 (operabilnost ni zagotovljena na 8.0) ustvariti objekt objControl, to je, to bo naš glavni predmet, ustvarite dogodek ustvarjanja ( Create) Dodaj dogodek => Kreacija (Add event => Create) dogodek ustvarjanja se izvede samo enkrat - pri ustvarjanju kliknite zavihek Control v desnem navpičnem meniju in z desno miškino tipko kliknite Execute kodo (Izvedi kodo) in napiši kodo (najbolje je, da kode ne kopiraš, poleg tega si jo, če jo napišeš sam, veliko lažje zapomni):

200?"200px":""+(this.scrollHeight+5)+"px");">startx=0; //Najavi spremenljivko za začetno točko x
začetek=0; //Deklariraj spremenljivko za začetek točke z y
draw_rect=false; //Ne rišite izbirnega pravokotnika


Spremenljivka: del pomnilnika, ki vsebuje informacije. Imajo svoje ime, s katerim jih lahko kontaktirate. Spremenljivke v GML lahko vsebujejo realno število ali niz. Na primer, miza je spremenljivka, lesena ali steklena vrednost
Sedaj ustvarimo dogodek koraka (Korak, Dodaj dogodek => Korak) in znova izvedemo operacijo (desni klik na Execute code):

200?"200px":""+(this.scrollHeight+5)+"px");">
if mouse_check_button_pressed(mb_left) //Če je pritisnjena LMB
{
draw_rect=true; //Narišemo pravokotnik
startx=miška_x; //Začetek x položaj = miška x položaj
starty=mouse_y; //Začetni položaj = položaj miške
z vsemi izbranimi=false; //To še ni deklarirana spremenljivka, kasneje bomo izvedeli, kaj bo naredila
}

If mouse_check_button_released(mb_left) //Če je LMB izpuščen
{
draw_rect=false; //Ne rišemo pravokotnika
za(i=0;i<=instance_number(par);i+=1) //Читайте про цикл for ниже
{
ii=instance_find(par,i); //Iščemo objekt, ki še ni izdelan
if(collision_rectangle(startx,starty,mouse_x,mouse_y,ii,true,false)) //Tukaj je naš pravokotnik trkov (kontakt)
{
ii.selected=true;
}
}
}

Koda je velika in zapletena, medtem ko spoznavamo pogojni stavek if:
Koda z if se izvede takole:

200?"200px":""+(this.scrollHeight+5)+"px");">
če (pogoj)
{
ukrepanje
}

Vsebuje lahko tudi stavek else (sicer), na primer:

200?"200px":""+(this.scrollHeight+5)+"px");">če (pogoj)
{
ukrepanje
}
drugače
{
dejanje 2
}

In for je operator zanke, se izvaja takole:

200?"200px":""+(this.scrollHeight+5)+"px");">
za (<переменная> ; <выражение> ;<действие переменной>)
{
<действия>
}


Operater for je zelo močna stvar, zelo pomaga v težkih situacijah

Operator - dejanja, vgrajena v jezik, na primer, najpogostejša so int, if, else, string, switch, for, case, break, exit itd., itd.

Zdaj ustvarimo tudi dogodek risanja (žrebanje) in pišemo na enak način:

200?"200px":""+(this.scrollHeight+5)+"px");">if draw_rect=true
{
alfa=.8;
draw_rectangle_color(startx,starty,mouse_x,mouse_y,c_green,c_green,c_green,c_green,true);
}

Tukaj je vse enostavno, tukaj je ista stvar samo v ruščini:
če moramo narisati pravokotnik, potem izberemo prosojnost in narišemo pravokotnik
tukaj so argumenti

200?"200px":""+(this.scrollHeight+5)+"px");">draw_rectangle_color(x1,y1,x2,y2,barva 1, barva 2, barva 3, barva 4, obris)


oris - ali bo narisan samo rob (true) ali zapolnjen pravokotnik (false).
Našli smo novo besedo - konstanta, to je številski izraz ali koda, ki jo nadomesti beseda, viseča mreža ima vgrajene konstante:

200?"200px":""+(this.scrollHeight+5)+"px");">true - 1
napačno - 0
pi - 3,1415 ...


No, ugotovili smo, zdaj moramo ustvariti nov objekt- nadrejeni objekt, ki se bo povezal s svojimi otroki. Poimenujmo ga par (če želite spremeniti ime, morate spremeniti kodo v dogodku koraka nadzornega objekta), zapišite v dogodek ustvarjanja:

200?"200px":""+(this.scrollHeight+5)+"px");">selected=false; //Tu je naša spremenljivka, ali je predmet izbran

To je vse. Zdaj seveda potrebujemo objekt, ki se lahko premika, imenujemo ga objTest in zapišemo kodo v dogodek ustvarjanja:

200?"200px":""+(this.scrollHeight+5)+"px");">gox=x; //Kam iti ...
goy=y; //avtor y
izbrano=false; //Nismo izbrani =)
object_set_parent(self,par) //Tu je izbira nadrejenega

Novo dejanje:

200?"200px":""+(this.scrollHeight+5)+"px");">object_set_parent(ind,obj)

Nastavi nadrejeni objekt na objekt z imenom ind.
IN nov operater: self, to pomeni, da bo dejanje šlo samo po sebi
Ne bojte se, v dogodku step je še malo ostalo:

200?"200px":""+(this.scrollHeight+5)+"px");">če distance_to_point(gox,goy) > 20
{
mp_potential_step(gox,goy,6,solid);
}
if(selected=true) && mouse_check_button_pressed(mb_right)
{
gox=mouse_x;
goy=mouse_y;

tematski park:
Potrebovali bomo:
gradbeni duh
sprite meni
SPRITE RAZLIČNIH GUMBOV, KOT SO:
napis z napisom (gradnja, gradnja, graditi itd.)
okno, ki se prikaže
risba zgradbe,
1) ostalo bomo dodali sami
2) beseda ponaredek - ustvaril sam, ker morali ga bomo ponarediti, da se ujema z našim virom)
Pa začnimo:
1) ustvarite vse, kar je zapisano v točki I, razen 1)
Ustvarimo globalno spremenljivko z imenom money, nastavimo kateri koli začetni znesek denarja
Ustvarili bomo tudi objekt miške in tipkovnice
Ustvarimo besedilo, poimenujmo ga info, ustvarimo vedno dogodek in v njem ustvarimo dejanje:
izberite informacije v izboru dejanj izberite nastavite besedilo v besedilu napišite tole:
"denar: " &(globalno("denar".
2) dodajte meni, glavna naloga menija ni, da moti, ampak pomaga igralcu pri navigaciji (kako lahko moti? - enostavno je, če ga postavite sredi igre); preden naredimo meni, Ustvarili bomo novo plast, ki jo bomo poimenovali meni, v njenih razmerjih (nastavitve, možnosti) v elementu prikaza, ki ga zapišemo:


vanj bomo dodali sprite in vzeli sliko menija, ki je bil v predprodukcijskih materialih (točka I) in naš meni postavili na osamljeno mesto, kjer ne bo motil, vendar bo viden na zaslonu
Postavimo še gumb iz predzaključnih materialov (točka I) z napisom BUILD (ali kaj podobnega)
dajmo na jedilnik
Zdaj pojdite na urejevalnik listov dogodkov
ustvarite dogodek (#bla bla bla# - to je moje sporočilo (razlaga) za vas, samo namesto bla bla bla bo moj komentar za vas; >> - akcija; ll - razdelitev oken na primer:

miška&tipkovnica ll na objekt kliknjen ll levi klik na objekt #vaš menijski gumb z napisom BUILD (ali kaj podobnega)##ostalo kasneje (glej točko 3)#
3)zdaj pa najtežji del(To sem razdelil na dve točki, da ne bi bilo tako zapleteno),
ustvarite sprite iz predkončnih materialov "okno, ki se bo pojavilo"
nato ustvarimo prazen sprite z imenom p1, premaknemo okno z zaslona in postavimo p1 na mesto, kjer bi se moralo prikazati vaše okno, ko pritisnete gumb za gradnjo (ali nekaj podobnega CHVER)
super! Zdaj pojdite na urejevalnik lista dogodkov
Zapišimo nedokončani dogodek do konca:
Besedilo bo nastavilo besedilo ll bla-bla-bla)
miška&tipkovnica ll na objekt kliknjen ll levi klik na predmet #vaš menijski gumb z oznako BUILD (ali nekaj podobnega)#>>
4)Drugi del najtežjega dela:
ustvarimo sprite, kjer bo narisana slika stavbe (predzaključni materiali), poimenujmo ga h1
ustvarimo prazen sprite, poimenujmo ga p2, zdaj ga postavimo na mesto, kjer se mora odpreti okno,
Ustvarimo sprite, tudi okno (predhodni materiali), v okno bomo lepo napisali ime stavbe, njeno ceno in opis (neobvezno) in jo poimenovali i1
ustvarimo še en prazen sprite, imenovan p3, postavimo ga poleg p2, le tako, da se dotika p2 samo z zgornjim levim kotom
Zdaj ustvarimo več dogodkov, vendar najprej naredimo prejšnji dogodek eno novo dejanje:
miška&tipkovnica ll na objektu kliknjen ll levi klik na predmet #gumb vašega menija z napisom BUILD (ali kaj podobnega)#>> sistem ll ustvari objekt glede na objekt ll #vaše okno# #številka sloja pod imenom menija# # X ;Y-ne spreminjaj# v objekt p1
>>sistem bo ustvaril objekt glede na objekt ll #vaše drugo okno# #številka sloja pod menijem imena# #X;Y-ne spreminjaj# v objekt p2
Prav tako mu moramo vrniti dogodek:
kopirajte dogodek in ga obrnite
nov dogodek
miška&tipkovnica ll je nad objektom ll h1>>sistem ll ustvari objekt glede na objekt ll i1 #številka sloja pod menijem imena# #X;Y-ne spremeni# v objekt p3
Naredimo sprite s stavbo (uporabimo predprodukcijske materiale) in jo poimenujmo hiša
Ustvarimo okno, kjer se bodo pojavile naše zgradbe, ko jih izberemo v meniju, poimenujmo ga rlo
dogodki:
miška&tipkovnica ll na predmetu kliknjen ll levi klik na h1>>sistem ll ustvari v objekt glede na objekt ll hiša #številka sloja pod menijem imena# #X;Y-ne spreminjaj# v predmet rlo
>> sistem bo odštel od vrednosti ll #znesek denarja, ki ga je treba odnesti med gradnjo#
Zdaj je bilo nemogoče zgraditi dogodek
Povedal ti bom svoje prejšnji način prepovedi (ko bom končal s pisanjem, bom raziskal še eno metodo, zaradi katere sem pomodrel, ko sem se spomnil na igro tematskega parka world)
dogodki:
hiša ll ob trku z drugim predmetom ll do hiše
>>hiša bo uničena
>> sistem bo odštel od vrednosti ll - #podvoji znesek denarja, ki je bil odnesen med gradnjo##opomba, ki jo morate vnesti - količina#
v glavnem vse.
III, kaj hočem povedati:

Bil sem zelo razburjen zaradi propada moje igre. Bila je strateška igra in ta članek je bil sestavljen po njeni shemi. Prosim vas, da ne kritizirate preveč, dolgo sem pisal, če najdete govorne napake, pišite in jih popravite
in tukaj je tudi izvorna koda za vaš užitek gledanja, poglejte, načeloma je vse enako, kot je napisano tukaj, le da je bila to demo različica igre. Glavna stvar je, da ne spremenite ničesar, sicer bo hrošča !
uporabljaj, eksperimentiraj, preverjaj, delaj, kar hočeš, zame je vse v redu

KaMiKaZa:
Vsi »sistemski« izrazi morajo biti vključeni v oznako »Koda«.
Potem mislim, da bo bolje.
Prav tako se mi zdi, da posnetki zaslona tukaj ne bi škodili. In tudi izvorno kodo, za začetnike.

tematski park:
Ne znam narediti posnetkov zaslona dogodkov.

No, to ni potrebno.

iamnp:
theme_park , na tipkovnici je poseben gumb - PrintScreen

tematski park:
Vem, da nekateri ljudje to počnejo drugače, poleg tega ima vsak svojega duha
in če nastavim vse te sprite, bo malo ljudi razumelo.
No, morda bo kdo dal plus? Ni čudno, da sem se trudil?

burlačenko:
Da bi bila takšna lekcija zanimiva za vsakogar, jo je treba ustrezno oblikovati, toda tukaj "kako je bilo."
Pa vendar, če želite, po malem, ko imate čas, prosim “polepšajte”.

tematski park:
ok, pridem domov iz šole in se pripravim.
PS. dodan vir

Serega Lebedev:

iamnp, kam gredo ti posnetki zaslona pozneje?

KaMiKaZa:

V odložišče.
Pojdi na katero koli urejevalnik besedil in izvedite operacijo »Prilepi« ali pritisnite Ctrl+V.

V tem članku se verjetno ne bom dotaknil česa neznanega. Vsi izračuni so preprosti in razumljivi vsakomur, ki ve, kaj je Ajax. Napisal sem že članek o tem, kako združiti odjemalca s strežnikom v igrah v realnem času (). V tem članku obravnavam enaka vprašanja, kot veljajo za potezne igre.

Torej, kaj je potezna igra? Naslednjo definicijo lahko najdete na Wikipediji potezna strategija - to je žanr računalniške igre, katerega glavna značilnost je, da se igralci premikajo izmenično, v nasprotju s strategijo v realnem času. To definicijo bi nekoliko poenostavil:

  • Strategija korak za korakom - je potezna strateška igra.
  • strateška igra - To je žanr iger, v katerih sta ključ do zmage načrtovanje in strateško razmišljanje..
  • Potezna igra - je žanr iger, katerih glavna značilnost je, da igralci izmenično delajo poteze.
Potezne igre vključujejo:
  • Potezne strategije
  • Igre s kartami
  • Družabne igre (šah, go, monopoli itd.)
Opažam, da potezne igre nalagajo manj omejitev glede kompleksnosti protokola interakcije v primerjavi z igrami v realnem času. namreč reakcijski čas na določen dogodek ne igra ključne vloge. Igralec ima običajno na voljo 10 sekund, da sprejme odločitev. Tudi če je ping velikanski, recimo 3 sekunde, ima igralec še vedno 7 sekund za razmislek. Poleg tega lahko ping skače in skače, vendar nas to sploh ne zanima (v igrah v realnem času ta situacija praktično ubije vsak protokol).

Običajno (v 95 % poteznih iger) se v danem trenutku odloči točno en igralec. Posledično se zoži število zahtev, na katere moramo ustrezno odgovoriti.

Zato se bomo pri izdelavi protokola osredotočili predvsem na enostavnost njegove implementacije in podpore. To nam bo omogočilo večji dobiček v krajšem času.

Zgornje razmišljanje temelji na dvomesečnem razvoju določene igre s kartami.

Pametna ali neumna stranka?

Najprej se odločimo, kako »pametna« je lahko naša stranka. Razglabljam, ali se splača podvajati logiko aplikacije (pravila igre) na klientu. Seveda mora biti strežnik pameten, da prepreči morebitne vdore v aplikacijo. Toda ali se splača poučevati stranko poslovne logike?

To je neposredno odvisno od tega, koliko tehta celotna količina podatkov o stanju vaše igre. Če je ta količina podatkov velika, se dolgo časa zbira na strežniku in prenaša na odjemalca, potem je smiselno del logike implementirati na odjemalca, da razbremenimo strežnik. Na primer, v Civilization je merilnik porabe pomnilnika vedno izven lestvic. Ali lahko ustvarite nekaj podobnega in na odjemalcu pustite samo uporabniški vmesnik?

Po drugi strani pa, pametnejši ko je naročnik, dražji bo razvoj igre. Naj opozorim, da čas razvoja strežnika ni v ničemer odvisen od naročnikove erudicije. Tudi če je odjemalec super-duper-mega pameten, bo moral strežnik, če želi znova naložiti okno brskalnika, zbrati in sestaviti vse podatke o igri, da jih prenese odjemalcu. A la "Nalaganje shranjene igre". Zaključek: Pameten odjemalec lahko pohitri aplikacijo, vendar bo vedno potreboval dodatna sredstva za razvoj aplikacije.

Predlagam naslednje test:

1. Ali glasnost kanala dovoljuje?

Ocenite povprečno težo celotne količine podatkov o stanju igre. Nato pomnožite s povprečnim številom zahtev do strežnika na sekundo. Če dobljeno število presega zmogljivost odhodnega podatkovnega kanala, potem je neumen odjemalec nesprejemljiv. Če ta številka presega 20% odhodnega kanala, potem morate razmisliti, ali bo delovalo?

2. Ali je delovno intenzivno?

Ocenite kompleksnost algoritma za zbiranje podatkov igre (v delčkih sekunde). Tukaj upoštevajte vse poizvedbe v bazi podatkov. Nato pomnožite s povprečnim številom zahtev do strežnika na sekundo. Če čas presega eno sekundo, je neumna stranka nesprejemljiva. Če ta številka preseže 200 ms, potem morate pomisliti, ali bo trajalo?

Nadaljevanje:

Oblikovanje strategije
Ne moreš zaupati amaterjem:
njihovi načrti se lahko nepričakovano izpolnijo,
in nihče ni pripravljen na to.

(A. Cuningham)

V prejšnjih dveh številkah smo izvedeli naredite preproste 2D igre, upravljajte sprite, se pomikajte po zaslonu igre, sledite trkom predmetov igre, zgradite vmesnik (gumbi, miška, tipkovnica, področja besedila) in delajte v celozaslonskem in okenskem načinu. Vse to je bilo narejeno na primeru arkadne igre.

Tokrat se bomo od arkadnih iger premaknili k bolj "resnemu" žanru - strategijam. Tu bomo morali obvladati celo vrsto novih mehanizmov, vendar tudi tukaj ne bo nič zapletenega. V tem članku smo Preučimo strukturo potezne strategije(in tudi strategija v realnem času- to je še lažje narediti z LKI-Creatorjem) in naredili bomo igro kot primer, vendar zasnovano samo za večuporabniški način (in tudi urejevalnik zemljevidov za njo). Z enoigralskim načinom se bomo ukvarjali v naslednji številki naše rubrike – posvečene osnove umetna inteligenca .

Ker je to že tretja lekcija, se ne bomo spuščali v podrobnosti vse primer kode - na srečo je bilo veliko narejenega povsem enako kot prejšnjikrat. Za referenco je primer programa (v njem je veliko komentarjev) in prejšnji članki.

No, materiale iz naših preteklih razredov lahko najdete na našem CD, v razdelku »Igra Naredi sam«, posebej ustvarjenem za ta namen.

Oblikovanje problema

Napišimo strateško igro, sestavljeno iz bitke med dvema domišljijskima vojskama. Cilj bitke je ujeti več obeliski, postavljeno na zemljevid. Pred bitko razporedimo naše čete, ki jih sestavlja 6 mečevalci, 4 lokostrelci, 2 vitezi, 2 čarovniki in 1 duh, znotraj ozemlja, ki nam je dodeljeno. Poleg njih so na zemljevidu še nevtralni zmaji.

Značilnosti borcev
Borec Premikanje Zadetki Razpon Škoda Zaščita Zmogljivosti
Mečevalec4 8 1 7 2 -
Lokostrelec4 5 7 5 1 -
Vitez3 15 1 9 4 Zdravljenje, Viteški udarec
Mage3 12 5 6 0 Ognjena krogla
Duh4 7 2 5 5 Regeneracija
Zmaj6 30 2 12 5 Polet

Lastnosti borcev so predstavljene v tabeli. Zdravljenje- to je pravica do ozdravitve sosednjega bojevnika (razen duha) do popolnega zdravja enkrat na bitko. Viteški udarec- pravico povzročiti trojno škodo enkrat na igro. Ognjena krogla- čarovnikov napad odstrani točke zadetkov ne samo iz neposredne tarče, ampak tudi iz okoliških polj. Regeneracija- povrnitev 1 udarca na potezo. Polet- pravico do premikanja čez ovire.

Igra se v načinu za več igralcev, v različici Hot Seat (igranje z enega računalnika, obračanje enega za drugim). Ko se igralci obrnejo, pridejo na vrsto nevtralni zmaji, ki napadejo katerega koli sovražnika v radiju 7 celic.

Zabava se konča, ko ena stran zajame več kot polovico obeliskov na zemljevidu ali popolnoma umre.

Zemljevid je bil prvotno nastavljen v urejevalniku zemljevidov. Obstajajo obeliski, zmaji in ovire (predmeti, skozi katere se ne morete premikati ali napadati).

Priprave na delo

Preden začnemo, bomo morali znova namestiti paket LKI-ustvarjalec. Dejstvo je, da je bilo v primerjavi s prejšnjim časom vanj vnesenih veliko sprememb in dopolnitev.

(Upam da Delphi ste že namestili; če ne, potem preberite priporočila na to temo v našem prejšnjem članku – v junijski številki revije ali na CD-ju te številke ali na spletni strani.)

Je pomembno: prejšnja različica LKI-Creator je imela nekaj težav z združljivostjo z novimi različicami Delphija. V tej različici so odpravljeni.

Vzemite datoteko s programskimi besedili in slikami z našega CD-ja (razdelek »Igra z lastnimi rokami«) in jo razpakirajte v imenik projekta.

Zdaj lahko prenesete potrebne datoteke od tod .

Morali bi imeti tri podimenike. One - Units - shranjuje knjižnice DirectX in module paketa LKI-Creator. V drugem - Projekt - bomo delali; slike, ki jih bomo potrebovali, so tam postavljene vnaprej in prejšnja različica naša arkada. V tretjem - Escort - že pripravljen program, ki bi nam moral uspeti.

Zdaj pa namestimo (ponovno) LKI-Creator. V meniju Delphi odprite postavko Component in izberite Install Component. Če ste ta paket že namestili, ostanite na zavihku V obstoječi paket, sicer pojdite na zavihek V nov paket in izpolnite prazne vrstice, kot je prikazano na sliki (v zgornji vrstici je najlažje izbrati LKI2dEngine. pas z uporabo gumba Prebrskaj in na dnu samo vpišite LKI). Nato kliknite V redu in izberite Namesti. IN zgornja plošča Delphi bi morali videti zavihek LKI.

Zdaj ostane le še nalaganje našega projekta. V meniju Datoteka izberite Odpri, odprite datoteko Project\Obelisk.dpr…

Kje je zemljevid, Billy? Potrebujemo zemljevid!

Toda preden se lotimo večjih stvari, bomo morali še malo delati na grafičnem motorju.

V Star Escort, našem prejšnjem projektu, »zemljevid« ni imel pomena: zvezde so bile postavljene naključno in niso vplivale na nič, položaj drugih predmetov pa je bil določen neposredno v kodi ali določen naključno. To ni primerno za vsak projekt. To pomeni, da je čas, da dodamo v naš motor zemljevid območja.

Verjetno že ugibate, kako bo izgledalo - na okno projekta postavimo objekt zemljevida in ga nato registriramo v lastnini Zemljevid naš motor.

Tako je... vendar imamo več kot en razred kart. Poglejmo si pobližje...

Vrste kartic

Zemljevid je sestavljen iz nečesa pokrajina in predmetov nameščen na njem. Pokrajina je najpogosteje (vendar ne vedno) razdeljena na celice, imenovane ploščice- ploščice.

Kot vemo iz šolskega tečaja geometrije, lahko ravnino prekrijemo brez vrzeli ali prekrivanj z pravilnimi poligoni treh vrst: trikotnikom (enakostraničnim), kvadratom, šesterokotnikom. Trikotna polja niso posebej priročna, zato se pogosteje uporabljajo kvadratne celice ali šesterokotniki.

V nekem smislu je življenje s kvadrati lažje: če imamo dvodimenzionalni niz celic, je takoj jasno, kako najti celice, ki mejijo na dano celico. To sta +1 in -1 za vsakega od obeh indeksov. S šesterokotniki je vse malo bolj zapleteno ... vendar ima šestkotna plošča zelo dragoceno lastnost: vse smeri v njej so enake. To ne velja za kvadratno mrežo: diagonale se bistveno razlikujejo od vodoravnic in navpičnic. Zato so lahko za resne strateške izračune šesterokotniki boljši od kvadratov.

Obstajajo tudi kartice brez ploščic. LKI-Creator podpira dve vrsti: graf in patchwork.

Grafni zemljevid je zemljevid, na katerem ima pomen le nekaj ključnih točk in morda posebna območja (na primer neprehodna), ostalo pa je le vzorec, ki nima učinka igre. Tako so pogosto narejene zvezdne karte, kot recimo v Master of Orion: zvezde in črne luknje so ključne točke, ostalo je ozadje. V tem načinu včasih naredijo globalne zemljevide, na primer za igro vlog.

Patchwork zemljevid je razdeljen na območja, znotraj območja pa so vse točke enake, po »patchworku« se ne morete premikati. To je dobro za globalne strategije, kjer je provinca najmanjša enota ozemlja.

Primeri kart iz različnih iger z navedbo vrste so na slikah.

Torej večina dvodimenzionalni zemljevide (tridimenzionalne - poseben člen) lahko razdelimo v štiri razrede:

  • Pravokoten- TLKIRectMap. To je zemljevid s ploščicami, celice so kvadrati. Tak zemljevid je na primer v Civilization III.
  • Šesterokotna- TLKIHexMap. Popločan zemljevid s šesterokotnimi celicami. Uporablja se v številnih vojnih igrah in ne samo: tako je na primer tradicionalno narejen bojni zemljevid Heroes of Might & Magic.

    Ti dve vrsti kart sta potomci splošnega razreda TLKITileMap.

  • Graphovaya- TLKIGraphMap. Ta kartica ima ozadje (Lastnost ozadja) ključne točke, poudarjene na njem, pa so statični objekti. Položaj drugih objektov na tem zemljevidu je izražen z običajnimi koordinatami (kot vesoljska ladja v medzvezdnem prostoru) ali s sklicevanjem na predmet (ista ladja v orbiti planeta). To so karte Master of Orion, Arcanum (globalno) itd.
  • Patchwork- TLKIClusterMap. Ima lastnost ozadja, kot je graf, in drugo lastnost - maska, ki določa, katera točka pripada kateri regiji, in lastnost Meje, ki določa povezave med »šredi«. Tako so zemljevidi urejeni na primer v srednjem veku: Totalna vojna ali Victoria.

Je pomembno: Razredi zemljevidov niso opisani v modulu LKI2dEngine, ampak v LKI2dMap.

Nagibni koti

Toda če mislite, da so s tem izčrpane zmožnosti LKI-Creatorja za prikaz zemljevidov, potem se močno motite.

Zemljevid je mogoče predstaviti pogled od zgoraj oz izometrična- pogled pod kotom na navpičnico. Na primer, zemljevid Civilization III ali Heroes of Might & Magic IV je izometričen, Civilization I pa ima pogled od zgoraj navzdol.

Običajno se izometrija uporablja za zemljevide s ploščicami, medtem ko se zemljevidi z grafi uporabljajo s pogledom od zgoraj, saj je merilo zemljevidov z grafi običajno manjše. Vendar obstajajo izjeme: na primer, v Medieval: Total War obstaja patchwork izometrični zemljevid.

Lastnost zemljevida je odgovorna za izometričnost Isometric in dva parametra, ki določata kot, pod katerim gleda naša kamera: Phi in Theta.

Prvi je odgovoren za vrtenje zemljevida glede na navpično os: na primer, če ga nastavite na 45 stopinj (meri se v stopinjah), bo pravokotna mrežna celica usmerjena pod kotom navzgor, kot v Civilization . Pri Phi=0 bo ena od stranic celice vodoravna.

Drugi nadzoruje nagib kamere glede na navpičnico. Za udobje je podan kot razmerje med vodoravno in navpično enoto dolžine. Recimo, če želimo, da je naša celica narisana v višino za polovico tako široka, kot je v širino, moramo Theta nastaviti na 2.

Pri zemljevidu s ploščicami teh kotov ne smemo izbirati poljubno: navsezadnje 3D (še) nimamo. Neposredno so odvisni od parametrov ploščic. Na primer, če imamo diamantno os s kotom navzgor in je navpična os polovica velikosti vodoravne osi, potem moramo nastaviti parametra 45 in 2.

Toda grafični in patchwork zemljevidi vam dajejo pravico, da dodelite te parametre, kot želite (in jih celo, če želite, spremenite v procesu), vendar se s tem ne smete zanesti - poleg dejstva, da takšni zavoji zahtevajo veliko časa, tudi ne izgledajo zelo kul. In ne pozabite, da če je vaš zemljevid umetniški, s slikami, napisi itd., potem se bodo z njim obrnili ... Na splošno je včasih lažje narisati patchwork zemljevid ob upoštevanju zahtevane rotacije - na srečo razdalj pogosto tam ne igrajo nobene vloge.

sklepi

Patchwork zemljevid, pogled od zgoraj.

Zemljevidi ploščic imajo še eno težavo - spajanje ploščic. Upravlja se s parametrom TileBorderStyle. Najpogosteje to tileStraight, način, pri katerem se ploščice preprosto prilegajo skupaj brez robnih učinkov, oz tileBorder, v kateri so narisane črte, ki ločujejo eno ploščico od druge - meje celic (v slednjem primeru ne pozabite določiti barva rešetke v parametru TileBorderColor).

Obstaja pa bolj zvita možnost, ko enake ploščice mejijo ena na drugo brez sprememb, različne pa se uporabljajo s posebno "prehodno" ploščico. To se običajno naredi, če je zemljevid sestavljen predvsem iz širokih površin ene vrste ozemlja, na primer velikih zelenih površin, in posamezna celica ni pomembna in je igralec ne bi smel opaziti. To je karta Heroes of Might Magic. Če pa se vsaka celica obdeluje ločeno, kot v Civilizaciji, potem ta metoda ni primerna in bolje je jasno ločiti celice med seboj. "Fused" tehnologija (imenovana tudi maska) je podana z vrednostjo TileBorderStyle, ki je enaka tileMasked. O njihovi strukturi bomo govorili drugič - to je precej zapletena tema.

Ploščica

Element zemljevida - predmet razreda TLKITile- ima preprosto strukturo. Na začetku vsebuje: koordinate, sprite, ki ga riše, kodo vrste ploščice (ki določa, kaj imamo tukaj - hrib, puščava, cesta, morje?) in sposobnost teka na smučeh (to je pomembno v večini iger). Zadnja je število enot premikanja, porabljenih za premikanje po tej ploščici zemljišče ekipa. Za neprehodne ploščice je to negativno število.

Drugi parameter - Predmeti, seznam predmetov, ki se nahajajo na tej ploščici (tip TLKIGameObject).

Če želite ugotoviti, na katero celico ste kliknili, ima zemljevid metodo MouseTile(x,y) vrnitev izbrane ploščice.

Metode ploščic vključujejo Je Sosed(Ploščica, Razdalja). Ta funkcija vrne true, če ploščica ni oddaljena več kot celice razdalje od dane ploščice (ta parameter je privzeto enak ena, to pomeni, če preprosto napišete IsNeighbour(Tile), bo funkcija vrnila true za ploščico, ki je neposredno zraven. Za kvadratne mreže se za »sosede« štejejo tudi ploščice, ki mejijo diagonalno.

Funkcije Prvi sosed in NextNeighbor se uporabljajo za preverjanje vseh celic, ki mejijo na dano. Prvi od njih kaže na neko sosednjo celico, drugega pa lahko pokličemo šele po klicu prvega in izda naslednje sosede, enega za drugim.

Naštevanje sosedov

// Poškodovanje celice

postopek TObeliskTile.Damage(dmg: celo število);

če(Objects.Count > 0) in// Morda imamo

// ne več kot en predmet na celico

(Objects.ID > 0) // Pasivni objekti

// ni poškodovan

Dec(Predmeti.Zadetki,

// Samodejno odštej zaščito pred poškodbami

Max(0,dmg-(Predmeti kot TObeliskGameObject).Obramba);

če Objects.Hitsthen Die; // Odstranjujemo mrtve

// Napad z ognjeno kroglo

postopek TObeliskTile.Fireball;

var Sosed: TObeliskTile;

Neighbor:= FirstNeighbour kot TObeliskTile;

Neighbor.Damage(6);

Neighbor:= NextNeighbour kot TObeliskTile;

dokler Sosed = nič; // Dokler ne zmanjka sosedov

Primer je v stranski vrstici »Enumerating Neighbors«. Ta postopek izračuna ognjeno kroglo, ki zadene celico in vse njene sosede.

To je zanimivo: za njeno delo sploh ni važno, imamo šestkotno mrežo ali kvadratno.

Pogosto potrebujemo nekatere druge parametre in običajno razred ploščic, ki sestavljajo zemljevid - potomec TLKITile. Torej v primeru - TObeliskTile je podedovan od TLKITile.

Je pomembno:Če na naš igralni zaslon prinesemo zemljevid s ploščicami, začnejo koordinate in metode TLKIGameObject, povezane z razdaljo, privzeto meriti razdaljo v ploščicah in ne v točkah. Koordinate gumbov, ikon itd. se še naprej meri v slikovnih pikah! Toda ta način je mogoče izklopiti - to je lahko uporabno za strategije v realnem času.

Izbira kartice

Torej, začnimo s pravokotno mrežo (TLKIRectMap), izometrično preslikavo (kotni parametri 0, 1,5). Mreža naj bo narisana (slog tileBorder). Povejmo motorju, da mora biti prikazan ta zemljevid. Doslej so bila vsa potrebna dejanja izvedena brez pisanja ene vrstice kode.

Te operacije je treba izvesti prej inicializacija motorja, kot tudi deklaracija pisave.

Številke bomo, kot prej, razglasili za sprite.

Urejevalnik zemljevidov

Patchwork zemljevid, izometričen.

Tu je kar nekaj težav. Popolnoma enak mehanizem, iste deklaracije ploščic ... Vmesnik, kot je izbira ploščice, nalaganje/shranjevanje itd., je mogoče preprosto narediti standardna sredstva Delphi: nihče nas ne sili, da ga preklopimo na celozaslonski način. Tega tukaj ne bomo analizirali - vse je v datoteki primerov. Primer kode je bil namerno uporabljen najenostavnejši način; Če želite, lahko na primer naredite paleto predmetov in paleto ploščic grafične.

Urejevalnik ima samo dve funkciji, ki ju ne poznamo. Prvi je povsem preprost: je nova funkcija miška, zasnovana posebej za zemljevide s ploščicami. funkcija TLKIRectMap.SelectTile vrne kazalec na točno tisto ploščico, ki je bila kliknjena, tako da lahko preprosto obravnavamo klik.

Toda drugi nov izdelek si zasluži natančnejšo obravnavo.

Pravzaprav obstaja veliko načinov za shranjevanje podatkov in branje podatkov iz njega. Izbrali smo metodo, ki je kodirana v datoteki CannonBase. Cannon je orodje za branje in pisanje predmetov potomcev TCannonObject s preverjanjem tipa in nekaterimi drugimi funkcijami.

Poglejmo si kodo (“Write card”).

Snemanje kartice

postopek TObeliskMap.Save;

var i,j: celo število;

InitSave(FName);

WriteStr(Ime zemljevida);

Write(Map.Width, SizeOf(Map.Width));

Write(Map.Height, SizeOf(Map.Height));

za i:=0 do Zemljevid. Širina-1 narediti

za j:=0 do Zemljevid.Višina-1 narediti

Write(Map.Tiles.Code, SizeOf(integer);

Evo, kako to deluje. Najprej morate datoteko odpreti s posebnim postopkom InitSave, katerega edini parameter je ime datoteke. Nato s posebnim postopkom shranimo glavo za nadzor tipa WriteHeader. Nato po postopku zapišemo vse, kar potrebujemo WriteStr za nize in za vsa druga polja - Pišite(njegov drugi parameter je velikost zapisanih podatkov v bajtih). Po potrebi lahko napišete lastne postopke za polja objektov Shrani z zapisom glave. Na koncu zapremo datoteko s proceduro FinSave.

Vse objekte, ki imajo lastno glavo, je treba deklarirati ločeno. V poglavju Inicializacija modul (izbirni razdelek, ki sledi Izvedba, ki vsebuje ukaze, ki jih je treba izvesti na samem začetku, ob zagonu programa), napišite npr. naslednjo vrstico:

RegisterUserName(tpMap, "TObeliskMap");

TpMap je konstanta, ki jo morate tudi deklarirati. Izenačite ga, recimo, z 1. In v konstruktorju objekta TObeliskMap dodelite vrednost te konstante parametru TypeID.

Zakaj ves ta hrup? Poleg ujemanja tipov dobite eno zelo pomembno prednost.

Če se format datoteke spremeni, recimo zaradi dodajanja novih polj, vam ne bo treba pisati »pretvornikov«, ki pretvarjajo stare datoteke v nove. Vaša koda jih bo samodejno prebrala.

Ta koda bo samodejno inicializirala novo polje kot prazno, če ni shranjeno v datoteki. Datoteko lahko napišete tako, da preprosto dodate vrstico WriteStr(Name) na sam konec.

komentar:Če še vedno ne razumete, čemu je ta postopek namenjen, ne skrbite. Uporabite lahko bolj običajne metode snemanja in shranjevanja. Toda v resnično velikih projektih iger ta pot zagotavlja pomembne prednosti.

Igrajmo

Najprej moramo ustvariti nov razred, izpeljano iz TLKIGameObject. Pogrešali bomo lastnosti starega. V novem razredu morate dodati polja za osnovne karakteristike: doseg, gibanje itd.

Je pomembno: Naš stari parameter hitrosti ostaja pri nas, vendar označuje hitrost kosa, ki se premika po zaslonu, in ne razdalje, ki jo bo prevozil na obrat. Če bi delali strategijo v realnem času, ne bi potrebovali novega parametra, sicer pa ga bomo morali uvesti.

Na našem zaslonu bomo uporabili gumbe TLKIButton v obliki lokostrelcev, mečevalcev, čarovnikov, duhov, vitezov.

Najprej imamo dogovor. Določimo območje umestitve za eno stran kot zgornje tri "črte" zemljevida, za drugo - kot spodnje tri "črte".

Koda deluje takole. Ko pritisnete kateri koli gumb, se aktivira namestitev ustreznega lovca; Klik na nezasedeno polje v območju postavitve postavi figuro tja in onemogoči gumb. Takoj ko so vsi gumbi onemogočeni, se poteza prenese na sovražnika.

Na začetku vsake nove poteze se vsi gumbi znova vklopijo: to se naredi tako, da človek lažje opazi, komu še ni bil podoben. Skladno s tem klik na gumb izbere figuro in takoj, ko se izvede poteza, gumb izgine. Drugi gumb - "Končaj zavoj" - se prikaže šele po fazi postavitve.

Zadnjič smo že izvajali operacije za omogočanje in onemogočanje elementov vmesnika, zato te operacije ne bomo podrobno analizirali - poglejte primer kode.

Premik figure

// Če izbrano celico zasede sovražnik, napademo,

// če smo prosti, se premikamo, če smo zaposleni s svojimi

// ali ovira - prezrite klik

Ploščica:= Map.MouseTile(MouseX, MouseY);

če(Ploščica = nič)// Kliknite zunaj okna igre

potem izhod;

// Premikanje

če(Tile.Objects.Count = 0)

in(Dist(Self)

in ne Premaknjen potem

// Preverimo, če lahko pridemo tja

če ne HasWay (ploščica) potem izhod;

MoveObj(ID, Tile.x, Tile.y);

// Igra je potezna - premaknite se takoj

Premaknjeno:= res;

//

če Napaden potem

Icon.IsVisible:= lažno;

// Napad

če(Tile.Objects.Count > 0)

in(Dist(Self)

in ne Napaden potem

Obj:= Tile.Objects;

// Napadamo samo sovražnike

če Obj.Side = Stran potem izhod;

Obj.škoda(dmg);

Napadeno:= res;

// Če je premik končan, odstranite ikono

če Premaknjen potem

Icon.IsVisible:= lažno;

Premik je obdelan na naslednji način (glejte »Premik figure«). Kliknjena celica se nahaja. Če je na njem sovražnik in je v dosegu, je poškodovan; če je prazen in v dosegu, se kos premakne (če ovire dopuščajo); če je zaseden, vendar ne s sovražnikom, se klik ignorira .

Ko sta se obe strani približali, so zmaji ukrepali. Delujejo zelo preprosto: izberejo najbližjega ne-zmaja, ki je znotraj 7 polj od njih, in napadejo. Oglejte si kodo Dragon Actions.

Zmajeve akcije

// Preverjanje ploščic znotraj 7 polj od zmaja

za i:= največ (0, x - 7) do Najmanj (največja velikost, x + 7) narediti

za j:= največ (0, y - 7) do Najmanj (največja velikost, y + 7) narediti

če (Map.Tiles.Objects.Count > 0) in

(Map.Tiles.Objects.Code>1)

// 0 - koda ovir, 1 - zmaj

potem začeti

// Izbira točke za premikanje

če x=i potem sekira:=i

drugačeče x>i potem sekira:=i+2

drugače sekira:= i-2;

če y=j potem ay:=j

drugačeče je y>j potem ay:= j+2

drugače ay:= j-2;

PremakniObj(NE, sekira, ay);

// Napadimo

Map.Tiles.Damage(12);

// Prekinitev kroga: ne več kot en napad

// vsak zmaj na krog

Nazadnje ostane le še preveriti, ali je več kot polovica obeliskov zasedena s četami ene strani - in če so, ustavite igro in razglasite zmagovalca!


Torej, imamo strateško igro. Za popolno srečo pa v prvi vrsti manjka umetna inteligenca, ki bo igri omogočila enoigralski način ( najenostavnejši postopek Ne štejemo kontrole zmajev). To bomo storili naslednjič. Se vidimo čez en mesec!

V prihodnjih številkah

V naslednjih številkah bomo govorili o:

  • sistemi delcev za prikaz dima, isker itd.;
  • delo s preglednostjo;
  • tridimenzionalni motorji;
  • osnove AI;
  • odpravljanje napak v programu;
  • ustvarjanje načrta igre in scenarija,
  • pisanje projektnega dokumenta;
  • ravnovesje igre;
  • razmišljanje skozi igralne like in njihove linije;
  • delo s Photoshopom in 3D paketi;
  • animacije;
  • glasba in glasovno igranje;
  • in veliko več.

Povsem mogoče se je naučiti, kako narediti vse to z lastnimi rokami. To boste kmalu videli.

Pišite nam…

Za tiste, ki mislite, da je paket mogoče še z nečim dopolniti: prvič, ne pozabite, da ni Končna verzija paket, ampak samo tisti, ki izvaja funkcije, opisane v naših člankih. Morda so nekatere vaše ideje že uresničene in čakajo na vrsto (glejte stransko vrstico »V prihodnjih številkah«). In v vsakem primeru: ko nam ponujate idejo, poskusite utemeljiti, zakaj je vaš predlog uporaben za več iger hkrati, ne le za vašo določeno.

Za samostojno delo

Medtem ko čakate na naslednjo številko, lahko delate na svojem projektu ali pa poskusite izboljšati tega. Tu je nekaj idej za lastno izvedbo:

  • ovire razdelite na uničljive (drevesa in grmovje) in neuničljive (skale) ter poskrbite, da ognjene krogle in zmajev dih požgejo rastlinje;
  • ustvariti jame (rjava celica) ali ogenj, ki gori več zavojev (rdeča celica) na mestu, kjer je bil sprožen napad ognja;
  • dovoli mečevalcem in vitezom, da pokrijejo svoje sosede in jim dajo +1 za obrambo;
  • naj bo gibanje figur na zaslonu gladko.

Kaj če v realnem času?

Nič več ni težko narediti strateške igre v realnem času, če igralcem le daste različna sredstva za vnos. Najlažji način za to je prek omrežja – o tem bomo govorili v eni od prihodnjih številk. Potrebne bodo tudi naslednje spremembe:

  • polje ni potrebno GameSpeed pri razredu TObeliskObject- uporabite hitrost iz osnovnega motorja (hitrost gibanja po zaslonu je enaka hitrosti igre);
  • celoštevilski izračun razdalj je onemogočen;
  • koda gibanja figure je prepisana ob upoštevanju dejstva, da je treba narisati pot okoli ovir;
  • Gumb "konec premika" je odstranjen.

To je vse. Boste poskusili sami?

Vaše podjetje ocenjujem kot eno najmočnejših na trgu svetovalnih storitev pri nas. Všeč mi je, da se dotikaš širokega nabora problemov menedžmenta in jih obravnavaš dovolj kakovostno in poglobljeno. V publikacijah vašega podjetja najdem veliko koristnih informacij, saj se je vedno zanimivo seznaniti z izkušnjami strokovnjakov in se od njih učiti.

Borisyuk Jurij Aleksandrovič, svetovalec uprave, zdravnik tehnične vede

Zelo mi je všeč serija mojstrskih tečajev, ki jih poučujete. Osebno sem, ko sem bil prej vodja tovarne, začel spreminjati svoje pristope k vodenju, vklj. zahvaljujoč informacijam, ki ste jih prejeli od vas. Nekako se je odzvala na to, kar sem naredil in opazil v tovarni. Od takrat sem začel razmišljati o tem, kako neučinkovite so ruske industrijske zmogljivosti in kako ogromen je potencial ter kako ga je mogoče uresničiti. Osebno spoznavanje težav različna podjetja(včasih me prijatelji povabijo kot strokovnjaka) Vidim, koliko se da narediti, kako povečati učinkovitost in učinkovitost.

Drjagin Oleg Borisovič

Da, všeč so mi vaši mojstrski tečaji, zelo sistematičen pristop, poznavanje snovi na visokem nivoju in seveda veliko praktičnih izkušenj pri obravnavani problematiki. Kar me privlači je to Aleksandrova strokovnost in visoka stopnja strokovnega poznavanja tematike mi omogočata, da na že poznane stvari pogledam drugače. Z mojega vidika je to Zelo pomembno in potrebno je pogledati na stvari, ki jih poznaš, na nov način, saj... Med kirurškim delom zelo pogosto postane oko »zamegljeno« in prenehate videti pravzaprav očitne stvari.

Elena Fedash, kadrovska direktorica, ATB Corporation, Dnepropetrovsk.