Selvitystä

Voit pyytää apua ohjelmointiongelmiin täältä.
Post Reply
Art
Member
Posts: 53
Joined: Wed Dec 07, 2011 5:37 pm

Selvitystä

Post by Art »

Auttakaa tyhmää :> Miten voin tehdä tämän yksinkertaisemmin ? Nuo objektin kopioinnit.

Code: Select all

                    vihol_obj = LoadObject ("Media\guy.bmp",72)                    
                  
                  ShowObject vihol_obj, OFF
Type VIHOLLINEN
    Field vihu
    Field vihu2
    Field vihu3
    Field vihu4
    Field vihu5
    Field vihu6
    Field vihu7
    Field vihu8
    Field vihu9
    Field vihu10
    Field vihu11
    Field vihu12
EndType

        vihol.VIHOLLINEN = New(VIHOLLINEN)

                vihol\vihu = CloneObject (vihol_obj)
                vihol\vihu2 = CloneObject (vihol_obj) 
                vihol\vihu3 = CloneObject (vihol_obj) 
                vihol\vihu4 = CloneObject (vihol_obj) 
                vihol\vihu5 = CloneObject (vihol_obj) 
                vihol\vihu6 = CloneObject (vihol_obj) 
                vihol\vihu7 = CloneObject (vihol_obj) 
                vihol\vihu8 = CloneObject (vihol_obj) 
                vihol\vihu9 = CloneObject (vihol_obj) 
                vihol\vihu10 = CloneObject (vihol_obj) 
                vihol\vihu11 = CloneObject (vihol_obj) 
                vihol\vihu12 = CloneObject (vihol_obj) 
¤ Art
User avatar
Frozen
Advanced Member
Posts: 282
Joined: Fri Jan 01, 2010 4:46 pm
Location: Suomi

Re: Selvitystä

Post by Frozen »

Code: Select all

                    vihol_obj = LoadObject ("Media\guy.bmp",72)                    
                  
                  ShowObject vihol_obj, OFF
Type VIHOLLINEN
    Field vihu

EndType

For i=0 To 12 ' Numero 12 on siis määrä, kuinka monesti silmukka For i=0 to 12->Next i toistetaan. Muuttujan nimi voi tietenkin olla mikä tahansa.
        vihol.VIHOLLINEN = New(VIHOLLINEN)

                vihol\vihu = CloneObject (vihol_obj)
Next i 
Image
Työn alla:
Jotakin epäjulkaistua
skorpioni-cb
Advanced Member
Posts: 364
Joined: Wed Dec 03, 2008 3:48 pm
Location: Turku

Re: Selvitystä

Post by skorpioni-cb »

Art wrote:Auttakaa tyhmää :> Miten voin tehdä tämän yksinkertaisemmin ? Nuo objektin kopioinnit.

Code: Select all

                    vihol_obj = LoadObject ("Media\guy.bmp",72)                    
                  
                  ShowObject vihol_obj, OFF
Type VIHOLLINEN
    Field vihu
    Field vihu2
    Field vihu3
    Field vihu4
    Field vihu5
    Field vihu6
    Field vihu7
    Field vihu8
    Field vihu9
    Field vihu10
    Field vihu11
    Field vihu12
EndType

        vihol.VIHOLLINEN = New(VIHOLLINEN)

                vihol\vihu = CloneObject (vihol_obj)
                vihol\vihu2 = CloneObject (vihol_obj) 
                vihol\vihu3 = CloneObject (vihol_obj) 
                vihol\vihu4 = CloneObject (vihol_obj) 
                vihol\vihu5 = CloneObject (vihol_obj) 
                vihol\vihu6 = CloneObject (vihol_obj) 
                vihol\vihu7 = CloneObject (vihol_obj) 
                vihol\vihu8 = CloneObject (vihol_obj) 
                vihol\vihu9 = CloneObject (vihol_obj) 
                vihol\vihu10 = CloneObject (vihol_obj) 
                vihol\vihu11 = CloneObject (vihol_obj) 
                vihol\vihu12 = CloneObject (vihol_obj) 

Code: Select all

                    vihol_obj = LoadObject ("Media\guy.bmp",72)                    
                  
                  ShowObject vihol_obj, OFF
Type VIHOLLINEN
    Field obj
EndType

        vihol.VIHOLLINEN = New(VIHOLLINEN)
        vihol\obj = CloneObject(vihol_obj)
tee toi " vihol.VIHOLLINEN = New(VIHOLLINEN) vihol\obj = CloneObject(vihol_obj)"-homma loopissa, ja se tuottaa ikuisesti vihuja, pystys käyttämään looppia kuten tämä käyttääksesi objekteja:

Code: Select all

For vihuUnit.VIHOLLINEN = Each VIHOLLINEN
    'Koodia, jossa käytät objekteja
Next vihuUnit
voit myös rajoittaa spawnaamista yksinkertaisella if-lausekkeella ;D
EDIT:

Pahus, Frozen ehti ensin, mutta mä annoin suuremman vastauksen

EDIT:

Art wrote:
Frozen wrote:

Code: Select all

                    vihol_obj = LoadObject ("Media\guy.bmp",72)                    
                  
                  ShowObject vihol_obj, OFF
Type VIHOLLINEN
    Field vihu

EndType

For i=0 To 12 ' Numero 12 on siis määrä, kuinka monesti silmukka For i=0 to 12->Next i toistetaan. Muuttujan nimi voi tietenkin olla mikä tahansa.
        vihol.VIHOLLINEN = New(VIHOLLINEN)

                vihol\vihu = CloneObject (vihol_obj)
Next i 
Nyt jos halua laittaa näitä vihollia tiettyihin paikkoihin, onko ne vihol\vihu1, vihol\vihu2 jne.. ?
mä sanoin sen tässä, harmi vaan että mun vastauksella kesti :?[/edit]
Last edited by skorpioni-cb on Thu Nov 29, 2012 7:31 pm, edited 2 times 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.
Art
Member
Posts: 53
Joined: Wed Dec 07, 2011 5:37 pm

Re: Selvitystä

Post by Art »

Frozen wrote:

Code: Select all

                    vihol_obj = LoadObject ("Media\guy.bmp",72)                    
                  
                  ShowObject vihol_obj, OFF
Type VIHOLLINEN
    Field vihu

EndType

For i=0 To 12 ' Numero 12 on siis määrä, kuinka monesti silmukka For i=0 to 12->Next i toistetaan. Muuttujan nimi voi tietenkin olla mikä tahansa.
        vihol.VIHOLLINEN = New(VIHOLLINEN)

                vihol\vihu = CloneObject (vihol_obj)
Next i 
Nyt jos halua laittaa näitä vihollia tiettyihin paikkoihin, onko ne vihol\vihu1, vihol\vihu2 jne.. ?
Haluan että vihollision juuri tuo tietty määrä ja miten voin positionobject:taa noi sitten kun tuon oon tehnyt ?
Art wrote:
Frozen wrote:

Code: Select all

                    vihol_obj = LoadObject ("Media\guy.bmp",72)                    
                  
                  ShowObject vihol_obj, OFF
Type VIHOLLINEN
    Field vihu

EndType

For i=0 To 12 ' Numero 12 on siis määrä, kuinka monesti silmukka For i=0 to 12->Next i toistetaan. Muuttujan nimi voi tietenkin olla mikä tahansa.
        vihol.VIHOLLINEN = New(VIHOLLINEN)

                vihol\vihu = CloneObject (vihol_obj)
Next i 
Eli mitkä on noi vihol\vihu:jen nimet nyt ? Menevätkö ne vihol\vihu1, vihol\vihu2..jne ? Ja saisiko ne menemään sillai ?
¤ Art
User avatar
Frozen
Advanced Member
Posts: 282
Joined: Fri Jan 01, 2010 4:46 pm
Location: Suomi

Re: Selvitystä

Post by Frozen »

Art wrote:
Frozen wrote:

Code: Select all

                    vihol_obj = LoadObject ("Media\guy.bmp",72)                    
                  
                  ShowObject vihol_obj, OFF
Type VIHOLLINEN
    Field vihu

EndType

For i=0 To 12 ' Numero 12 on siis määrä, kuinka monesti silmukka For i=0 to 12->Next i toistetaan. Muuttujan nimi voi tietenkin olla mikä tahansa.
        vihol.VIHOLLINEN = New(VIHOLLINEN)

                vihol\vihu = CloneObject (vihol_obj)
Next i 
Nyt jos halua laittaa näitä vihollia tiettyihin paikkoihin, onko ne vihol\vihu1, vihol\vihu2 jne.. ?
Haluan että vihollision juuri tuo tietty määrä ja miten voin positionobject:taa noi sitten kun tuon oon tehnyt ?
Frozen wrote:

Code: Select all

                    vihol_obj = LoadObject ("Media\guy.bmp",72)                    
                  
                  ShowObject vihol_obj, OFF
Type VIHOLLINEN
    Field vihu

EndType

For i=0 To 12 ' Numero 12 on siis määrä, kuinka monesti silmukka For i=0 to 12->Next i toistetaan. Muuttujan nimi voi tietenkin olla mikä tahansa.
        vihol.VIHOLLINEN = New(VIHOLLINEN)

                vihol\vihu = CloneObject (vihol_obj)
Next i 
Eli mitkä on noi vihol\vihu:jen nimet nyt ? Menevätkö ne vihol\vihu1, vihol\vihu2..jne ? Ja saisiko ne menemään sillai ?
En suosittelisi tekemään jokaiselle viholliselle eri kenttää tyyppiin. Mutta teimpä uuden esimerkin: (Crediittejä MaGetzUb:lle TilePositionObject funktiosta.. jos muistan oikein :D )

Code: Select all


SCREEN 800,600

Type NPC
Field Obj
Field Tyyppi 'Tämän muuttujan tarkoitus on lisätä objetille arvo, joka kertoo sen tyypin
EndType

kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")

Tyyppi1=LoadObject("Media\guy.bmp")
Tyyppi2=LoadObject("Media\Soldier.bmp")
Tyyppi3=LoadObject("Media\Cow.bmp")

ShowObject tyyppi1,0
ShowObject tyyppi2,0
ShowObject tyyppi3,0




For j = 0 To MapHeight() 'luetaan kenttä läpi x suunnassa
    For i = 0 To MapWidth() 'luetaan kenttä läpi y suunnassa
    
    
    If GetMap2(0, i, j) = 3 Then ' Jos kentästä löytyy tile, jonka arvo on 3 then..
        Hahmo.NPC = New (NPC)
        Hahmo\Obj=CloneObject(Tyyppi1) 
        TilePositionObject(Hahmo\Obj,kartta, i, j) 'Omatekoinen funktio. Asetetaan 
        Hahmo\tyyppi=1 'määritellään tyypin ID numeroksi 1
    EndIf
    
    If GetMap2(0, i, j) = 2 Then   
        Hahmo.NPC = New (NPC)
        Hahmo\Obj=CloneObject(Tyyppi2) 
        TilePositionObject(Hahmo\Obj,kartta, i, j)
        Hahmo\tyyppi=2
    EndIf
    
    If GetMap2(0, i, j) = 105 Then   
        Hahmo.NPC = New (NPC)
        Hahmo\Obj=CloneObject(Tyyppi3) 
        TilePositionObject(Hahmo\Obj,kartta, i, j)
        Hahmo\tyyppi=3
    EndIf

    Next i 'päättää läpiluku silmukan
Next j 'päättää läpiluku silmukan

Repeat

PositionCamera MouseX() -ScreenWidth()/2,-MouseY()*4 +ScreenHeight()*2 'Epäkäytännöllinen kameran liikuttelu.



DrawGame
Text 0,0,GetMap(0,MouseWX(),MouseWY()) 'Piirretään ruutuun tilen arvo, joka poimitaan cursorilla.


DrawScreen
Forever

Function TilePositionObject(obj, map, tilex, tiley)
    tilewidth = ObjectSizeX(map) / MapWidth()
    tileheight = ObjectSizeY(map) / MapHeight()
    newx = - ObjectSizeX(map) / 2 + tilex * tilewidth - 32 / 2
    newy = ObjectSizeY(map) / 2 - tiley * tilewidth +16
    PositionObject obj, newx, newy
    Return 0
End Function 

EDIT:

Taisipa tulla melko vaikeaselkoinen koodinpätkä.. pitääpä lisätä kommentointia

EDIT:

Kommentteja lisätty

Image
Työn alla:
Jotakin epäjulkaistua
MrMonday
Advanced Member
Posts: 378
Joined: Fri Oct 10, 2008 2:35 pm

Re: Selvitystä

Post by MrMonday »

Edellistä esimerkkiäni hieman muokaten (Esittelee myös Before(), After(), First() ja Last()-funktiot):

Code: Select all

guy_obj = LoadObject("media/guy.bmp",72) // Ladataan objekti.

ShowObject guy_obj, OFF // Piilotetaan objekti.

Type PLAYER     // Luodaan kokoelma nimeltään 'PLAYER'.
    Field obj   // Ja kokoelmaan muuttuja 'obj', johon tallennetaan myöhemmin luotavan jäsenen objekti.
    Field healt // Ja toinen muuttuja 'healt', johon tallenetaan energiat.
    Field ID    // Ja kolmas muuttuja 'ID', joka yksilöi objektin.
EndType

    For i = 0 To 9 // Käydään silmukka kymmenesti (0,1,2...7,8,9) läpi ja luodaan joka kierroksella uusi jäsen.
    
        guy.PLAYER = New(PLAYER) // Tässä luodaan uusi JÄSEN, johon päästään käsiksi 'guy'-muuttujan kautta.
        
        guy\obj   = CloneObject(guy_obj) // Tässä tallenetaan vastaluodun jäsenen 'obj'-muuttujaan alussa ladatun 'guy_obj'-objektin kopio.
        guy\healt = Rand(100,300) // Ja täällä vielä asetetaan jäsenen 'healt'-muuttujaan arvo väliltä 500-1000 satunnaisesti arpoen.
        guy\ID    = i
        
    Next i
    
    // For-silmukassa käytetty muuttuja <i> voi olla mikä vain. esim. For <kissa> / Next <kissa> 
    
    create_new_players: // Kirjanmerkki, tänne hypätään myöhemmin.
    
    guy.PLAYER = First(PLAYER) // First()-funktiolla siirrytään kokoelman ensimäiseen jäseneen.
    
        x = Rand(-50,50)
        y = Rand(-50,50)
        
        PositionObject guy\obj, x, y // Asetetaan ensimmäisen jäseneen tallenetulle objektille sijainti.
    
    guy = After(guy) // After()-funktiolla siirrytään seuraavaan kokoelman jäseneen.
    
        x = Rand(-50,50)
        y = Rand(-50,50)
        
        PositionObject guy\obj, x, y // Asetetaan toiseen jäseneen tallenetulle objektille sijainti.
    
    guy = After(guy) // After()-funktiolla siirrytään seuraavaan kokoelman jäseneen.
    
        x = Rand(-50,50)
        y = Rand(-50,50)
    
        PositionObject guy\obj, x, y // Asetetaan kolmanteen jäseneen tallenetulle objektille sijainti.
    
    guy = After(guy) // After()-funktiolla siirrytään seuraavaan kokoelman jäseneen.
    
        x = Rand(-50,50)
        y = Rand(-50,50)
    
        PositionObject guy\obj, x, y // Asetetaan neljänteen jäseneen tallenetulle objektille sijainti.
    
    guy = After(guy) // After()-funktiolla siirrytään seuraavaan kokoelman jäseneen.
    
        x = Rand(-50,50)
        y = Rand(-50,50)    
    
        PositionObject guy\obj, x, y // Asetetaan viidenteen jäseneen tallenetulle objektille sijainti.
    
    guy = After(guy) // After()-funktiolla siirrytään seuraavaan kokoelman jäseneen.
    
        x = Rand(-50,50)
        y = Rand(-50,50)    
    
        PositionObject guy\obj, x, y // Asetetaan kuudenteen jäseneen tallenetulle objektille sijainti.
    
    guy = After(guy) // After()-funktiolla siirrytään seuraavaan kokoelman jäseneen.
    
        x = Rand(-50,50)
        y = Rand(-50,50)    
    
        PositionObject guy\obj, x, y // Asetetaan seitsemänteen jäseneen tallenetulle objektille sijainti.
    
    guy = After(guy) // After()-funktiolla siirrytään seuraavaan kokoelman jäseneen.
    
        x = Rand(-50,50)
        y = Rand(-50,50)    
    
        PositionObject guy\obj, x, y // Asetetaan kahdeksanteen jäseneen tallenetulle objektille sijainti.    
    
    guy = After(guy) // After()-funktiolla siirrytään seuraavaan kokoelman jäseneen.
    
        x = Rand(-50,50)
        y = Rand(-50,50)    
    
        PositionObject guy\obj, x, y // Asetetaan yhdeksänteen jäseneen tallenetulle objektille sijainti.
        
    guy.PLAYER = First(PLAYER) // First()-funktiolla siirrytään kokoelman ensimäiseen jäseneen.

    
Repeat // Aloitetaan pääsilmukka.

    If KeyHit(44) Then // Jos on painettu Z-näppäintä.
    
        If Before(guy) <> NULL Then // Tarkistetaan, että listassa on edellinen jäsen.
            guy = Before(guy) // Siirrytään edelliseen jäseneen.
        Else // Mikäli edellinen ehto ei täyttynyt, niin toteutetaan alla oleva.
            guy.PLAYER = Last(PLAYER) // Siirrytään viimeiseen jäseneen.
        EndIf
        
    EndIf
    
    If KeyHit(45) Then // Jos on painettu X-näppäintä
    
        If After(guy) <> NULL Then // Tarkistetaan, että listassa on seuraava jäsen.
            guy = After(guy) // Siirrytään seuraavaan jäseneen.
        Else // Mikäli edellinen ehto ei täyttynyt, niin toteutetaan alla oleva.
            guy.PLAYER = First(PLAYER) // Siirrytään ensimäiseen jäseneen.
        EndIf
        
    EndIf

    // Seuraavaksi hoidetaan objektin liikuttaminen, eli ihan perusasioita.
    // Huomion arvoinen seikka on kuitenkin, että emme liikuta ladattua 'guy_obj'-objektia, vaan nimenomaan jäsenmuuttujaan tallennettua kopiota.

    If KeyDown(200) Then MoveObject guy\obj, 1
    If KeyDown(208) Then MoveObject guy\obj,-1
    If KeyDown(203) Then TurnObject guy\obj, 1
    If KeyDown(205) Then TurnObject guy\obj,-1
    
    Text 0,0, "ID: "+guy\ID     // Näytetään yksilöintitunnus yläkulmassa.
    Text 0,12,"Healt: "+guy\healt // Näytetään energian määrä yläkulmassa.
    
    Box 50,50,300,200,0 // Piirretään tavallinen laatikko, tähän ei siis liity mitään ihmeellistä.
    
    // Tässä tehdään tarkistus, onko 'guy\obj'-objekti määrättyjen rajojen ulkopuolella, ja jos on, niin vähennetään muuttujasta 'guy\healt' yksi, ja tämä tarkistus siis jokaisella silmukan pyörähdyksellä.
    If ObjectX(guy\obj) < -150 Or ObjectX(guy\obj) > 150 Or ObjectY(guy\obj) < -100 Or ObjectY(guy\obj) > 100 Then guy\healt = guy\healt - 1
    
    If guy\healt =< 0 Then // Jos jäsenen 'healt'-muuttuja on 0 tai alle 0, niin toteutetaan alla oleva.
    
        DeleteObject guy\obj // Poistetaan jäseneen tallennettu media, eli objektin kopio.
        Delete guy // Poistetaan itse jäsen.
        
        If First(PLAYER) = NULL Then Goto create_new_players // Jos kokoelman ensimmäistä jäsentä ei ole olemassa,
                                                             // eli toisin sanoen kokoelmassa ei ole jäseniä, hypätään kohtaan 'create_new_players',
                                                             // jossa siis luodaan uudet jäsenet.
        
        If After(guy) <> NULL Then // Tarkistetaan, että listassa on seuraava jäsen.
            guy = After(guy) // Siirrytään seuraavaan jäseneen.
        Else // Mikäli edellinen ehto ei täyttynyt, niin toteutetaan alla oleva.
            guy.PLAYER = First(PLAYER) // Siirrytään ensimäiseen jäseneen.
        EndIf
        
    EndIf
    
    DrawScreen // Piirretään ruutu.
    
// Lopuksi poistutaan silmukasta, mikäli painetaan ESC-näppäintä. 
// (CB tekee niin muutenkin, jos SAFEEXIT-toiminto on päällä, oletuksena on.)    
    
Until KeyHit(1)
Tämä ei ole enää ihan niin simppeli, joten ei tarvitse säikähtää, vaikkei heti ymmärtäisikään. Testaile ja muokkaa koodia, niin huomaat mikä vaikuttaa mihinkin :)
Post Reply