Page 1 of 2

Miten tämän voisi toteuttaa?

Posted: Fri Nov 27, 2009 7:14 pm
by martti
Olen tekemässä peliä. Enkä osaa tehdä siihen karttaa
enkä mitään muutakaan joka seuraisi mukana, paitsi inventoryn ja ylävalikon.
En osaa myöskään tehdä ns. ohjusta joka osuu kulman takana olevaan viholliseen osumatta seinään(se on kai joku ihmeellinen muokkaus jostain pathfinderistä).
Joten, osaisiko joku auttaa näissä asioissa
EDIT:

Kirjoitin näköjään vähän hätäsesti. Tarkoitan siis ns. tutkaa(mutta en sellaista jossa pyörii sellane härpäke ympyrää vaan ihan tavallista karttaa).


Re: Miten tämän voisi toteuttaa?

Posted: Fri Nov 27, 2009 7:54 pm
by Jonez
Cb:llä kaikista helpoin karttatyyppi on tilekartta. Näitä karttoja voi tehdä ohjelmilla, kuten Tilester, joka taitaa tulla cb:n mukana. Muita tile-editoreja ovat A Stigmator, sekä TileGen, jota en tähän hätään löytänyt mistään. Ainakin Tilesterin kanssa tulee jonkinlainen manuaali.

Ennen omien karttojen luontia suosittelen käymään kaikki cb:n oppitunnit läpi.

Nopea yhteenveto tilekartoista:
Tilekartta koostuu erilaisista kerroksista. Jokainen kerros koostuu tileistä, eli suorakulmion muotoisista paloista. Kerroksiin piirretään tile kerrallaan. Yksi tile voi olla esim. 32x32 pikselin kokoinen.
1. Taustakerros, kerros jonka päälle kaikki muu piirretään. Tämä on osa kartan ulkoasua.
2. Päällyskerros. Päällyskerros piirretään kaiken päälle, myös osa kartan ulkoasua. Sillä voi tehdä esim. kattoja jne.
3. Hit-kerros. Tämän on näkymätön kerros. Tämä toimii seinänä tilekartoissa, eli tämän kerroksen läpi ei voi kävellä (jos olet asettanut törmäykset päälle).
4. Data-kerros. Tämä on kaikista hankalin, mutta myös hyödyllisin kerros. Data-kerros säilöö tietoa, kokonaislukuja. Osaava ohjelmoija voi tehdä niin, että kun pelaaja astuu esim. datan nro. 1356 päälle, viereinen seinä räjähtää. Tai ovi aukeaa. Tai pelaaja löytää esineen. Tai lauma vihollisia hyökkää jne.

Re: Miten tämän voisi toteuttaa?

Posted: Sun Nov 29, 2009 7:06 pm
by esa94
Jonez wrote: 4. Data-kerros. Tämä on kaikista hankalin, mutta myös hyödyllisin kerros. Data-kerros säilöö tietoa, kokonaislukuja. Osaava ohjelmoija voi tehdä niin, että kun pelaaja astuu esim. datan nro. 1356 päälle, viereinen seinä räjähtää. Tai ovi aukeaa. Tai pelaaja löytää esineen. Tai lauma vihollisia hyökkää jne.
Tämän avullahan voi vaikka tehdä niin, että tekee waypoint-listan (Taulukot tai linkitetyt listat=typet ovat varsin näppäriä tähän) johon tallettaa jokaisen tilen keskikohdan, jossa on jokin tietty arvo. Näihin voi sitten soveltaa vaikka a*-algoritmia paljon nopeammin. Kun saadaan näiden waypointtien välille nopeimmat reitit, voidaan alkaa vetää reittejä waypointilta waypointille, jolloin saadaan tulokseksi melko nopea ja mahdollisesti jopa luonnollisen näköinen reitti.

HUOM! Reitti ei välttämättä olisi tällä metodilla nopein mahdollinen, sillä reittiä ei vedetä suoraan lähdöstä maaliin vaan lähdöstä waypointiin ja siitä seuraavaan. Kuitenkin reitti ainakin sivunnee nopeinta mahdollista reittiä.

Re: Miten tämän voisi toteuttaa?

Posted: Mon Nov 30, 2009 6:19 pm
by martti
Tarkoitatko jotain tälläistä systeemiä?
Image

Re: Miten tämän voisi toteuttaa?

Posted: Mon Nov 30, 2009 6:21 pm
by kaneli2000
martti wrote:Tarkoitatko jotain tälläistä systeemiä?
Image
Kuva saa olla isompikin, tuosta ei kyllä saa selvää, ainakaan tekstistä.

Re: Miten tämän voisi toteuttaa?

Posted: Mon Nov 30, 2009 7:09 pm
by koodaaja
kaneli2000 wrote:
martti wrote:Tarkoitatko jotain tälläistä systeemiä?
Image
Kuva saa olla isompikin, tuosta ei kyllä saa selvää, ainakaan tekstistä.
Linkki näyttäisi vain olevan johonkin miniversioon, normikokoisena tässä.

Image

Ja kyllä, juuri tuollaista näyttäisi tarkoittavan.

Re: Miten tämän voisi toteuttaa?

Posted: Mon Nov 30, 2009 8:14 pm
by SPuntte
Suunnittelin joskus 2D-räiskintää ja toteutinkin sitä varten ohjussysteemin, jossa ohjusta voi ohjata itse tähtäimellä tai antaa ensin lukittua maaliin, jolloin se toimii laukaisun jälkeen itsenäisesti. Ohjus on myös siinä mielessä älykäs, että se osaa väistää seiniä, mistä toisaalta seuraa haitta, että ohjaus toimii kehnosti kapeissa käytävissä. Jos maali katoaa ohjuksen näköpiiristä, se lentää paikkaan, jossa maali viimeksi havaittiin ja yrittää sitten paikallistaa sen uudelleen.

Koodiin sisältyy esimerkki, jossa metsästetään botteja. Koodi on reilusti kommentoitu ja selkeästi jaoteltu, mutta ehkä hieman hankalasti sovellettava. Sitä saa käyttää ja levittää vapaasti, kunhan ei väitä tehneensä sitä itse.

Re: Miten tämän voisi toteuttaa?

Posted: Mon Nov 30, 2009 8:41 pm
by martti
Saakos tuota toimimaan ns. stragiapeli tyyliseen kävelyyn, elikkä valitaan mitä joukkoja halutaan siirtää ja valitaan hirellä minne siirtää ne sillä tavalla, että ne osaa väistää seiniä?

Re: Miten tämän voisi toteuttaa?

Posted: Mon Nov 30, 2009 8:53 pm
by SPuntte
martti wrote:Saakos tuota toimimaan ns. stragiapeli tyyliseen kävelyyn, elikkä valitaan mitä joukkoja halutaan siirtää ja valitaan hirellä minne siirtää ne sillä tavalla, että ne osaa väistää seiniä?
Ei saa, ainakaan yksistään. Jossain aiemmassa postissa mainittiin A*-algoritmi, jolla homma hoituu.

Re: Miten tämän voisi toteuttaa?

Posted: Mon Nov 30, 2009 8:54 pm
by valscion
martti wrote:Saakos tuota toimimaan ns. stragiapeli tyyliseen kävelyyn, elikkä valitaan mitä joukkoja halutaan siirtää ja valitaan hirellä minne siirtää ne sillä tavalla, että ne osaa väistää seiniä?
Sen saa sillä A*-algoritmilla toimimaan. Käytäppä hakua: viewtopic.php?f=10&t=1139&start=0&hilit=a+algoritmi

Re: Miten tämän voisi toteuttaa?

Posted: Tue Dec 08, 2009 3:04 pm
by martti
Noniin, kävely systeemi on valmis joten siirrytäämpäs seuraavaan (ja suurimpaan) ongelmaan, elikkä tutkaan.
En itse ainakaan tajua mitään siitä miten sellaisen voisi tehdä.

Re: Miten tämän voisi toteuttaa?

Posted: Tue Dec 08, 2009 4:45 pm
by Jonez
Tässä on linkki kuusi päivää sitten tekemääni esimerkkiin kartan teosta. Viesti on aika pitkä, mutta se kannattaa lukea läpi, sillä selitän siinä minikartan toimintaperiaatteen. Viestin lopussa on itse koodi.

Edit. siis oletin että tarkoitat tutkalla karttaa, josta mainitsit ensimmäisessä viestissäsi.

Re: Miten tämän voisi toteuttaa?

Posted: Tue Dec 08, 2009 6:32 pm
by martti
Hetkinen, saako tuon karttasi mahtumaan neliöön laatikkoon elikkä silleen että kartasta näkyy vain se osa jossa ukko kulkee?
EDIT:

Hahaa! Löysinpäs sen vanhan koodinpätkän jota en muistanut tallentaa! Se löytyi täältä!

EDIT:

Osaakos joku poistaa tuon pyörivän härpäkkeen tästä

Code: Select all

    FrameLimit 50

    tilemap = LoadMap("Media\cdm2.til","Media\tileset.bmp")
    PlayObject tilemap,0,0,1
    ObjectPickable tilemap,1
    guy = LoadObject ("Media\guy.bmp",72)
    guy2 = LoadObject ("Media\guy.bmp",72)
    ObjectPickable guy2,2
    MoveObject guy2,0,200
    SetupCollision guy, tilemap, 1, 4, 2

    //VARIABLES NEEDED
    Const ACCURACY=1 //radar accuracy
    Global ang#,fade,speed
    ang=0.0 //angle of the pointer
    fade=100 //fading speed of the result
    speed=7 //speed of the pointer


    Repeat
       
        'Ukon ohjaus
        If LeftKey() Then TurnObject guy,5
        If RightKey() Then TurnObject guy,-5
        If UpKey() Then MoveObject guy,2
        If DownKey() Then MoveObject guy,-2


        CloneCameraPosition guy
        DrawGame
        Color cbwhite
        Text 0,0,FPS()
       
        Radar(50,50,100,guy,tilemap,300)
       
        DrawScreen
    Forever

    //x = radar drawing position (center)
    //y = --||--
    //r = radius of the radar circle
    //obj = object we get the radar from
    //map = tilemap used
    //range# = range of the radarbeam
    Function Radar(x,y,r,obj,map,range#)
        //draw base
        Color 0,40,0
        Circle x-r/2,y-r/2,r,1
        Color 0,80,0
        Circle x-r/2,y-r/2,r,0
        oldangle=ObjectAngle(obj) //save the old angle of the guy
        For i=ang-fade To ang Step ACCURACY //loop trought a loop
            RotateObject obj,i
            ObjectPick obj
            Dist#=Distance(PickedX(),PickedY(),ObjectX(obj),ObjectY(obj))
            If Dist<range Then // if the picked object is in the range of the beam
                rdist#=dist/range //make the distance good for the scale of the radar
                If pickedobject()=map Then
                    Color 0,150+Max(i-ang,-110),0
                Else //this ain't no wall, shoot it!
                    Color 200+Max(i-ang,-160),0,0
                EndIf
                Dot x+Cos(i)*r/2*rDist,y-Sin(i)*r/2*rDist
            EndIf
        Next i
        RotateObject obj,oldangle //restore the old angle of the object
        //update and draw teh pointer
        ang+speed
        Color 0,80,0
        Line x,y,x+Cos(ang)*r/2,y-Sin(ang)*r/2
    EndFunction
koodista?[/edit]

Re: Miten tämän voisi toteuttaa?

Posted: Tue Dec 08, 2009 7:26 pm
by Jonez
Yritän selostaa kattavasti, että pääset itsekin koodaamaan, sen sijaan että ohjelmoisin puolestasi.

- Tuossa edellisessä koodissa ideana oli, että kopioimme pienennetyn kuvan kartasta ja piirrämme sen kuvaksi. Pääsilmukassa liikutamme ukkoa suhteessa pikkukartan kokoon.
- Jos haluamme piirtää vain osan kartasta, on paras keino tehdä se näin: kartalla sijaitsevan ukon sijasta liikutamme karttaa suhteessa kokoon, ja piirrämme vain osan kartasta.
- Liike on suhteellista: jos siirrän ukkoa ylöspäin kartalla, tarkoittaa se oikestaan samaa, että pidän ukkoa paikallaan ja siirrän karttaa alaspäin saman matkan; ukko päätyy samaan pisteeseen.
- Edellisessä esimerkissä siirsin ukkoa. Nyt haluamme siirtää karttaa. Tähän liikutukseen käy sama matematiikka mitä edellisessä käytimme ukon siirtämiseen, mutta koordinaatit ovat vastakkaiset. Kun ukko siirtyy ylös, kartta siirtyy alas.

Nyt kun olemme saaneet kartan liikkumaan, haluamme näyttää siitä vain osan (se osa jossa ukko sattuu sijaitsemaan). Piirrämme liikutetun kartan yksinkertaisesti toiseen kuvaan komennolla DrawToImage. Tämän uuden kuvan, joka pysyy paikallaan piirrämme ruudulle siihen kohtaan missä haluamme kartan sijaitsevan. Ukkelin piirrämme keskelle tätä ruutua (ukko siis ei liiku tässä versiossa).

Re: Miten tämän voisi toteuttaa?

Posted: Sat Dec 19, 2009 9:20 pm
by martti
Uusi ongelma ilmeni: Voiko Objectpickable komennolla poimia esim. Typeillä tehtyjä zombeja tjsp. Jos voi, niin miten?

Re: Miten tämän voisi toteuttaa?

Posted: Sat Dec 19, 2009 9:25 pm
by skorpioni-cb

Code: Select all

...
täällä ne uuden jäsenen teko ja kloonaus.
Objectpickable esim.vihu\obj,1
...
Tunnistuksen vuoro
select p
  case vihu\obj
jotain
endselect
jotain tuollaista.

Re: Miten tämän voisi toteuttaa?

Posted: Sat Dec 19, 2009 9:33 pm
by martti
Siis tässä tapauksessa yrittäisin saada ne zombit(tai jotkut sellaset) näkymään radarissa.
EDIT:

Siis hetkine. Kyllä ne sittenki näkyy siinä radarissa mutta ne on niin tolkuttoman pieniä, joten saisiko niitä jotenkin ns. kasvatettua.


Re: Miten tämän voisi toteuttaa?

Posted: Sat Dec 19, 2009 10:43 pm
by Awaclus
martti wrote:Siis tässä tapauksessa yrittäisin saada ne zombit(tai jotkut sellaset) näkymään radarissa.
EDIT:

Siis hetkine. Kyllä ne sittenki näkyy siinä radarissa mutta ne on niin tolkuttoman pieniä, joten saisiko niitä jotenkin ns. kasvatettua.

Häh? Pistät vaan isomman kuvan siihen.

Re: Miten tämän voisi toteuttaa?

Posted: Tue Dec 22, 2009 7:24 pm
by martti
siiskun se objekti on tehty typeillä ja se kuva siinä on tehty paintobjectilla.

Re: Miten tämän voisi toteuttaa?

Posted: Tue Dec 22, 2009 7:51 pm
by Awaclus
martti wrote:siiskun se objekti on tehty typeillä ja se kuva siinä on tehty paintobjectilla.
Niin? Pistät vain isomman kuvan siihen, simple as that.

Code: Select all

object_master = Loadobject ("Media\3*3.png")

paallyste1 = LoadObject ("Media\1*1.png")
paallyste2 = LoadObject ("Media\50*2346.png")

Paintobject object_master, //hmm, jos haluan tähän 50*2346 -kokoisen kuvan, mikähän noista päällysteistä tähän kannattaisi laittaa?