Page 1 of 2

vanhan ajan seikkailupelin runko

Posted: Wed Oct 15, 2008 4:25 pm
by jpmp
Mielessäni olisi seikkailupelin teko/opettelu, eli tarvitsisin esimerkin kuinka tehdä peli joka on monkey Islandin ja muiden seikkailupelien hyvin pelkistetty kaava. Kiitän jo etukäteen neuvoja antaville.

Re: vanhan ajan seikkailupelin runko

Posted: Wed Oct 15, 2008 4:27 pm
by rami123
jos olet uusi niin suosittelen selailemaan manuaalia aika paljon . seikkailu ja roolipelejä ei tehdä noin vain ..

Re: vanhan ajan seikkailupelin runko

Posted: Wed Oct 15, 2008 6:46 pm
by jpmp
olen tehnyt lähinnä autopelien alkeellisia runkoja, mutta en yllämainittuja pelejä. Olisin kaivannut jonkinlaista esimerkkiä siitä miten totettaa peli missä täytyisi poimia huoneesta avain ja käyttää tätä sitten oveen jotta pääsisi toiseen huoneeseen. En löytänyt oppaista vastaavanlaista esimerkkiä joten päätin kysyä sitä täältä. En siis ole vielä suunnitellut mitään juonta yms. vaan lähinnä harjoittelemassa ohjelman käyttöä.

Re: vanhan ajan seikkailupelin runko

Posted: Fri Oct 17, 2008 7:42 pm
by Aavesoturi
Jos ukkeli - pelaajan hahmo - ei liiku tai liikkuu hyvin vähän ruudulla, on klassinen seikkailupeli sangen simppeli tehdä: Piirretään nätti tausta (tai siis taustoja) ja ladataan se vaikka kuvaksi cb:hen ja näytetään DrawImagella. Keräiltävät esineet ja muut klikkailtavat hommelit piirretään erikseen ja laitetaan coolbasicissa objekteiksi tai kuviksi. Kun hiirellä klikataan (MouseHit) katsotaan osuttiinko johonki tärkeään (objektien tapauksessa komennnon CameraPick manuaalisivu auttaa, kuvilla voidaan käyttää vaikka ImagesOverlappia hiirikursorin kanssa, kun kelataan esineet for-luupilla läpi). Jos sitten vaikka saatiin selville että löyty avain, ni poistetaan se avain objekti pelikentästä ja lisätään inventaarioon.

Jos taustat on monimutkaisia ja halutaan että ukkeli voi silti liikkua melko vapaasti, homma menee vaikeammaksi, koska taustan pitää koostua ainakin kahdesta kerroksesta (esim. ukkelin mennessä pöydän taakse, sen jalkoja ei näy) ja lisäksi tarvitaan vielä kolmas, kaksi värinen kuva joka kertoo mihin voi mennä ja mihin ei (muitakin tapoja on). Reitinhakuälykin astuu siinä vaiheessa mukaan kuvioon, eli suosittelen aloittamaan yksinkertaisesta.

Lyhyesti: piirrä taustakuva, esineet ja ukkeli. Toteuta koodi, joka hiirtä klikatessa katsotaan osuttiinko johonkin tärkeään pisteeseen ja jos osuttiin, toteutetaan sen tapahtuma (esim. jos klikattiin ovea, katsotaan onko mukana avainta, jos on; siirrytään seuraavalle alueelle.) Jos paikat pitää simppeleinä, ukkeli on helppo laittaa myös kävelemään sinne, mihin hiirellä käsketään (tyyliin ei piirrellä esteitä ruudun alimmalle kolmannekselle ja annetaan ukkelin kulkea vapaasti siinä tilassa).

Re: vanhan ajan seikkailupelin runko

Posted: Sat Oct 18, 2008 3:06 pm
by jpmp
;) Selvä kiitoksia vinkistä. Alampa tästä sittee koodamaan.

Re: vanhan ajan seikkailupelin runko

Posted: Fri May 22, 2009 10:54 pm
by jpmp
Nyt kun taas pitkästä aikaa olen innostunut tästä projektista niin osaisiko joku neuvoa miten saisi hiiri ikonin muuttumaan useammaksi ikoniksi kuin vain kahdeksi, jonka sain aikaan mousehit komennolla, eli pitäisi saada perus ikonit eri komennoille mitä noissa vanhoissa seikkailupeleissä oli esim puhuminen, kävely, yms.

Re: vanhan ajan seikkailupelin runko

Posted: Sat May 23, 2009 12:06 am
by Nasse-setä
En ole varma ymmärsinkö kysymystäsi, mutta etkös vain vaihda ikonia sen mukaan mitä teet? Kävely tilanteessa laitat kävely ikonin. Luulen että ymmärsin väärin mutta kuiteski.

Re: vanhan ajan seikkailupelin runko

Posted: Sat May 23, 2009 9:03 am
by skorpioni-cb
Jos kursorit on objecteja niin kloonaa yleiskursorista kopio(olettaen, että kaikki kursori-objectit on piilotettu) ja tietyissä tilanteissa käytä paintobject-komentoa.
EDIT:

Ketä kiität?


Re: vanhan ajan seikkailupelin runko

Posted: Sat May 23, 2009 3:37 pm
by jpmp
Kiitos vinkistä hiiri toimii nyt halutulla tavalla,ongelma oli itse asiassa se etten ollut muistanut pistää muuttujaa haluttuun paikkaan, mutta nyt se on kunnossa.

Re: vanhan ajan seikkailupelin runko

Posted: Sun May 24, 2009 3:31 pm
by jpmp
Osaiskohan joku kertoa miten saisi hahmon liikkumaan siihen pisteeseen mitä on hiirellä klikannut, eli kun tuolla kävelykursorilla klikkaa kohtaa mihin haluaa hahmon menevän liikkuisi ukko sitten tapahtuman mukaisesti. kiitoksia jo nyt vinkeistä.

Re: vanhan ajan seikkailupelin runko

Posted: Sun May 24, 2009 3:58 pm
by KilledWhale
En nyt viitsi suoraa koodia kirjoittaa, mutta hiirtä klikatessa luo uusi objekti hiiren maailmankoordinaatteihin jonka jälkeen käännä hahmo objektin suuntaan pointobjectilla ja liikuttele sitten moveobjectilla.

Re: vanhan ajan seikkailupelin runko

Posted: Sun May 24, 2009 8:03 pm
by phons
KilledWhale wrote:En nyt viitsi suoraa koodia kirjoittaa, mutta hiirtä klikatessa luo uusi objekti hiiren maailmankoordinaatteihin jonka jälkeen käännä hahmo objektin suuntaan pointobjectilla ja liikuttele sitten moveobjectilla.
Parempi tapa taas on luoda kaksi muuttuja, ja kun klikataan, niin muuttujiin kirjoitetaan hiiren paikka, ja sitten ukkeli käännetään koordinaatteja kohti ja liikutetaan. Koska itsekkin pähkäilin tätä juttua hetken niin pistän pienen esimerkin, valoksi.

Code: Select all

new_x=0
new_y=0

guy=LoadObject("media\guy.bmp",72)

Repeat
    
    If MouseHit(1) Then
         new_x=MouseWX()
         new_y=MouseWY()
         
    ElseIf Distance(ObjectX(guy),ObjectY(guy),new_x,new_y)<10
        new_x=ObjectX(guy)
        new_y=ObjectY(guy)
        
    EndIf
    
    If Distance(ObjectX(guy),ObjectY(guy),new_x,new_y)>10 Then
        RotateObject guy,GetAngle(ObjectX(guy),ObjectY(guy),new_x,new_y)
        MoveObject guy,2
    EndIf
    
    DrawScreen
Until EscapeKey()
HUOM. Kirjoitin tämän suoraan tänne. En siis testannut tätä joten en ole 100% varma että toimii...
Edit: Ehkä se editori kannattaa vaan avata...

Re: vanhan ajan seikkailupelin runko

Posted: Sun May 24, 2009 9:16 pm
by koodaaja
Muuten ihan oikein, mutta -GetAngle(), nykyinenhän siirtää objektia suoraan poispäin hiirestä :)

Re: vanhan ajan seikkailupelin runko

Posted: Sun May 24, 2009 9:42 pm
by jpmp
Kiitosta taas vinkeistä, tosin ohjelmointi on nyt paripäivää jäissä kun on pitänyt matkustaa kouluun.
Miten muuten pitäisi tehdä hahmon edessä oleva tausta? Itse sain sen muuttamalla tausta objectiksi ja siitä objectorder käskyllä hahmon päälle. Onko se kovin käytännöllistä vai onko jotAin muuTA tapaa

Re: vanhan ajan seikkailupelin runko

Posted: Mon May 25, 2009 12:24 am
by Jonez
Saat kuvat piirrettyä objektien päälle komennolla DrawGame. Siis kaikki DrawGame-komennon jälkeen piirretyt kuvat piirretään objektien päälle. Käytä komentoa vain kerran silmukassa (poikkeuksena, jos piirrät ruudun sijasta kuvaan ja tarvitset siinä jostain syystä ko. komentoa)

Suosittelen kuitenkin tekemään kaikki kuvat käyttämällä kuvakomentoja. Hahmot, esineet, tausta jne. Silloin ei tarvitse murehtia erillisistä koordinaateista, animoinnista tai piirtojärjestyksestä.

Ota huomioon tämä: hahmosi voi olla tietyn kohteen edessä ja takana, riippuen y-koordinaatista (esim. pöytä). Tällöin pöydän piirtojärjestys täytyy välillä vaihtaa hahmoihin nähden. Jos hahmo on objekti, tulee siitä erittäin työlästä. Ja kun ottaa huomioon muut eri "syvyydellä" olevat esineet sekä hahmon päälle ja taakse piirrettävät kohdat taustasta, voi tietyissä tilanteissa oikeanlaisen piirtojärjestyksen luominen olla mahdotonta käyttämällä sekä objekteja että kuvia.

Ja toivon todella, ettet tee hahmosta ylhäältäpäin kuvattua objektia pyöritysarvolla. Siitä tulee vain älyttömän ruma ja huono systeemi. Jos haluat seikkailupelistä kunnollisen, etkä pelkää piirtämistä, tee hahmosta esim. neljään eri suuntaan animoitu kuva, sekä tietenkin animaatiot esineiden poimimiselle, keskusteluille ja välianimaatioille. Seikkailupelit vaativat paljon piirtämistä.

Edit.
Tässä esimerkki, kuinka piirtää kuva osittain toisen kuvan alle. Esimerkissä on siis YKSI taustakuva, jossa on kohtia jotka piirretään hahmon alle, ja toisia kohtia jotka piirretään hahmon päälle. Piirtojärjestyksen kanssa ei kikkailla millään lailla. Objekteja ei myöskään käytetä.

Koodi toimii näin:
1. Piirrämme taustakuvan.

2. Piirrämme kuvaan lehmä:
2a. Tyhjennetään kuva (cls)
2b. Piirretään alkuperäinen lehmä
2c. Piirretään maski oikeisiin koordinaatteihin (-lehmäX, -lehmäY)

3. Piirrämme kuvan lehmä, jossa on nyt "reikiä" maskin kohdalla. Sattumoisin reiät ovat juuri siinä missä taustakuvan "päällyskerros" ylittää lehmän.

Code: Select all

tausta = MakeImage( 100, 100 )
maski = MakeImage( 100, 100 )

alkuperäinen_lehmä = LoadImage( "media\cow.bmp" ) //ladataan lehmäkuva, jota ei milloinkaan muuteta.
lehmä = CloneImage( alkuperäinen_lehmä )
MaskImage lehmä, cbMagenta  //<- lehmän maskiväri ON erittäin oleellinen.
                            //Kokeile kommentoida rivit 6-21, ja katso mitä käy.
                            
//Muutetaan lehmän maskiväri magentaksi. Se on alunperin musta. Tästä ei tarvitse välittää. Ongelmana
//on vain se, että media-kansiossa olevan lehmän maski on musta, ja me tarvitsemme magentan.
DrawToImage alkuperäinen_lehmä
For x = 0 To ImageWidth( alkuperäinen_lehmä )
    For y = 0 To ImageHeight( alkuperäinen_lehmä )
        PickImageColor alkuperäinen_lehmä, x, y
        If getRGB( RED ) = 0 And getRGB( GREEN ) = 0 And getRGB( BLUE ) = 0 Then
            Color cbMagenta
            Dot x, y
        EndIf
    Next y
Next x
DrawToScreen

//Tehdään shakkiruudukko.
For x = 1 To 10
    For y = 1 To 10
        Color cbBlack //joka toinen ruutu on musta.
        If x Mod 2 = 0 And y Mod 2 <> 0 Then //joka neljäs ruutu on valkoinen
            Color cbWhite
        ElseIf x Mod 2 <> 0 And y Mod 2 = 0 //joka neljäs ruutu on punainen. Myös maskiin piirretään, värillä magenta.
            Color cbMagenta
            DrawToImage maski
            Box x * 10, y * 10, 10, 10             
            Color cbRed 
        EndIf
    
        DrawToImage tausta      
        Box x * 10, y * 10, 10, 10
        DrawToScreen
    Next y
Next x

ShowMouse OFF //piilotetaan kursori.

Repeat
   
    DrawImage tausta, 0, 0 //piirretään tausta ENSIMMÄISENÄ.
   
    //piirretään maski lehmäkuvion päälle. Tämä luo "reikiä" lehmään, jotta syntyisi illuusio
    //että lehmä jäisi ruutujen taakse.
    DrawToImage lehmä
        Cls
        DrawImage alkuperäinen_lehmä, 0, 0
        DrawImage maski, -MouseX(), -MouseY()
    DrawToScreen

    DrawImage lehmä, MouseX(), MouseY()       

    SetWindow FPS() + ""
    DrawScreen
Forever
Toinen tapahan olisi tehdä vain kaksi taustakuvaa, toinen alle ja toinen päälle. Mutta sain tämän idean sellaisesta ohjelmasta kuin Adventure Game Studio, jossa käytetään tällaista tapaa.

En tiedä kuinka nopea tuo maskimenetelmä on suurilla kuvilla ja monella hahmolla, mutta kokeilin suorittaa rivit 50-56 viisisataa kertaa putkeen, eikä fps tippunut ollenkaan.

Re: vanhan ajan seikkailupelin runko

Posted: Mon May 25, 2009 7:42 pm
by jpmp
Koodisi vaikuttaa paremmalta kuin oma objekteilla pelleilyni. Toivottavasti saan tehtyä pelin loppuun asti, koska alan vasta nyt tajuamaan täältä saa apua omiin ohjelmointi ongelmiin.
P.s. Toivottavasti ette hermostu kyselyihini. Toden näköisesti niitä tulee vielä lisää :)

Re: vanhan ajan seikkailupelin runko

Posted: Sun May 31, 2009 3:10 pm
by jpmp
nyt ukko liikkuu haluttuun suuntaan ja kuvat on laitettu objektejen sijasta kuviksi mutta miten sitten tuo liikkumisen esto niihin kohtiin joihin ei saisi mennä. pitäiskö siinä kikkailla jotenkin tuon yksivärisen kuvan ja törmäystunnistuksen kanssa vai olenko aivan hakuoteillä. Alla on vielä pari kuvaa mitä olen piirtänyt suunnitellessani tätä peliä, en tosin tiedä tuleeko ne lopulliseen peliin.
laituri luonnos.JPG
laituri luonnos.JPG (10.14 KiB) Viewed 11919 times
kalkkiluola.JPG
kalkkiluola.JPG (7.23 KiB) Viewed 11919 times

Re: vanhan ajan seikkailupelin runko

Posted: Sun May 31, 2009 4:30 pm
by Jonez
Lupaavan näköisiä kuvia.

Liikkuminen todellakin on ehkä paras tehdä yksivärisen kuvan kanssa. Kuvaan siis yksinkertaisesti piirretään alueet, joihin pelaaja (ja muut hahmot) voivat liikkua.

Tässä yksinkertainen liikkumisssysteemi. Todellisuudessahan tuota "lattia-kuvaa" ei piirrettäisi ruudulle.

Code: Select all

SCREEN 1024, 768
FrameLimit 40

path = MakeImage( ScreenWidth(), ScreenHeight() )
cow = LoadImage( "media\cow.bmp" )

Const SIZE = 40
Const SPEED = 5

cowX = ScreenWidth() / 2
cowY = ScreenHeight() / 2
targetX = cowX
targetY = cowY
Repeat

    //Hiiri2 luo polkua, hiiri1 liikuttaa lehmää, jos mahdollista.
    If MouseDown( 2 ) Then
        DrawToImage path
            Color cbMagenta
            Circle MouseX() - SIZE / 2, MouseY() - SIZE / 2, SIZE
        DrawToScreen
    ElseIf MouseHit( 1 ) Then
        targetX = MouseX()
        targetY = MouseY()
    EndIf

    //Katsotaan suorin reitti kohteeseen. Jos se ei ole mahdollinen, käännetään reittiä hiukan
    //ja etsitään uutta polkua. Jos polkua ei löydy, pysähdytään. Muulloin annetaan lupa
    //jatkaa matkaa.
    If Distance( cowX, cowY, targetX, targetY ) > SPEED Then
        angle# = GetAngle( cowX, cowY, targetX, targetY )
       
        Lock Image( path )
       
        bMove = False
        dir = 0
        While True
            getX = cowX + Cos( angle# + dir ) * SPEED
            getY = cowY - Sin( angle# + dir ) * SPEED

            PickImageColor2 path, getX, getY       

            If getRGB( RED ) <> 0 Or getRGB( GREEN ) <> 0 Or getRGB( BLUE ) <> 0 Then
                bMove = True
                Exit
            EndIf
           
            temp = Not temp           
            If Not temp Then
                dir = dir * -1
            Else
                dir = Abs( dir ) + 10
            EndIf
            If dir > 100 Then Exit
       Wend

        Unlock Image( path )
       
        //liikutetaan lehmää
        If bMove = True Then
            cowX = getX       
            cowY = getY
        Else
            targetX = cowX
            targetY = cowY
        EndIf
    EndIf
   
    //piirretään polku ja lehmä. Pelissä polkua ei tarvitse piirtää ruudulle, se on silti olemassa.
    DrawImage path, 0, 0
    DrawImage cow, cowX - ImageWidth( cow ) / 2, cowY - ImageHeight( cow ) / 2

    Color cbWhite
    Text 20, 20, "Hiiri1 liikuttaa lehmää (jos mahdollista)"
    Text 20, 33, "Hiiri2 luo lattiaa. Kokeile tehdä mutkia."
    DrawScreen
Forever
Edit.
Aina kun postaa tulee heti kaikenlaista lisää mieleen :).
Eli kuvan ei välttämättä tarvitse olla yksivärinen: eri väreillä saat aikaiseksi esim. kohteita jonne pääsee vain tietyissä tilanteissa, tai paikkoja jonne vain jotkin hahmot voivat kävellä.

Re: vanhan ajan seikkailupelin runko

Posted: Mon Jun 01, 2009 10:51 am
by jpmp
entä miten se sitten saisi siirrettyä tuohon kaksi väriseen kuvaan? Itse sain vain osittain ukon liikumatilan toimimaan, eli tämä liikkuma tila on jonkin verran ruudun ulkopuolella, johtuuko tämä siitä että ukko liian iso, käytin mallissani tuota kalkkiluola kuvaa ja siinä tuo liikerata on kohtalaisen kapea.
pystyisikö esimerkiksi tekemään niin että törmäys tunnistus koskee vain ukon jaloissa olevaa x-y koordinaattia.

Re: vanhan ajan seikkailupelin runko

Posted: Mon Jun 01, 2009 4:33 pm
by Jonez
Koordinaatit saa kyllä pelihahmon jalkoihin. Tuossa minun esimerkissäni lehmän koordinaatit ovat keskellä lehmää, mutta ne saa muutettua lehmän alaosaan vaihtamalla rivin 71.
Tästä:
DrawImage cow, cowX - ImageWidth( cow ) / 2, cowY - ImageHeight( cow ) / 2
Tällaiseksi:
DrawImage cow, cowX - ImageWidth( cow ) / 2, cowY - ImageHeight( cow )

Tietenkin kannattaa myös jättää kävelymaskin ja reunojen välille hiukan tilaa, ettei hahmo näytä kävelevan esim. seinässä kiinni tai rotkon päällä.

Jokaiselle omalle huoneellesi saat kävelymaskin esim. piirtämällä ne paintilla joka huoneelle erikseen, ja sitten nimeämällä tietyllä tavalla, jotta ohjelmasi tunnistaisi ne.