Tyhmät kysymykset (I/2011)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2011)

Post by Awaclus »

CB-Nero wrote:Moi!

Teen ylhäältäpäin kuvattua peliä. Pelissä vihollinen ampuu pelaajaa. Kun kuti osuu pelaajaan, lähtee tältä yksi elämä. Tai niin ainakin pitäisi. En ole varma miten CountCollisionsia käytetään, mutta yritin ainakin. Tämä koodi heittää MAV:ia:

Code: Select all

    For v1luoti.V1KUTI = Each V1KUTI
        MoveObject v1luoti\obj,6
        If CountCollisions  (v1luoti\obj) Then
           DeleteObject v1luoti\obj
           Delete v1luoti
        EndIf
        kuti_robtormays = CountCollisions(v1luoti\obj)
        If kuti_robtormays = rob Then
        elamat = elamat-1
        EndIf
    Next v1luoti  
Suosittelisin tekemään tuon ennemmin ObjectsOverlapilla kuin CountCollisionsilla.

Code: Select all

For v1luoti.V1KUTI = Each V1KUTI
    MoveObject v1luoti\obj, 6
    If ObjectsOverlap (v1luoti\obj, rob) Then
        elamat = elamat-1
        DeleteObject v1luoti\obj
        Delete v1luoti
    EndIf
Next v1luoti
Sinun koodisi mavitti, koska yritit tuon EndIfin jälkeen käyttää objektia v1luoti\obj, jota ei enää ollut olemassa koska poistit sen juuri aikaisemmin.
EDIT:

Frozen: U got sarnath'd :P

Last edited by Awaclus on Thu Oct 06, 2011 7:38 pm, edited 1 time in total.
User avatar
Frozen
Advanced Member
Posts: 282
Joined: Fri Jan 01, 2010 4:46 pm
Location: Suomi

Re: Tyhmät kysymykset (I/2011)

Post by Frozen »

CB-Nero wrote:Moi!

Teen ylhäältäpäin kuvattua peliä. Pelissä vihollinen ampuu pelaajaa. Kun kuti osuu pelaajaan, lähtee tältä yksi elämä. Tai niin ainakin pitäisi. En ole varma miten CountCollisionsia käytetään, mutta yritin ainakin. Tämä koodi heittää MAV:ia:

Code: Select all

    For v1luoti.V1KUTI = Each V1KUTI
        MoveObject v1luoti\obj,6
        If CountCollisions  (v1luoti\obj) Then
           DeleteObject v1luoti\obj
           Delete v1luoti
        EndIf
        kuti_robtormays = CountCollisions(v1luoti\obj)
        If kuti_robtormays = rob Then
        elamat = elamat-1
        EndIf
    Next v1luoti  
Toinen ongelma on, miten saan vihollisten lähtöpaikat asetettua. Jos tallennan ne Tilesterillä ykkösiksi, miten voin laittaa viholliset menemään tason alussa paikoilleen?
Et ole huomioinut, että koodi luetaan ylhäältä alaspäin, joten tuossa koodinpätkässä luodin törmäys tarkastetaan sen tuhoutumisen jälkeen (tästä syntyy MAV). Lisäksi käytä GetCollision:ia ja ObjectsOverlap:ia tarkistaessasi törmääkö luoti viholliseen. :)
EDIT:

.. aina joku ehtii ensin :D

Image
Työn alla:
Jotakin epäjulkaistua
CB-Nero
Newcomer
Posts: 23
Joined: Fri Apr 01, 2011 4:29 pm

Re: Tyhmät kysymykset (I/2011)

Post by CB-Nero »

Kiitoksia!

Nyt tuli sellainen ongelma, että kun minulla on tyyppi VIHUT1. Siinä on kaksi objectia(vai mitä onkaan), obj ja elk <-(elkut).

Sitten kun ammus osuu viholliseen:

Code: Select all

DeleteObject vihu\obj
DeleteObject vihu\elk
Delete vihu
Tuollain jos se on tulee MAV. Jos otan siitä pois "DeleteObject vihu\elk", toimii muuten, mutta siitä lähtien ammukset jäävät seiniin kiinni. Jos poistan "DeleteObject vihu\obj", tulee MAV.

Eli miten saan tuhottua vihun tietoineen? Manuaalissakin painotettiin, että pitäisi poistaa kaikki media tyypeistä kun ne poistetaan...
En osaa koodata, mutta yritän silti.
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2011)

Post by Awaclus »

CB-Nero wrote:Kiitoksia!

Nyt tuli sellainen ongelma, että kun minulla on tyyppi VIHUT1. Siinä on kaksi objectia(vai mitä onkaan), obj ja elk <-(elkut).

Sitten kun ammus osuu viholliseen:

Code: Select all

DeleteObject vihu\obj
DeleteObject vihu\elk
Delete vihu
Tuollain jos se on tulee MAV. Jos otan siitä pois "DeleteObject vihu\elk", toimii muuten, mutta siitä lähtien ammukset jäävät seiniin kiinni. Jos poistan "DeleteObject vihu\obj", tulee MAV.

Eli miten saan tuhottua vihun tietoineen? Manuaalissakin painotettiin, että pitäisi poistaa kaikki media tyypeistä kun ne poistetaan...
Siinä on kaksi kenttää eli fieldiä. Obj on ainakin objektityyppinen kenttä, koska DeleteObject vihu\obj toimii yksinään - toisin sanoen olet johonkin kirjoittanut uusivihu\obj = LoadObject ("Media\cow.bmp",72) tai jotain vastaavaa. Sen sijaan elk on todennäköisesti liukulukutyyppinen kenttä - toisin sanoen olet johonkin kirjoittanut uusivihu\elk = 9001 tai jotain vastaavaa - ja koska siinä ei ole mediaa (ääntä tai kuvaa, jotka on ladattu LoadImagella, LoadObjectilla yms), sille ei siis tarvitse erikseen tehdä mitään.

Se, että ammukset jäävät seiniin kiinni, johtuu siitä, että olet asettanut törmäystunnistuksen ammusten ja kartan välille. Tämän korjaamiseksi voit poistaa törmäystunnistuksen ja käyttää GetMap-funktiota ja sen avulla tarkistaa, onko ammus kartan hit-kerroksen päällä ja jos on, ammus poistetaan samalla tavalla kuin aikaisemmassa esimerkissäni.
CB-Nero
Newcomer
Posts: 23
Joined: Fri Apr 01, 2011 4:29 pm

Re: Tyhmät kysymykset (I/2011)

Post by CB-Nero »

Mitenköhän tämä tarkistaminen onnistuu GetMapilla? Enpä ole tuota funktiota ennen käyttänyt...
En osaa koodata, mutta yritän silti.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2011)

Post by Latexi95 »

CB-Nero wrote:Mitenköhän tämä tarkistaminen onnistuu GetMapilla? Enpä ole tuota funktiota ennen käyttänyt...

Code: Select all

if GetMap(2,ObjectX(ammus\obj),ObjectY(ammus\obj)) = 1 then
    DeleteObject ammus\obj
    Delete ammus
endif
CB-Nero
Newcomer
Posts: 23
Joined: Fri Apr 01, 2011 4:29 pm

Re: Tyhmät kysymykset (I/2011)

Post by CB-Nero »

Kiitos!

Niin mites se vihollisten asettelu kartalle kartan data-kerroksen avulla? Pitääkö jokainen tile käydä läpi yksitellen vai mitä? Ja mites se läpikäynti onnistuu..?
En osaa koodata, mutta yritän silti.
CB-Nero
Newcomer
Posts: 23
Joined: Fri Apr 01, 2011 4:29 pm

Re: Tyhmät kysymykset (I/2011)

Post by CB-Nero »

Nyt ei toimi kudin poisto sen törmätessä seinään, kun vihollinen on poistettu.

Code: Select all

        If ObjectsOverlap (luoti\obj, vihu\obj, 2) Or GetMap(2,ObjectX(luoti\obj),ObjectY(luoti\obj)) = 1 Then
            If ObjectsOverlap (luoti\obj, vihu\obj, 2) Then
                vihu\elk = vihu\elk-1
            EndIf
            DeleteObject luoti\obj
            Delete luoti
        EndIf
//Ongelma ratkaistu
En osaa koodata, mutta yritän silti.
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset (I/2011)

Post by valscion »

CB-Nero wrote:Kiitos!

Niin mites se vihollisten asettelu kartalle kartan data-kerroksen avulla? Pitääkö jokainen tile käydä läpi yksitellen vai mitä? Ja mites se läpikäynti onnistuu..?

Code: Select all

kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
objekti = LoadObject("Media/guy.bmp",72)

// Asetetaan kartan tilen (22,6) datakerrokseen numero 1337
EditMap kartta, 3, 22, 6, 1337

// Käydään läpi kaikki kartan tilet kahdella sisäkkäisellä For-loopilla.
// Huomaa, että funktion TileToWorldX ja -Y olettavat, että yhden
// tilen leveys ja korkeus on 32 pikseliä. Jos leveys/korkeus eroaa
// 32:sta, anna funktioille toinen parametri kutsuttaessa
// (esim. worldx = TileToWorldX( x, 48 ) jos tilen leveys on 48 pikseliä)

For x=1 To MapWidth()
    For y=1 To MapHeight()
        // Tarkistetaan, onko tilen datakerroksessa numero 1337
        If GetMap2(3, x, y) = 1337 Then
            // Datakerroksesta löytyi numero 1337.
            // Haetaan tilen koordinaatit.
            worldx = TileToWorldX( x )
            worldy = TileToWorldY( y )
            
            // Siirretään koordinaatteja hieman, jotta objekti
            // olisi keskellä löydettyä tileä.
            worldx = worldx - ObjectSizeX( objekti ) / 2
            worldy = worldy + ObjectSizeY( objekti ) / 2
            
            // Asetetaan objekti kyseisiin koordinaatteihin
            PositionObject objekti, worldx, worldy
        EndIf
    Next y
Next x

Repeat
    // Kontrollit
    If LeftKey() Then TurnObject objekti,5
    If RightKey() Then TurnObject objekti, -5
    If UpKey() Then MoveObject objekti,4
    If DownKey() Then MoveObject objekti, -4
    
    // Liimaa kamera objektiin
    CloneCameraPosition objekti
    
    DrawScreen
Forever

// FUNKTIOT:
Function TileToWorldX(tx,tileW = 32)
    Return tx * tileW -(MapWidth()*tileW) / 2
EndFunction

Function TileToWorldY(ty, tileH = 32)
    Return -(ty * tileH - (MapHeight() * tileH) / 2)
EndFunction 
Otin funktiot täältä MaGetzUpin kommentista: http://www.cbrepository.com/codes/code/33/
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
CB-Nero
Newcomer
Posts: 23
Joined: Fri Apr 01, 2011 4:29 pm

Re: Tyhmät kysymykset (I/2011)

Post by CB-Nero »

Kiitos! Nyt pitäisi saada jokainen vihollinen lataamaan aseensa. Tuossa koodia, joka tollaisenaan tuottaa vain yhden vihollisen ammunnan.

Code: Select all

    For vihu.VIHUT1 = Each VIHUT1
        For luoti.KUTI = Each KUTI
            If ObjectsOverlap (luoti\obj, vihu\obj, 2) Then
                  vihu\elk = vihu\elk-1
                  DeleteObject luoti\obj
                  Delete luoti
            EndIf
        Next luoti

        vihu\v1lat = mv1lat
        PointObject vihu\obj, rob
        If vihu\v1lat = 0 Then
        v1luoti.V1KUTI = New(V1KUTI) 
        v1luoti\obj=CloneObject(vihukuti)
        CloneObjectPosition v1luoti\obj,vihu\obj                
        CloneObjectOrientation v1luoti\obj,vihu\obj  
        mv1lat=50 'aseen lataus    
        EndIf
        If vihu\elk = 0 Then
            DeleteObject vihu\obj
            Delete vihu
        EndIf
    Next vihu
        If mv1lat>0 Then mv1lat = mv1lat-1
En osaa koodata, mutta yritän silti.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2011)

Post by Latexi95 »

CB-Nero wrote:Kiitos! Nyt pitäisi saada jokainen vihollinen lataamaan aseensa. Tuossa koodia, joka tollaisenaan tuottaa vain yhden vihollisen ammunnan.

Code: Select all

    For vihu.VIHUT1 = Each VIHUT1
        For luoti.KUTI = Each KUTI
            If ObjectsOverlap (luoti\obj, vihu\obj, 2) Then
                  vihu\elk = vihu\elk-1
                  DeleteObject luoti\obj
                  Delete luoti
            EndIf
        Next luoti

        vihu\v1lat = mv1lat
        PointObject vihu\obj, rob
        If vihu\v1lat = 0 Then
        v1luoti.V1KUTI = New(V1KUTI) 
        v1luoti\obj=CloneObject(vihukuti)
        CloneObjectPosition v1luoti\obj,vihu\obj                
        CloneObjectOrientation v1luoti\obj,vihu\obj  
        mv1lat=50 'aseen lataus    
        EndIf
        If vihu\elk = 0 Then
            DeleteObject vihu\obj
            Delete vihu
        EndIf
    Next vihu
        If mv1lat>0 Then mv1lat = mv1lat-1

Sinun pitää tehdä erikseen jokaiselle viholliselle lataus ajastin. Eli lisäät tyyppii muuttujan jota aina vähennät ja tarkistat
CB-Nero
Newcomer
Posts: 23
Joined: Fri Apr 01, 2011 4:29 pm

Re: Tyhmät kysymykset (I/2011)

Post by CB-Nero »

Olen jo aika pitkällä pelissäni, ja nyt pitäisi tasot saada toimimaan. Systeemi menisi niin, että kun pelin aloittaa, se menee 1-tasoon. Kun pääsee 1-tasossa maaliin, pääsee 2-tasoon. Pelin voisi tallentaa(teen tallennuksen myöhemmin) ja kun pelin tallennuksen lataa, voisi valita mihin läpäisemäänsä tasoon haluaa mennä... En oikein tiedä, miten tämän toteuttaisi, koska eihän niitä mappeja voi päällekkäin ladata.
En osaa koodata, mutta yritän silti.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2011)

Post by Latexi95 »

CB-Nero wrote:Olen jo aika pitkällä pelissäni, ja nyt pitäisi tasot saada toimimaan. Systeemi menisi niin, että kun pelin aloittaa, se menee 1-tasoon. Kun pääsee 1-tasossa maaliin, pääsee 2-tasoon. Pelin voisi tallentaa(teen tallennuksen myöhemmin) ja kun pelin tallennuksen lataa, voisi valita mihin läpäisemäänsä tasoon haluaa mennä... En oikein tiedä, miten tämän toteuttaisi, koska eihän niitä mappeja voi päällekkäin ladata.
No lataat tietysti sen kartan mitä nyt pelataan. Kun valitaan joku kenttä, niin lataat sen kartan ja kun päästään seuraavaan niin lataat sen.
CB-Nero
Newcomer
Posts: 23
Joined: Fri Apr 01, 2011 4:29 pm

Re: Tyhmät kysymykset (I/2011)

Post by CB-Nero »

Jossakin luki, että silmukan sisällä ei saa ladata mitään, mutta missä kohtaa se sitten tehdään?
En osaa koodata, mutta yritän silti.
User avatar
Timblex
Advanced Member
Posts: 252
Joined: Sun Apr 11, 2010 10:37 am
Location: Kouvola

Re: Tyhmät kysymykset (I/2011)

Post by Timblex »

no tietysti ENNEN silmukkaa

Code: Select all

kuva=loadimage("media/map.bmp")
repeat
drawimage kuva,0,0
drawscreen
forever
Entinen timpe99...
Demokisa 2013 demo valmis, Check it out!
temu92
Web Developer
Web Developer
Posts: 1226
Joined: Mon Aug 27, 2007 9:56 pm
Location: Gamindustri
Contact:

Re: Tyhmät kysymykset (I/2011)

Post by temu92 »

CB-Nero wrote:Jossakin luki, että silmukan sisällä ei saa ladata mitään, mutta missä kohtaa se sitten tehdään?
Kyllä silmukassa saa ladata jos rajoitat latauksen vain yhteen kertaan (ehdoilla tarkistat ollaanko levelin lopussa). Tuo varoitus on sitä varten ettei kukaan iskisi latauksia looppiin ilman mitään ehtoja, koska se hidastaisi peliä älyttömästi ja on sen lisäksi turhaa.

Ilman sitä mappisysteemiä jonka joku täällä on koodannut tilemappeja ei pysty muutenkaan lataamaan muistiin kuin yhden kerrallaan jolloin ainut keino on ladata uusi kartta pelin loopin sisässä.
CB-Nero
Newcomer
Posts: 23
Joined: Fri Apr 01, 2011 4:29 pm

Re: Tyhmät kysymykset (I/2011)

Post by CB-Nero »

Kiiitos!

En tehnyt sitä levelisysteemiä vielä, koska haluan tehdä ensin valikon. Levelisysteemin teko on sen jälkeen helpompaa.

Nyt kun haluan tehdä valikon, rupesin pohtimaan, miten saan alavalikkoja? Olen kyllä jonkun opastuksella onnistunut ihan perus valikon tekemään, mutta nyt kun pitäisi saada valikko, missä aukeaa uusi valikko kun klikkaa jotakin kohtaa valikossa, meni sormi suuhun. Siis esim. Lataa peli -> Tallennus1 -> peliin...
En osaa koodata, mutta yritän silti.
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2011)

Post by Latexi95 »

CB-Nero wrote:Kiiitos!

En tehnyt sitä levelisysteemiä vielä, koska haluan tehdä ensin valikon. Levelisysteemin teko on sen jälkeen helpompaa.

Nyt kun haluan tehdä valikon, rupesin pohtimaan, miten saan alavalikkoja? Olen kyllä jonkun opastuksella onnistunut ihan perus valikon tekemään, mutta nyt kun pitäisi saada valikko, missä aukeaa uusi valikko kun klikkaa jotakin kohtaa valikossa, meni sormi suuhun. Siis esim. Lataa peli -> Tallennus1 -> peliin...
Yleisin tyyli tuon ongelman ratkaisemiseen on erillinen silmukka jokaiselle valikolle. Esim:

Code: Select all

päävalikko:
Repeat
    if KeyHit(cbKeyEnter) then Goto asetukset
    Drawscreen
Forever


asetukset:

Repeat
    If KeyHit(cbKeyEscape) then Goto päävalikko
    DrawScreen
Forever
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2011)

Post by Awaclus »

CB-Nero wrote:Kiiitos!

En tehnyt sitä levelisysteemiä vielä, koska haluan tehdä ensin valikon. Levelisysteemin teko on sen jälkeen helpompaa.

Nyt kun haluan tehdä valikon, rupesin pohtimaan, miten saan alavalikkoja? Olen kyllä jonkun opastuksella onnistunut ihan perus valikon tekemään, mutta nyt kun pitäisi saada valikko, missä aukeaa uusi valikko kun klikkaa jotakin kohtaa valikossa, meni sormi suuhun. Siis esim. Lataa peli -> Tallennus1 -> peliin...
Jos olet tavallisen valikon onnistunut tekemään, tuo onnistuu näin:

Code: Select all

valikko:
//valikon koodi tähän
If valinta = 1 Then Gosub lataapeli

lataapeli:
//valikon koodi tähän samalla tavalla kuin äsken
If valinta = 1 Then Gosub peli
If valinta = 2 Then Return
EDIT:

I got sarnath'd :/

CB-Nero
Newcomer
Posts: 23
Joined: Fri Apr 01, 2011 4:29 pm

Re: Tyhmät kysymykset (I/2011)

Post by CB-Nero »

Moi! Tein valikon tämän koodin pohjalta:
Koodi by Grandi

Code: Select all

   repeat
        Button(100,100,100,20,"Pelaa")
        Button(100,130,100,20,"Asetukset")
        if Button(100,160,100,20,"Poistu") then
              end    // kun painetaan nappulaa
        endif
        drawscreen
   forever

   // x, y koordinaatit
   // w,h koko
   // t painikkeen teksti
   // s painikkeen pyöreys
   Function Button(x,y,w,h,t$,s=5)
        If MouseX()>x And MouseY()>y And MouseX()<x+w And MouseY()<y+h Then
            If MouseDown(1) Then Color 180,180,180 Else Color 240,240,240
            If MouseUp(1) Then Return True  
        Else
            Color 200,200,200
        EndIf          
            Box x+s,y,w-(s*2),h     
            Box x,y+s,w,h-(s*2)
            Circle x,y,s*2
            Circle x+w-s*2,y,s*2
            Circle x+w-s*2,y+h-s*2,s*2
            Circle x,y+h-s*2,s*2
            Color cbblack
            CenterText x+w/2,y+h/2-TextHeight(t)/2,t$
    EndFunction 
Käsittääkseni tuo ei Chaoswormin esimerkillä toimi...
En osaa koodata, mutta yritän silti.
Locked