vanhan ajan seikkailupelin runko

Voit pyytää apua ohjelmointiongelmiin täältä.
User avatar
jpmp
Newcomer
Posts: 26
Joined: Fri Oct 10, 2008 9:18 pm

vanhan ajan seikkailupelin runko

Post 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.
rami123
Advanced Member
Posts: 354
Joined: Mon Jun 23, 2008 8:20 pm
Location: Kittilä

Re: vanhan ajan seikkailupelin runko

Post by rami123 »

jos olet uusi niin suosittelen selailemaan manuaalia aika paljon . seikkailu ja roolipelejä ei tehdä noin vain ..
User avatar
jpmp
Newcomer
Posts: 26
Joined: Fri Oct 10, 2008 9:18 pm

Re: vanhan ajan seikkailupelin runko

Post 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öä.
Aavesoturi
Active Member
Posts: 163
Joined: Fri Aug 31, 2007 7:07 pm
Location: Helsinki
Contact:

Re: vanhan ajan seikkailupelin runko

Post 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).
User avatar
jpmp
Newcomer
Posts: 26
Joined: Fri Oct 10, 2008 9:18 pm

Re: vanhan ajan seikkailupelin runko

Post by jpmp »

;) Selvä kiitoksia vinkistä. Alampa tästä sittee koodamaan.
User avatar
jpmp
Newcomer
Posts: 26
Joined: Fri Oct 10, 2008 9:18 pm

Re: vanhan ajan seikkailupelin runko

Post 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.
Nasse-setä
Member
Posts: 54
Joined: Fri Apr 03, 2009 8:12 pm
Location: Loviisa

Re: vanhan ajan seikkailupelin runko

Post 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.
Osallistu suuren tilastoon -> viewtopic.php?f=13&t=1756
skorpioni-cb
Advanced Member
Posts: 364
Joined: Wed Dec 03, 2008 3:48 pm
Location: Turku

Re: vanhan ajan seikkailupelin runko

Post 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?

Last edited by skorpioni-cb on Sat May 23, 2009 5:17 pm, edited 1 time in total.
En tiedä, mitä tiedän, mutta tiedän ettei se ole mitään kaunista.

I know not what I know, but I do know that it's not beautiful.
User avatar
jpmp
Newcomer
Posts: 26
Joined: Fri Oct 10, 2008 9:18 pm

Re: vanhan ajan seikkailupelin runko

Post 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.
User avatar
jpmp
Newcomer
Posts: 26
Joined: Fri Oct 10, 2008 9:18 pm

Re: vanhan ajan seikkailupelin runko

Post 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ä.
KilledWhale
Tech Developer
Tech Developer
Posts: 545
Joined: Sun Aug 26, 2007 2:43 pm
Location: Liminka

Re: vanhan ajan seikkailupelin runko

Post 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.
CoolBasic henkilökuntaa
Kehittäjä

cbFUN Kello
cbSDL
Whale.dy.fi

<@cce> miltäs tuntuu olla suomen paras
phons
Guru
Posts: 1056
Joined: Wed May 14, 2008 10:11 am

Re: vanhan ajan seikkailupelin runko

Post 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...
Last edited by phons on Mon May 25, 2009 8:42 am, edited 1 time in total.
Image
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: vanhan ajan seikkailupelin runko

Post by koodaaja »

Muuten ihan oikein, mutta -GetAngle(), nykyinenhän siirtää objektia suoraan poispäin hiirestä :)
User avatar
jpmp
Newcomer
Posts: 26
Joined: Fri Oct 10, 2008 9:18 pm

Re: vanhan ajan seikkailupelin runko

Post 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
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: vanhan ajan seikkailupelin runko

Post 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.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
User avatar
jpmp
Newcomer
Posts: 26
Joined: Fri Oct 10, 2008 9:18 pm

Re: vanhan ajan seikkailupelin runko

Post 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ää :)
User avatar
jpmp
Newcomer
Posts: 26
Joined: Fri Oct 10, 2008 9:18 pm

Re: vanhan ajan seikkailupelin runko

Post 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 11891 times
kalkkiluola.JPG
kalkkiluola.JPG (7.23 KiB) Viewed 11891 times
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: vanhan ajan seikkailupelin runko

Post 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ä.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
User avatar
jpmp
Newcomer
Posts: 26
Joined: Fri Oct 10, 2008 9:18 pm

Re: vanhan ajan seikkailupelin runko

Post 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.
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: vanhan ajan seikkailupelin runko

Post 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.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Post Reply