Skripte za strategiju zasnovanu na potezu. Razvijanje strategije korak po korak. Glavne faze kreiranja strategije

Zdravo svima! Sada ću vam reći kako da napravite jednostavan RTS (RTS - Real Time Strategy, odnosno strategija u realnom vremenu) da otvorite viseću mrežu 8.1 (operabilnost nije zagarantovana na 8.0) kreirate objControl objekat, to jest, ovo će biti naš glavni objekat, kreiranje događaja kreiranja ( Kreiraj) Dodaj događaj => Kreiranje (Dodaj događaj => Kreiraj) događaj kreiranja se radi samo jednom - prilikom kreiranja, kliknuti na karticu kontrole u desnom vertikalnom meniju i desnim tasterom miša kliknuti na Izvrši kod (Izvrši kod) i napišite kod (najbolje je ne kopirati kod, a pisanjem ga sami mnogo lakše pamtite):

200?"200px":""+(this.scrollHeight+5)+"px");">startx=0; //Deklarišemo varijablu za početnu tačku x
starty=0; //Deklarišemo varijablu za početak tačke pomoću y
draw_rect=false; //Ne crtaj selekcioni pravougaonik


Varijabla: dio memorije koji sadrži informacije. Oni imaju svoje ime sa kojim ih možete kontaktirati. Varijable u GML-u mogu sadržavati realan broj ili niz. Na primjer, stol je varijabla, drvena ili staklena vrijednost
Sada kreiramo događaj korak (Korak, Dodaj događaj => Korak) i ponovo izvodimo operaciju (desni klik na Izvrši kod):

200?"200px":""+(this.scrollHeight+5)+"px");">
if mouse_check_button_pressed(mb_left) //Ako se pritisne LMB
{
draw_rect=true; //Nacrtamo pravougaonik
startx=mouse_x; //Početak x pozicija = pozicija x miša
starty=mouse_y; //Početna pozicija = pozicija miša
sa svim odabranim=false; //Ovo još nije deklarirana varijabla, kasnije ćemo saznati što će raditi
}

If mouse_check_button_released(mb_left) //Ako je LMB pušten
{
draw_rect=false; //Ne crtamo pravougaonik
za(i=0;i<=instance_number(par);i+=1) //Читайте про цикл for ниже
{
ii=pronađi_instance(par,i); //Tražimo objekat koji još nije napravljen
if(collision_rectangle(startx,starty,mouse_x,mouse_y,ii,true,false)) //Ovo je naš kolizioni pravougaonik (kontakt)
{
ii.selected=true;
}
}
}

Kôd je velik i složen dok učimo o uslovnoj izjavi if:
Kod sa if se izvršava ovako:

200?"200px":""+(this.scrollHeight+5)+"px");">
ako (uvjet)
{
akcija
}

Također može sadržavati naredbu else (u suprotnom), primjer:

200?"200px":""+(this.scrollHeight+5)+"px");">if (uslov)
{
akcija
}
ostalo
{
akcija 2
}

A za je operator petlje, on se izvršava ovako:

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


Operator for je veoma moćna stvar, puno pomaže u teškim situacijama

Operator - radnje ugrađene u jezik, na primjer, najčešće su int, if, else, string, switch, for, case, break, exit, itd., itd.

Sada kreiramo i događaj crtanja (draw) i pišemo na isti 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);
}

Ovde je sve lako, evo ista stvar samo na ruskom:
ako trebamo nacrtati pravougaonik, tada biramo transparentnost i crtamo pravougaonik
evo argumenata

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


obris - da li će se nacrtati samo ivica (tačno) ili popunjeni pravougaonik (netačno).
Pronašli smo novu riječ - konstantu, ovo je numerički izraz ili kod zamijenjen riječju, viseća mreža ima ugrađene konstante:

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


Pa, shvatili smo, sada treba da kreiramo novi objekat- roditeljski objekat koji će se povezati sa svojim potomcima. Nazovimo ga par (da biste promijenili ime morate promijeniti kod u događaju koraka kontrolnog objekta), upišite u događaj kreiranja:

200?"200px":""+(this.scrollHeight+5)+"px");">selected=false; //Evo naše varijable, da li je objekt odabran

Ovo je sve. Sada nam je, naravno, potreban objekat koji se može kretati, zovemo ga objTest i upisujemo kod u događaj kreiranja:

200?"200px":""+(this.scrollHeight+5)+"px");">gox=x; //Gdje ići...
goy=y; //od y
selected=false; //Nismo odabrani =)
object_set_parent(self,par) //Ovdje je izbor roditelja

Nova akcija:

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

Postavlja roditeljski objekt na objekt pod nazivom ind.
I novi operater: self, to znači da će akcija otići sama sebi
Ne bojte se, ostalo je još malo u step događaju:

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

tematski park:
Trebaće nam:
building sprite
sprite meni
SPRITES RAZLIČITIH DUGMEKA KAO ŠTO su:
srite sa natpisom (gradnja, konstrukcija, gradnja, itd.)
prozor koji se pojavi
građevinski crtež,
1) ostalo ćemo dodati sami
2) riječ falsifikat - stvorio sam, jer morat ćemo ga lažirati da odgovara našem izvoru)
IIL da počnemo:
1) kreirajte sve što je napisano u tački I osim 1)
Kreirajmo globalnu varijablu pod nazivom novac, postavimo bilo koju početnu količinu novca
Takođe ćemo kreirati objekat miša i tastature
Kreirajmo tekst, nazovimo ga info, kreirajmo uvijek događaj i kreirajmo radnju u njemu:
odaberite informacije u odabiru akcije odaberite postavite tekst u tekstu napišite ovo:
"novac: " &(global("novac".
2) dodati meni, glavni zadatak menija nije da se meša, već da pomogne igraču da se snalazi (kako može da ometa? - lako je ako ga postavite u sredinu igre); pre nego što napravimo meni, mi Napravit ćemo novi sloj, koji ćemo nazvati izbornikom, u njegovim proporcijama ( postavke, opcije) u stavku prikaza koju upisujemo:


u njega ćemo dodati sprite i uzeti sliku menija koji je bio u predprodukcijskim materijalima (tačka I) i smjestiti naš meni na osamljeno mjesto gdje se neće miješati, ali će biti vidljiv na ekranu
Postavimo i dugme od predzavršnih materijala (tačka I) sa natpisom BUILD (ili tako nešto)
stavimo ga na jelovnik
Sada idite na Event Sheet Editor
kreirajte događaj (#bla bla bla# - ovo je moja poruka (objašnjenje) samo vama umjesto bla bla bla biće moj komentar za vas; >> - akcija; ll - podjela prozora na primjer:

miš&tastatura ll na objekt kliknut ll levi klik na objekat #vaše dugme menija sa natpisom BUILD (ili tako nešto)##ostalo kasnije (vidi tačku 3)#
3)sada najteži deo(Razlomio sam ovo na dvije tačke da ne bi bilo tako komplikovano),
kreirajte sprite od materijala za završnu obradu "prozor koji će se pojaviti"
onda kreiramo prazan sprite koji se zove p1, pomeramo prozor sa ekrana i stavljamo p1 na mesto gde bi se vaš prozor trebao pojaviti kada pritisnete dugme za izgradnju (ili nešto slično CHVER)
odlično! Sada idite na uređivač listova događaja
Zapišimo nezavršeni događaj do kraja:
Tekst će postaviti tekst ll bla-bla-bla)
miš&tastatura ll na objektu kliknuta ll lijevo kliknu na objekt #vaše dugme menija sa oznakom BUILD (ili nešto slično)#>>
4)Drugi dio najtežeg dijela:
napravimo sprite u kojem će biti nacrtana slika zgrade (predzavršni materijali), nazovimo ga h1
napravimo prazan sprite, nazovimo ga p2, sada ga postavite na mjesto gdje treba da se otvori prozor,
Kreirajmo sprite, također prozor (predzavršni materijali), u prozoru ćemo lijepo napisati naziv zgrade, njenu cijenu i opis (opcionalno) i nazvati je i1
napravimo još jedan prazan sprite koji se zove p3, postavimo ga pored p2, samo tako da dodiruje p2 samo gornjim levim uglom
Sada kreirajmo nekoliko događaja, ali prvo napravimo od prethodnog događaja jednu novu akciju:
miš&tastatura ll na objekt kliknut ll levi klik na objekat #dugme tvog menija sa natpisom BUILD (ili tako nesto)#>> sistem ll kreira objekat u odnosu na objekat ll #vas prozor# #broj sloja pod imenom meni# # X ;Y-ne mijenjaj# u objekt p1
>>sistem će kreirati objekat u odnosu na objekat ll #vaš drugi prozor# #broj sloja ispod menija imena# #X;Y-ne menjati# u objekat p2
Takođe moramo da mu vratimo događaj:
kopirajte događaj i okrenite ga
novi događaj
mouse&keyboard ll je iznad objekta ll h1>>sistem ll kreira objekt u odnosu na objekt ll i1 #broj sloja ispod menija imena# #X;Y-ne mijenjati# u objekt p3
Napravimo sprite sa zgradom (koristimo materijale za pretproizvodnju) i nazovimo ga kućom
Napravimo prozor u kojem će se naše zgrade pojaviti kada se izaberu u meniju, nazovimo ga rlo
događaji:
miš&tastatura ll na objekt kliknuta ll lijevo klikne na h1>>sistem će kreirati objekt u odnosu na objekt ll kuća #broj sloja ispod menija imena# #X;Y-ne mijenjati# u objekt rlo
>> sistem ll oduzeti od vrijednosti ll #iznos novca koji treba oduzeti tokom izgradnje#
Sada je bilo nemoguće izgraditi događaj
Ja ću ti reći svoje bivši način zabrane (kada završim s pisanjem istražit ću još jednu metodu zbog koje sam pocrvenio kada sam se sjetio igre svijeta tematskog parka)
događaji:
kuća ll u sudaru sa drugim objektom ll do kuće
>>kuću ću uništiti
>> sistem ll oduzeti od vrijednosti ll - #udvostručiti iznos novca koji je oduzet tokom izgradnje##napomena koju morate staviti - količina#
u suštini sve.
III šta želim da kažem:

Bio sam jako uznemiren zbog kolapsa moje igre.To je bila strateska igra, i ovaj clanak je sastavljen po svojoj shemi.Molim vas da ne kritikujete previse, dugo sam pisao, ako nadjete greske u govoru pišite i ispravite ih
a ovdje je i izvorni kod za vaše zadovoljstvo gledanja, pogledajte, u principu je sve isto kao što je ovdje napisano, samo što je ovo bila demo verzija igre. Glavna stvar je da ništa ne mijenjate, inače će biti greška !
koristi, eksperimentiraj, provjeri, radi šta hoćeš, meni je u redu

KaMiKaZa:
Svi “sistemski” izrazi moraju biti uključeni u oznaku “Code”.
Onda mislim da će biti bolje.
Takođe, čini mi se da snimci ekrana ovde ne bi škodili. I također izvorni kod, za početnike.

tematski park:
Ne znam kako da napravim screenshotove događaja.

Pa, to nije potrebno.

iamnp:
theme_park , postoji posebno dugme na tastaturi - PrintScreen

tematski park:
Znam da neki ljudi to rade drugačije. Štaviše, svako ima svoj duh
i ako postavim sve ove duhove, malo ljudi će razumjeti.
Pa, možda će neko dati plus? Nije ni čudo što sam se mučio?

burlachenko:
Da bi takva lekcija ikome bila zanimljiva, treba je u skladu s tim formatirati, ali ovdje “kako je bilo”.
A ipak, ako želite, malo po malo, kada budete imali vremena, molimo vas da ga “uljepšate”.

tematski park:
ok, vratit ću se iz škole i spremiti se.
PS. dodani izvor

Serega Lebedev:

iamnp, kuda idu ovi snimci ekrana kasnije?

KaMiKaZa:

U međuspremnik.
Idi na bilo koji uređivač teksta, i izvršite operaciju "Zalijepi" ili pritisnite Ctrl+V.

Malo je vjerovatno da ću se u ovom članku dotaknuti bilo čega nepoznatog. Sve kalkulacije su jednostavne i razumljive svima koji znaju šta je Ajax. Već sam napisao članak o tome kako kombinirati klijenta sa serverom u igrama u realnom vremenu (). U ovom članku bavim se istim problemima koji se odnose na igrice zasnovane na potezu.

Pa šta je turn based game? Sljedeća definicija se može naći na Wikipediji strategija zasnovana na potezu - ovo je žanr kompjuterske igrice, čija je glavna karakteristika da se igrači naizmjenično kreću u potezima, za razliku od strategije u realnom vremenu. Ja bih malo pojednostavio ovu definiciju:

  • Strategija korak po korak - je potezna strateška igra.
  • Strateška igra - Ovo je žanr igara u kojima je ključ za postizanje pobjede planiranje i strateško razmišljanje..
  • Igra na potezu - je žanr igara čija je glavna karakteristika da igrači naizmjenično prave poteze.
Igre na potezu uključuju:
  • Strategije zasnovane na potezu
  • Kartaške igre
  • Društvene igre (šah, go, monopol, itd.)
Napominjem da igrice zasnovane na potezu nameću manje ograničenja na složenost protokola interakcije u poređenju sa igrama u realnom vremenu. Naime, vrijeme reakcije na određeni događaj ne igra ključnu ulogu. Igraču se obično daje 10 sekundi da donese odluku. Čak i ako je ping gigantski, recimo 3 sekunde, onda igrač i dalje ima 7 sekundi za razmišljanje. Osim toga, ping može skakati i skakati, ali nas to uopće ne zanima (u igrama u realnom vremenu ova situacija praktički ubija svaki protokol).

Obično (u 95% poteznih igara) tačno jedan igrač donosi odluku u bilo kom trenutku. Samim tim, broj zahtjeva na koje moramo adekvatno odgovoriti je sužen.

Stoga ćemo se prilikom kreiranja protokola prvenstveno fokusirati na jednostavnost njegove implementacije i podrške. Ovo će nam omogućiti da ostvarimo veći profit za manje vremena.

Gornje obrazloženje se zasniva na dvomjesečnom razvoju određene kartaške igre.

Pametan ili glup klijent?

Prvo, odlučimo koliko “pametan” može biti naš klijent. Raspravljam da li je vredno duplicirati logiku aplikacije (pravila igre) na klijentu. Naravno, server mora biti pametan da spriječi potencijalno hakovanje aplikacije. Ali isplati li se klijenta podučavati poslovnoj logici?

Ovo direktno zavisi od toga koliko je puna količina podataka o stanju vaše igre teška. Ako je ova količina podataka velika, dugo se prikuplja na serveru i prenosi do klijenta, onda ima smisla implementirati dio logike na klijenta kako bi se server rasteretio. Na primjer, u Civilizationu mjera korištene memorije je uvijek van liste. Možete li kreirati nešto slično, ostavljajući samo korisničko sučelje na klijentu?

S druge strane, što je klijent pametniji, razvoj igre će biti skuplji. Napominjem da vrijeme razvoja servera ni na koji način ne ovisi o erudiciji klijenta. Čak i ako je klijent super-duper-mega pametan, ako korisnik želi ponovo učitati prozor pretraživača, server će morati prikupiti i sastaviti sve podatke o igri kako bi ih prenio na klijenta. A la "Učitavanje sačuvane igre". Zaključak: Pametan klijent može ubrzati aplikaciju, ali će uvijek zahtijevati dodatne resurse za razvoj aplikacije.

Predlažem sljedeće test:

1. Da li jačina kanala dozvoljava?

Procijenite prosječnu težinu pune količine podataka o stanju igre. Zatim pomnožite sa prosječnim brojem zahtjeva do servera u sekundi. Ako rezultirajući broj premašuje kapacitet odlaznog kanala podataka, glupi klijent je neprihvatljiv. Ako ovaj broj prelazi 20% odlaznog kanala, onda biste trebali razmisliti da li će to raditi?

2. Da li je radno intenzivan?

Procijenite složenost algoritma za prikupljanje podataka igre (u djelićima sekunde). Ovdje uzmite u obzir sve upite bazi podataka. Zatim pomnožite sa prosječnim brojem zahtjeva do servera u sekundi. Ako vrijeme prelazi jednu sekundu, glupi klijent je neprihvatljiv. Ako ovaj broj prelazi 200 ms, onda treba razmisliti da li će trajati?

nastavak:

Formiranje strategije
Ne možete vjerovati amaterima:
njihovi planovi mogu neočekivano uspjeti,
i niko nije spreman za ovo.

(A. Cuningham)

U prethodna dva broja saznali smo napravite jednostavne 2D igre, kontrolirajte spriteove, skrolujte po ekranu igre, pratite kolizije objekata igre, napravite interfejs (dugmad, miš, tastatura, tekstualne oblasti) i radite u režimima preko celog ekrana i prozora. Sve je to urađeno na primjeru arkadne igre.

Ovog puta prelazimo sa arkadnih igara na "ozbiljniji" žanr - strategije. Ovdje ćemo morati savladati čitav niz novih mehanizama, ali ni ovdje neće biti ništa komplikovano. U ovom članku mi Hajde da proučimo strukturu strategije zasnovane na potezu(i takođe strategija u realnom vremenu- još je lakše to učiniti s LKI-Creatorom) i napravit ćemo igru ​​kao primjer, dizajniranu, međutim, samo za višekorisnički način rada (i također editor mapa za nju). O singleplayer modu ćemo se pozabaviti u sljedećem broju naše rubrike - posvećenoj osnove umjetna inteligencija .

Pošto je ovo već treća lekcija, nećemo ulaziti u detalje sve primjer koda - na sreću, mnogo toga je urađeno potpuno isto kao i prethodna dva puta. Za referencu, postoji primjer programa (u njemu ima mnogo komentara) i prethodni članci.

Pa, materijale sa naših prošlih časova možete pronaći na našoj CD, u odjeljku "Uradi sam" koji je posebno kreiran za ovu svrhu.

Formulacija problema

Napišimo stratešku igru ​​koja se sastoji od bitke između dvije fantazijske vojske. Cilj bitke je zarobiti nekoliko obelisci, postavljen na karti. Prije bitke raspoređujemo naše trupe koje se sastoje od 6 mačevaoci, 4 strijelci, 2 vitezovi, 2 mađioničari i 1 duh, unutar teritorije koja nam je dodijeljena. Osim njih, na mapi se nalaze i neutralni zmajevi.

Karakteristike boraca
Fighter Pokret Hits Domet Šteta Zaštita Mogućnosti
Mačevalac4 8 1 7 2 -
Archer4 5 7 5 1 -
vitez3 15 1 9 4 Iscjeljenje, Knight's Strike
Mage3 12 5 6 0 Vatrena lopta
Ghost4 7 2 5 5 Regeneracija
Zmaj6 30 2 12 5 Let

Karakteristike boraca prikazane su u tabeli. Tretman- ovo je pravo da izliječite susjednog ratnika (osim duha) do punog zdravlja jednom po bitci. Knight's Strike- pravo na nanošenje trostruke štete jednom po utakmici. Vatrena lopta- mađioničarev napad uklanja hitne tačke ne samo sa neposredne mete, već i sa okolnih polja. Regeneracija- oporavak od 1 pogotka po okretu. Let- pravo kretanja preko prepreka.

Igra se u multiplayer modu, u verziji Hot Seat (igra se sa jednog kompjutera, jedan po jedan). Nakon što se igrači okrenu, neutralni zmajevi napadaju, napadaju bilo kojeg neprijatelja u radijusu od 7 ćelija.

Zabava se završava kada jedna strana ili uhvati više od polovine obeliska prisutnih na mapi ili u potpunosti umre.

Mapa je prvobitno postavljena u editoru mapa. Postoje obelisci, zmajevi i prepreke (objekti kroz koje se ne možete kretati ili napadati).

Priprema za posao

Prije nego što počnemo, morat ćemo ponovo instalirati paket LKI-Kreator. Činjenica je da je u odnosu na prošli put napravljeno mnogo izmjena i dopuna.

(Nadam se da Delphi već ste instalirali; ako ne, onda pročitajte preporuke na ovu temu u našem prethodnom članku - u junskom broju časopisa ili na CD-u ovog broja ili na web stranici.)

Važno je: prethodna verzija LKI-Creator-a imala je problema sa kompatibilnošću sa novim verzijama Delphija. U ovoj verziji oni su eliminisani.

Uzmite datoteku s programskim tekstovima i slikama s našeg CD-a (odjeljak “Igra vlastitim rukama”) i raspakirajte je u direktorij projekta.

Sada možete preuzeti potrebne datoteke odavde .

Trebali bismo imati tri poddirektorijuma. One - Units - pohranjuje DirectX biblioteke i module LKI-Creator paketa. U drugom - Projektu - mi ćemo raditi; slike koje će nam trebati stavljamo tamo unaprijed, i prethodna verzija naša arkada. U trećem - Escort - gotov program u kojem trebamo uspjeti.

Sada instalirajmo (reinstalirajmo) LKI-Creator. U Delphi meniju otvorite stavku Komponenta i izaberite Instaliraj komponentu. Ako ste već instalirali ovaj paket, ostanite na kartici U postojeći paket, u suprotnom idite na karticu U novi paket i popunite prazne redove kao što je prikazano na slici (u gornjem redu, najlakši način je da odaberete LKI2dEngine. pas datoteku koristeći dugme Browse, a na dnu samo zapišite LKI). Zatim kliknite OK i odaberite Instaliraj. IN gornji panel Delphi trebalo bi da vidite karticu LKI.

Sada ostaje samo da učitamo naš projekat. U meniju Datoteka izaberite Otvori, otvorite datoteku Project\Obelisk.dpr…

Gdje je mapa, Billy? Treba nam mapa!

Međutim, prije nego što pređemo na velike stvari, morat ćemo još malo poraditi na grafičkom motoru.

U Star Escort-u, našem prethodnom projektu, “mapa” nije imala značenje: zvezde su postavljene nasumično i nisu uticale ni na šta, a položaj drugih objekata je ili direktno specificiran u kodu ili određen slučajno. Ovo nije prikladno za svaki projekat. To znači da je vrijeme da dodamo svoj motor mapa područja.

Vjerovatno već možete pretpostaviti kako će to izgledati - stavljamo objekt mape u prozor projekta, a zatim ga registrujemo u svojstvu Mapa naš motor.

Tako je to... ali imamo više od jedne klase kartica. Pogledajmo izbliza...

Vrste kartica

Mapa se sastoji od nečega pejzaž I objekata instaliran na njemu. Pejzaž se najčešće (ali ne uvijek) dijeli na ćelije tzv pločice- pločice.

Kao što znamo iz školskog kursa geometrije, ravan se može prekriti bez praznina ili preklapanja pravilnim poligonima tri vrste: trougao (jednakostraničan), kvadrat, šestougao. Trokutasta polja nisu posebno zgodna, pa se češće koriste kvadratne ćelije ili šesterokuti.

U određenom smislu, život s kvadratima je lakši: ako imamo dvodimenzionalni niz ćelija, odmah je jasno kako pronaći ćelije u susjedstvu date ćelije. To su +1 i -1 za svaki od dva indeksa. Sa šesterokutima je sve malo složenije... ali heksagonalna ploča ima vrlo vrijedno svojstvo: svi smjerovi u njoj su isti. To nije slučaj s kvadratnom mrežom: dijagonale se značajno razlikuju od horizontala i vertikala. Stoga, za ozbiljne strateške proračune, heksagoni mogu biti bolji od kvadrata.

Postoje i kartice bez pločica. LKI-Creator podržava dva tipa: graf i patchwork.

Grafička karta je karta na kojoj samo nekoliko ključnih tačaka ima značenje, plus možda posebna područja (na primjer, neprohodna), a ostalo je samo obrazac koji nema efekta igre. Ovako se često prave mape zvezda, kao, recimo, u Master of Orionu: zvezde i crne rupe su ključne tačke, ostalo je pozadina. U ovom načinu rada ponekad prave globalne karte, na primjer, za igru ​​uloga.

Patchwork mapa je podijeljena na područja, a unutar područja su sve tačke iste, ne možete se kretati duž "patchworka". Ovo je dobro za globalne strategije, gde je provincija minimalna jedinica teritorije.

Na slikama se nalaze primjeri karata iz raznih igara, koji označavaju vrstu.

Dakle, većina dvodimenzionalni karte (trodimenzionalne - poseban članak) mogu se podijeliti u četiri klase:

  • Pravougaona- TLKIRectMap. Ovo je popločana karta, ćelije su kvadrati. Takva karta, na primjer, u Civilization III.
  • Hexagonal- TLKIHexMap. Popločana karta sa heksagonalnim ćelijama. Koristi se u mnogim ratnim igrama, i ne samo: ovako je, na primjer, tradicionalno napravljena borbena karta Heroes of Might & Magic.

    Ove dvije vrste kartica su potomci opšte klase TLKITileMap.

  • Graphovaya- TLKIGraphMap. Ova kartica ima pozadina (svojstvo pozadine) a ključne tačke istaknute na njemu su statični objekti. Položaj drugih objekata na ovoj karti izražava se ili običnim koordinatama (kao svemirski brod u međuzvjezdanom prostoru) ili upućivanjem na objekt (isti brod u orbiti planete). Ovo su karte Master of Orion, Arcanum (global) i tako dalje.
  • Patchwork- TLKIClusterMap. Ima svojstvo pozadine, kao što je grafikon, i drugo svojstvo - maska, koji određuje koja tačka pripada kojoj regiji i svojstvo Granice, koji definiše veze između "komada". Ovako su raspoređene karte, na primjer, u srednjem vijeku: Totalni rat ili Viktorija.

Važno je: klase mapa nisu opisane u modulu LKI2dEngine, već u LKI2dMap.

Uglovi nagiba

Ali ako mislite da se ovim iscrpljuju mogućnosti LKI-Creator-a za prikazivanje karata, onda se jako varate.

Karta se može predstaviti pogled odozgo ili izometrijski- gledati pod uglom u odnosu na vertikalu. Na primjer, karta Civilization III ili Heroes of Might & Magic IV je izometrijska, ali Civilization I usvaja pogled odozgo prema dolje.

Tipično, izometrija se koristi za popločane karte, dok se karte grafova koriste sa pogledom odozgo, budući da je skala grafskih mapa obično manja. Ali postoje izuzeci: na primjer, u Medieval: Total War postoji patchwork izometrijska mapa.

Svojstvo mape je odgovorno za izometričnost Isometric i dva parametra koja određuju ugao pod kojim naša kamera gleda: Phi I Theta.

Prvi je odgovoran za rotaciju karte u odnosu na vertikalnu os: na primjer, ako je postavite na 45 stupnjeva (mjeri se u stupnjevima), tada će pravokutna ćelija mreže biti orijentirana pod uglom prema gore, kao u Civilization . Kod Phi=0, jedna od strana ćelije će biti horizontalna.

Drugi kontroliše nagib kamere u odnosu na vertikalu. Radi praktičnosti, dat je kao omjer horizontalnih i vertikalnih jedinica dužine. Recimo, ako želimo da naša ćelija bude nacrtana po visini upola manjoj od širine, trebamo postaviti Theta na 2.

Kod popločane karte nije nam dozvoljeno da biramo ove uglove proizvoljno: na kraju krajeva, mi (još) nemamo 3D. Oni direktno zavise od parametara pločica. Na primjer, ako imamo os u obliku dijamanta sa uglom prema gore, a vertikalna os je upola manja od horizontalne ose, tada moramo postaviti parametre 45 i 2.

Ali grafske i patchwork karte daju vam pravo da dodijelite ove parametre kako želite (pa čak i, ako želite, promijenite ih u procesu), ali ne biste se trebali zanositi s tim - pored činjenice da takvi zaokreti zahtijevaju mnogo vremena, takođe ne izgledaju baš cool. I ne zaboravite da ako je vaša karta umjetnička, sa slikama, natpisima itd., onda će se okretati s njom... Općenito, ponekad je lakše nacrtati patchwork mapu uzimajući u obzir potrebnu rotaciju - na sreću, udaljenosti često tu ne igraju nikakvu ulogu.

Zglobovi

Patchwork mapa, pogled odozgo.

Tile mape imaju još jedan problem - spajanje pločica. Njime se upravlja pomoću parametra TileBorderStyle. Najčešće ovo tileStraight, način u kojem se pločice jednostavno uklapaju bez ikakvih rubnih efekata, ili tileBorder, u kojem su povučene linije koje odvajaju jednu pločicu od druge - granice ćelija (u drugom slučaju, ne zaboravite definirati boja rešetke u parametru TileBorderColor).

Ali postoji lukavija opcija, kada su identične pločice jedna uz drugu bez promjena, a različite se koriste pomoću posebne "prijelazne" pločice. To se obično radi ako se mapa sastoji uglavnom od širokih prostranstava jedne vrste teritorije, recimo, velikih zelenih površina, a pojedinačna ćelija nije važna i igrač ne bi trebao da je primijeti. Ovo je karta Heroes of Might Magic. Ali ako se svaka ćelija obrađuje zasebno, kao u Civilizaciji, onda ova metoda nije prikladna i bolje je jasno odvojiti ćelije jednu od druge. “Fused” tehnologija (također tzv maska) je specificirano vrijednošću TileBorderStyle jednakom tileMasked. O njihovoj strukturi ćemo govoriti drugi put - ovo je prilično složena tema.

Pločice

Element karte - objekat klase TLKITile- ima jednostavnu strukturu. U početku sadrži: koordinate, sprite koji ga crta, šifru tipa pločice (koja određuje šta imamo ovdje - brdo, pustinju, put, more?) i sposobnost prelaska na teren (ovo je relevantno u većini igara). Posljednji je broj jedinica kretanja koje se troše na kretanje kroz ovu pločicu zemljište odred. Za neprohodne pločice ovo je negativan broj.

Još jedan parametar - Objekti, popis objekata koji se nalaze na ovoj pločici (tip TLKIGameObject).

Da biste saznali na koju ćeliju ste kliknuli, mapa ima metodu MouseTile(x,y) vraćanje odabrane pločice.

Metode pločica uključuju IsNeighbour(Pločica, Udaljenost). Ova funkcija vraća true ako pločica nije udaljena više od ćelije udaljenosti od date pločice (po defaultu ovaj parametar je jednak jedan, to jest, ako jednostavno napišete IsNeighbour(Tile), funkcija će vratiti true za pločicu koja je neposredno susjedna Za kvadratnu mrežu, one pločice koje se graniče dijagonalno također se smatraju „susjedima“.

Funkcije FirstNeighbour I NextNeighbor se koriste za provjeru svih ćelija u susjedstvu date. Prvi od njih pokazuje na neku susednu ćeliju, a drugi se može pozvati tek nakon pozivanja prve i daje sledeće susede, jednog po jednog.

Popis komšija

// Izazivanje oštećenja ćelije

procedura TObeliskTile.Damage(dmg: cijeli broj);

ako(Objects.Count > 0) i// Možda imamo

// ne više od jednog objekta po ćeliji

(Objects.ID > 0) // Pasivni objekti

// nije oštećeno

Dec(Objects.Hits,

// Automatski oduzmite zaštitu od oštećenja

Max(0,dmg-(Objekti as TObeliskGameObject).Odbrana);

ako Objects.Hitshen Die; // Uklanjamo mrtve

// Napad vatrenom loptom

procedura TObeliskTile.Fireball;

var Susjed: TObeliskTile;

Neighbor:= FirstNeighbour kao TObeliskTile;

Neighbor.Damage(6);

Neighbor:= NextNeighbour kao TObeliskTile;

do Susjed = nula; // Dok ne ponestane komšija

Primjer je u bočnoj traci „Nabrajanje susjeda“. Ova procedura izračunava vatrenu loptu koja pogađa ćeliju i sve njene susjede.

Ovo je zanimljivo: za njen rad to uopšte nije važno, imamo heksagonalnu ili kvadratnu rešetku.

Često su nam potrebni neki drugi parametri, a obično klasa pločica koje čine mapu - potomak TLKITile. Dakle, u primjeru - TObeliskTile je naslijeđen od TLKITile.

Važno je: Ako unesemo popločanu mapu na naš ekran igre, koordinate, kao i metode TLKIGameObject koje se odnose na udaljenost, po defaultu počinju mjerenje udaljenosti u pločicama, a ne u tačkama. Koordinate dugmadi, ikona itd. i dalje se mjeri u pikselima! Ali ovaj način rada se može isključiti - to može biti korisno za strategije u stvarnom vremenu.

Odabir kartice

Dakle, počnimo s pravokutnom rešetkom (TLKIRectMap), izometrijskim mapiranjem (ugaoni parametri 0, 1.5). Neka bude nacrtana mreža (stil tileBorder). Recimo motoru da bi ova konkretna mapa trebala biti prikazana. Do sada su sve potrebne radnje obavljene bez pisanja ijedne linije koda.

Ove operacije se moraju obaviti prije inicijalizacija motora, kao i deklaracija fonta.

Figurice ćemo, kao i do sada, proglasiti kao sprite.

Editor mapa

Patchwork mapa, izometrijska.

Ovdje ima dosta poteškoća. Potpuno isti motor, iste deklaracije pločica... Interfejs, poput odabira pločice, učitavanja/snimanja, itd., može se lako napraviti standardnim sredstvima Delphi: niko nas ne tera da ga prebacimo u režim preko celog ekrana. Nećemo ovo analizirati ovdje - sve je u datoteci primjera. Primjer koda namjerno korišten najjednostavniji način; Ako želite, možete, na primjer, napraviti grafičku paletu objekata i paletu pločica.

Urednik ima samo dvije funkcije koje su nam nepoznate. Prvi je prilično jednostavan: jeste nova funkcija miš dizajniran posebno za popločane karte. Funkcija TLKIRectMap.SelectTile vraća pokazivač na tačnu pločicu na koju je kliknut, tako da možemo lako upravljati klikom.

Ali drugi novi proizvod zaslužuje pažljivije razmatranje.

U stvari, postoji mnogo načina za spremanje podataka i čitanje podataka iz njih. Odabrali smo metodu kodiranu u datoteci CannonBase. Cannon je alat za čitanje i pisanje objekata potomaka TCannonObject sa provjerom tipa i nekim drugim karakteristikama.

Pogledajmo kod (“Pisanje kartice”).

Snimanje kartice

procedura TObeliskMap.Save;

var i,j: cijeli broj;

InitSave(FName);

WriteStr(Ime mape);

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

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

za i:=0 to Mapa.Širina-1 uradi

za j:=0 to Mapa.Visina-1 uradi

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

Evo kako to funkcionira. Prvo morate otvoriti datoteku pomoću posebne procedure InitSave, čiji je jedini parametar ime datoteke. Zatim spremamo zaglavlje za kontrolu tipa pomoću posebne procedure WriteHeader. Zatim zapisujemo sve što nam je potrebno koristeći proceduru WriteStr za nizove, i za sva ostala polja - Pisati(njegov drugi parametar je veličina zapisanih podataka u bajtovima). Po potrebi možete napisati vlastite procedure za objektna polja Sačuvaj sa zapisom u zaglavlju. Na kraju zatvaramo datoteku sa procedurom FinSave.

Svi objekti koji imaju svoje zaglavlje moraju se posebno deklarirati. U poglavlju Inicijalizacija modul (opcijski odjeljak koji dolazi nakon Implementacija, koji sadrži naredbe koje se moraju izvršiti na samom početku, prilikom pokretanja programa), trebali biste napisati sljedeći red, na primjer:

RegisterUserName(tpMap, "TObeliskMap");

TpMap je konstanta koju također morate deklarirati. Izjednačite ga, recimo, sa 1. I u konstruktoru TObeliskMap objekta, dodijelite vrijednost ove konstante parametru TypeID.

Zašto sva ova gužva? Osim podudaranja tipova, dobijate jednu vrlo važnu prednost.

Ako se format datoteke promijeni, recimo, zbog dodavanja novih polja, nećete morati pisati nikakve "konvertore" koji pretvaraju stare datoteke u nove. Vaš kod će ih automatski pročitati.

Ovaj kod će automatski inicijalizirati novo polje kao prazno ako nije sačuvano u datoteci. I možete napisati datoteku jednostavnim dodavanjem WriteStr(Name) reda na sam kraj.

komentar: Ako još uvijek ne razumijete čemu služi ovaj proces, ne brinite. Možete koristiti konvencionalnije metode snimanja i čuvanja. Ali u zaista velikim projektima igara, ovaj put pruža značajne prednosti.

Zaigrajmo

Prije svega trebamo kreirati nova klasa, izvedeno iz TLKIGameObject. Nedostajaće nam svojstva starog. U novu klasu morate dodati polja za glavne karakteristike: domet, kretanje i tako dalje.

Važno je: Naš stari parametar brzine ostaje kod nas, ali on pokazuje brzinu kretanja komada po ekranu, a ne udaljenost koju će prijeći po okretu. Kada bismo pravili strategiju u realnom vremenu, ne bi nam trebao novi parametar, ali u suprotnom ćemo ga morati uvesti.

Na našem ekranu ćemo primijeniti TLKIButton dugmad u obliku strijelaca, mačevalaca, mađioničara, duhova, vitezova.

Prvo imamo aranžman. Definirajmo zonu postavljanja za jednu stranu kao gornje tri “linije” karte, za drugu – kao donje tri “linije”.

Kod radi ovako. Kada pritisnete bilo koji od gumba, aktivira se instalacija odgovarajućeg borca; Klikom na nezauzeti kvadrat u području za postavljanje figuru se tamo postavlja i onemogućuje dugme. Čim su sva dugmad onemogućena, potez se prenosi na neprijatelja.

Na početku svakog novog poteza, svi gumbi se ponovo uključuju: to je učinjeno kako bi čovjek lakše primijetio na koga još nije ličio. Shodno tome, klikom na dugme odabire se figura, a čim se napravi potez, dugme nestaje. Drugo dugme - "Završi skretanje" - pojavljuje se tek nakon faze postavljanja.

Prošli put smo već radili operacije za omogućavanje i onemogućavanje elemenata interfejsa, tako da ovu operaciju nećemo detaljno analizirati - pogledajte primjer koda.

Pokret figure

// Ako je odabrana ćelija zauzeta od strane neprijatelja, napadamo,

// ako smo slobodni, krećemo se, ako smo zauzeti svojim

// ili prepreka - zanemarite klik

Tile:= Map.MouseTile(MouseX, MouseY);

ako(Clopa = nula)// Kliknite izvan prozora igre

onda Izlaz;

// Kretanje

ako(Tile.Objects.Count = 0)

i(Udaljenost (Self)

i ne Preseljeno onda

// Hajde da proverimo da li možemo da stignemo tamo

ako ne HasWay (pločice) onda Izlaz;

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

// Igra je bazirana na potezu - kreni odmah

Premješteno:= istina;

//

ako Napadnut onda

Ikona.IsVisible:= false;

// Napad

ako(Tile.Objects.Count > 0)

i(Udaljenost (Self)

i ne Napadnut onda

Obj:= Tile.Objects;

// Napadamo samo neprijatelje

ako Obj.Side = Strana onda Izlaz;

Obj.Damage(dmg);

Napadnuto:= istina;

// Ako je premještanje završeno, uklonite ikonu

ako Preseljeno onda

Ikona.IsVisible:= false;

Pomicanje se obrađuje na sljedeći način (pogledajte “Pokret komada”). Kliknuta ćelija se nalazi. Ako je na njoj neprijatelj, a oni su u dometu, on je oštećen; ako je prazna i u dometu, figura se pomiče (ako prepreke dozvoljavaju); ako je zauzeta, ali ne od strane neprijatelja, klik se zanemaruje .

Kada su se obje strane približile, zmajevi su djelovali. Oni djeluju vrlo jednostavno: biraju najbližeg nezmaja koji je unutar 7 kvadrata od njih i napadaju. Pogledajte kod Dragon Actions.

Dragon Actions

// Provjeravanje pločica unutar 7 kvadrata od zmaja

za i:= Max(0, x - 7) to Min(MaxSize, x + 7) uradi

za j:= Max(0, y - 7) to Min (maksimalna veličina, y + 7) uradi

if (Map.Tiles.Objects.Count > 0) i

(Mapa.Tiles.Objects.Code>1)

// 0 - šifra prepreke, 1 - zmaj

onda početi

// Odabir tačke za pomicanje

ako x=i onda ax:=i

ostalo ako je x>i onda ax:=i+2

ostalo ax:= i-2;

ako y=j onda ay:=j

ostalo ako je y>j onda ay:= j+2

ostalo ay:= j-2;

MoveObj(NE, sjekira, ay);

// Hajde da napadnemo

Map.Tiles.Damage(12);

// Prekidanje ciklusa: ne više od jednog napada

// svaki zmaj po rundi

Konačno, ostaje samo provjeriti da li je više od polovine obeliska zauzeto trupama jedne strane - i ako jesu, onda prekinuti igru ​​i proglasiti pobjednika!


Dakle, imamo stratešku igru. Međutim, za potpunu sreću, ono što nedostaje, prije svega, je umjetna inteligencija, koja će omogućiti da igra ima mod za jednog igrača ( najjednostavniji postupak Ne računamo kontrolu zmajeva). To ćemo uraditi sljedeći put. Vidimo se za mesec dana!

U budućim izdanjima

U narednim brojevima pričaćemo o:

  • sistemi čestica za prikazivanje dima, varnica, itd.;
  • rad sa transparentnošću;
  • trodimenzionalni motori;
  • AI osnove;
  • otklanjanje grešaka u programu;
  • kreiranje plana i scenarija igre,
  • pisanje projektnog dokumenta;
  • balans igre;
  • promišljanje kroz likove iz igre i njihove linije;
  • rad sa Photoshop i 3D paketima;
  • animacije;
  • muzika i glasovna gluma;
  • i mnogo više.

Sasvim je moguće naučiti kako sve to učiniti vlastitim rukama. Uskoro ćete to vidjeti.

Pišite nam…

Za one koji misle da se paket može nečim dopuniti: prvo, ne zaboravite da nema Finalna verzija paket, ali samo onaj koji implementira funkcije opisane u našim člancima. Možda su neke od vaših ideja već implementirane i čekaju na red (pogledajte bočnu traku „U budućim izdanjima“). I u svakom slučaju: kada nam nudite ideju, pokušajte da obrazložite zašto je vaš prijedlog koristan za više igara odjednom, a ne samo za vašu konkretnu.

Za samostalan rad

Dok čekate sljedeći broj, možete raditi na svom projektu ili možete pokušati poboljšati ovaj. Evo nekoliko ideja za vlastitu implementaciju:

  • podijelite objekte s preprekama na uništive (drveće i grmlje) i neuništive (kamene), i pobrinite se da vatrene lopte i zmajev dah spale vegetaciju;
  • stvoriti jame (smeđa ćelija) ili vatru koja bukti nekoliko okreta (crvena ćelija) na mjestu gdje je požar pokrenut;
  • dozvoliti mačevaocima i vitezovima da pokriju svoje susjede, dajući im +1 za odbranu;
  • učinite kretanje figura na ekranu glatko.

Šta ako u realnom vremenu?

Nije teže napraviti stratešku igru ​​u realnom vremenu ako samo date igračima različita ulazna sredstva. Najlakši način za to je preko mreže - o tome ćemo u jednom od narednih brojeva. Također će biti potrebne sljedeće promjene:

  • nije potrebno polje GameSpeed na času TObeliskObject- koristite brzinu sa osnovnog motora (brzina kretanja po ekranu jednaka je brzini igre);
  • cjelobrojno izračunavanje udaljenosti je onemogućeno;
  • kod kretanja figure se prepisuje, uzimajući u obzir činjenicu da je potrebno nacrtati putanju oko prepreka;
  • Dugme "kraj kretanja" je uklonjeno.

To je sve. Hoćeš li pokušati da to uradiš sam?

Vašu kompaniju smatram jednom od najjačih na tržištu konsultantskih usluga u našoj zemlji. Sviđa mi se što se dotičete širokog spektra problema upravljanja i pokrivate ih dovoljno kvalitetno i duboko. U publikacijama vaše kompanije nalazim mnogo korisnih informacija, jer je uvijek zanimljivo upoznati se s iskustvom profesionalaca i učiti od njih.

Borisyuk Yuri Aleksandrovich, konsultant za upravljanje, doktor tehničke nauke

Zaista mi se sviđa serija majstorskih kurseva koje predajete. Lično, pošto sam prethodno bio na čelu fabrike, počeo sam da menjam svoje pristupe menadžmentu, uklj. zahvaljujući informacijama dobijenim od vas. Ona je nekako reagovala na ono što sam radio i posmatrao u fabrici. Od tada sam počeo da razmišljam o tome koliko su ruske industrijske sposobnosti neefikasne i koliko je ogroman potencijal i kako se to može realizovati. Lično upoznavanje problema različita preduzeća(ponekad me prijatelji pozovu kao stručnjaka) Vidim koliko se može učiniti, kako povećati i efektivnost i efikasnost.

Drjagin Oleg Borisovič

Da, sviđaju mi ​​se tvoji majstorski kursevi, veoma sistematičan pristup, poznavanje gradiva na visokom nivou i, naravno, dosta praktičnog iskustva u pitanjima koja se razmatraju. Ono što me privlači je to Aleksandrov profesionalizam i visok nivo stručnog poznavanja predmeta omogućavaju mi ​​da drugačije gledam na već poznate stvari. Sa moje tačke gledišta, to je tako Veoma je važno i neophodno da stvari koje poznajete sagledate na nov način, jer... Tokom hirurškog zahvata, vrlo često oko postane „zamagljeno“ i prestanete da vidite, zapravo, očigledne stvari.

Elena Fedash, direktor ljudskih resursa, ATB Corporation, Dnjepropetrovsk.