Page 11 of 23

Re: Tyhmät kysymykset (I/2011)

Posted: Sun May 06, 2012 2:58 pm
by Sly_Jack0
hienohemmo wrote:Haluasin kysyä miten voin tarkistaa osuuko piirtokomennoilla tehty ympyrä harmaaseen boxin reunaan ja antaa esimerkiksi errorin??
Haulla löytyi: viewtopic.php?f=12&t=574

Re: Tyhmät kysymykset (I/2011)

Posted: Sun May 06, 2012 3:41 pm
by valscion
Sly_Jack0 wrote:
hienohemmo wrote:Haluasin kysyä miten voin tarkistaa osuuko piirtokomennoilla tehty ympyrä harmaaseen boxin reunaan ja antaa esimerkiksi errorin??
Haulla löytyi: viewtopic.php?f=12&t=574
Tuo ei kuitenkaan välttämättä ole kaikista tehokkain tarkistustapa enkä ole varma siitä, miten se toimii viivojen kanssa jotka ovat x- tai y-akselin suuntaisia. Minun linkittämäni stackoverflow-vastaus sopii paremmin tuohon tilanteeseen ja se on myös tehokkaampi. Neljän tarkistuksen sijasta riittää yksi.

Re: Tyhmät kysymykset (I/2011)

Posted: Sun May 06, 2012 4:28 pm
by kiinalainen
Mikäs mahtaa olla helpoin tapa pistää peli .zip muotoon ja ladata jollekkin lataussivustolle (ja mikä sivusto mahtaa olla helpoin)?

Re: Tyhmät kysymykset (I/2011)

Posted: Sun May 06, 2012 5:22 pm
by Awaclus
kiinalainen wrote:Mikäs mahtaa olla helpoin tapa pistää peli .zip muotoon ja ladata jollekkin lataussivustolle (ja mikä sivusto mahtaa olla helpoin)?
Kpelit.net on sivusto, jota suosittelen pelin nettiin lataamista varten. Jos julkaiset pelin foorumilla ja sen tiedostokoko ei ole mahdottoman suuri, voit myös viestiä lähettäessäsi tuolta alhaalta laittaa zip-kansion viestin liitteeksi.

Helpoin tapa pakata tiedostoja on valita kaikki tiedostot ja kansiot, jotka haluat pakata, klikata jotain niistä hiiren oikealla, valita sieltä "Lähetä kohteeseen" tms. ja sieltä pakattu kansio.

Re: Tyhmät kysymykset (I/2011)

Posted: Mon May 07, 2012 7:05 pm
by anti-koodari
Olisiko jossain opas funktioista :mrgreen: , kun en itse osaa.

Re: Tyhmät kysymykset (I/2011)

Posted: Mon May 07, 2012 7:16 pm
by skorpioni-cb
anti-koodari wrote:Olisiko jossain opas funktioista :mrgreen: , kun en itse osaa.
Ihan vaan coolbasicin omaa dokumentaatiota lukemaan, tässä on linkki nettiversioon, ole hyvä :D

Re: Tyhmät kysymykset (I/2011)

Posted: Mon May 07, 2012 7:45 pm
by anti-koodari
Tarkoitan aivan yksinkertaisen selityksen kanssa.

Re: Tyhmät kysymykset (I/2011)

Posted: Mon May 07, 2012 7:56 pm
by skorpioni-cb
anti-koodari wrote:Tarkoitan aivan yksinkertaisen selityksen kanssa.
Miten nyt tuota yksinkertaisemmin voi asian sanoa, yritetään kuitenkin :D
Funktio on kansankielellä toiminto, eli se tekee jotain, kuten komennotkin, tosin funktioista on enemmän hyötyä D:
Coolbasicissa on omia, sisäänrakennettuja funktioita, jotka palauttaa arvo, tämä on funktion toiminta:
  • 1.Kutsutaan funktiota ja annetaan tarvittaessa parametreja(tästä myöhemmin)
    2.Suoritetaan funktio, ja tehdään noilla paramtreilla jotain, jos niitä on :|
    3.Palautetaan haluattessa arvo(Tästä alla esimerkki)

Code: Select all

Function keskiArvo%(int eka,int toka)
    return (eka+toka)/2
EndFunktion
Tuossa oheisessa esimerkissä oli kaikki vaiheet

Re: Tyhmät kysymykset (I/2011)

Posted: Mon May 07, 2012 8:14 pm
by Awaclus
Kun kutsut funktiota, ohjelma suorittaa kaikki funktion komennot kuten missä tahansa muussakin koodissa. Vain funktiolle parametreissä annettuja muuttujia sekä Global-muuttujia käytetään. Jos funktio sisältää komennon Return, funktio palauttaa kyseisen arvon. Funktion suoritettua kaikki komennot, palataan siihen kohtaan koodia, missä funktiota kutsuit.

Re: Tyhmät kysymykset (I/2011)

Posted: Mon May 07, 2012 8:41 pm
by anti-koodari
Nyt ehkä tajusin periaatteen :? . Olisiko jossain jotain oppitunnin tapasta juttua.

Re: Tyhmät kysymykset (I/2011)

Posted: Mon May 07, 2012 9:16 pm
by Jonez
Tässä nopea oppitunnin tapainen juttu.

Koodi jossa kirjoitetaan hei:

Code: Select all

Repeat

    Text 20, 20, "Hei!"
    
    DrawScreen
Forever
Koodi jossa tehdään sama funktiolla:

Code: Select all

Repeat

    KirjoitaHei() //Funktiokutsu
    
    DrawScreen
Forever

//Itse funktio
Function KirjoitaHei()
    Text 20, 20, "Hei!"
EndFunction
Parametrejä:

Code: Select all

Repeat
    
    KirjoitaJotain("Tämä teksti annetaan parametrina!")
    
    DrawScreen
Forever

Function KirjoitaJotain(parametri$)
    //Tässä funktiossa muuttuja "parametri" pitää sisällään annetun tekstinpätkän
    Text 20, 20, parametri
EndFunction
Return-käsky:

Code: Select all

Repeat

    //Jos funktio palauttaa arvo, voi sitä käyttää myös muiden komentojen kanssa
    Text 20, 20, KirjoitaHei2()
    
    DrawScreen
Forever

//Tämä funktio ei yksinään kirjoita sanaa "Hei2", vaan vain palauttaa merkkijonon "Hei2"
Function KirjoitaHei2()

    //Return-käsky tekee kaksi asiaa: 1. Funktiosta poistutaan välittömästi. 2. Palautetaan jokin arvo
    //Tässä palautetaan arvo "Hei2"
    Return "Hei2"
    
    a = 4 //tätä ei ikinä tapahdu, koska funktiosta poistutaan returnin kohdalla
EndFunction
Return ja useampi parametri:

Code: Select all

Repeat
    
    luku1 = 5
    luku2 = 10

    Text 20, 20, "Paljonko on " + luku1 + " + " + luku2 + "?"
    Text 20, 40, "Vastaus: " + Summa(luku1, luku2)
    
    DrawScreen
Forever

//Funktio jolle annetaan kaksi parametria
Function Summa(l1, l2)
    Return l1 + l2 //Lasketaan luvut yhteen ja palautetaan funktiosta
EndFunction

Re: Tyhmät kysymykset (I/2011)

Posted: Mon May 07, 2012 10:07 pm
by axu
Jos ymmärrät miten aliohjelmat (Gosub-käskyn käyttö) toimivat, ei funktioiden ymmärtäminen ole hankalaa. Funktio on käytännössä aliohjelma kolmella ominaispiirteellä.
  • Funktion sisällä on oma nimiavaruus. Eli kaikki muuttujat, joita käytät funktion sisällä "pysyy" sen sisällä eikä niitä voida käyttää sen ulkopuolella. Vastaavasti muun ohjelman käyttämät muuttujat ovat näkymättömiä funktiolle (eli voit käyttää samannimisiä muuttujia, mutta ne ovat silti eri muuttujia). Poikkeuksena taulukot, globaalit muuttujat sekä tyyppikokoelmat.
  • Funktiolle voi antaa muuttujia parametreinä. Koska muuttuja ei pysty suoraan lukemaan pääohjelman käyttämiä muuttujia, sille voidaan ilmoittaa haluttuja tietoja parametreinä (sulkujen sisällä olevat arvot/muuttujat).
  • Funktio palauttaa arvon. Funktiota voi ajatella muuttujana, joka saa arvon vasta silloin, kun sitä pyydetään. Usein tämä arvo riippuu funktiolle välitetyistä parametreistä.
Olet todennäköisesti käyttänyt funktioita, jotka ovat cb:hen sisäänrakennettuja. Omien funktioiden käyttö on aivan samanlaista. Jonezin viestistä saakin aika hyvän kuvan miten niitä omia funktioita tehdään.

Tärkeä kysymys on myös, milloin kannattaa kirjoittaa koodia funktion sisään? Käytännössä aina, kun sinulla on usein koodissa toistuva pätkä, joka laskee jonkin muuttujan arvon tai suorittaa tietyn tehtävän. Aliohjelmaa kannattaa käyttää mieluummin, jos tämä pätkä on todella riippuvainen muista muuttujista, joita ei ole järkeä antaa parametreinä. Poikkeuksia voi tietty tehdä optimointimielessä, mutta siitä ei kannata välittää ennen kuin hallitsee hyvin kielen käytön.

Re: Tyhmät kysymykset (I/2011)

Posted: Thu May 10, 2012 3:37 pm
by skorpioni-cb
axu wrote:Tekstiä funktioista ja aliohjelmista
On totta, että funktioilla on oma nimiavaruus, mutta tämän voi kiertää muistipaloilla, jotka tässä tapauksessa toimivat kuin C/C++-kielien osoittimina, muistipaloihin ei kannata sekaantua, ellet ole aivan varma, että osaat käyttää niitä, ja tiedät niiden vaarat, ta käytätä jotain DLL-kirjastoo etc. Ite olen koodaillut aikast kauan CoolBasicilla( kauan ja kauan, aloitin vuonna 2007) enkä silti osaa käyttää kunnolla muistipaloja(tosin en ymmärrä edes trigonometriaa, mikä vähän nolottaa :oops: )

Ok, tässä kuitenkin mun kysymykset:
  • 1) Mä kysyin IRC:issä vähän siitä, että miten taulukoita voi laittaa typen kenttiin, ei siitä sen enempää, siis kysymys on, että miten voi korostaa tilen esim. laatikolla, mä olen kato tekemässä pientä strategiapelin tynkää.
    2)Äsköseen liittyen, tukeeko CBAstar-kirjasto reittiä, joka menee:
    • a)tilejen kautta
      b)jossa mennään tilejen kulmien yli, eli 45 asteen kulmissa
    3)Kun tekee typen instanssin, jossa siellä olevan objekti-muuttujan tekee poimitavaksi, miten saa tietää, mikä typen instanssi on poimittu(objekti), jotta voidaan antaa esim joukolle käskyn

Re: Tyhmät kysymykset (I/2011)

Posted: Thu May 10, 2012 4:13 pm
by valscion
skorpioni-cb wrote:
  1. miten voi korostaa tilen esim. laatikolla, mä olen kato tekemässä pientä strategiapelin tynkää.
  2. Äsköseen liittyen, tukeeko CBAstar-kirjasto reittiä, joka menee:
    1. tilejen kautta
    2. jossa mennään tilejen kulmien yli, eli 45 asteen kulmissa
  3. Kun tekee typen instanssin, jossa siellä olevan objekti-muuttujan tekee poimitavaksi, miten saa tietää, mikä typen instanssi on poimittu(objekti), jotta voidaan antaa esim joukolle käskyn
Fiksasinpa listasi ainakin kuntoon. Vastaukseni alla:
  1. Etsit tilen maailmankoordinaatit vaikkapa näillä funktioilla (kts. kommentit) ja sitten piirrät laatikon suoraan maailmankoordinaatteihin (DrawToWorld ON) seuraavanlaisesti (maailmaX ja maailmaY ovat edellisten funktioiden palautusarvoja ja tileLeveys ja tileKorkeus ovat yksittäisen tilen leveys tai korkeus pikseleissä):

    Code: Select all

    Box maailmaX, maailmaY, tileLeveys, tileKorkeus, OFF
  2. Molempia tuetaan. Katso cbAStar mukana tullut "Tilemap Example.cb" tiedosto.
  3. Tuota tarkoitusta varten suosittelisin käyttämään ObjectInteger-funktiota ja tallentamaan ConvertToInteger()-funktion arvon objektin yhteyteen. Sitten kun objekti on poimittu niin lukisit ObjectIntegerillä tyypin osoittimen kokonaisluvun ja käyttäisit ConvertToType() funktiota tyypin instanssin selville saamiseksi. Tämän tyylistä koodia siis:

    Code: Select all

    instanssi.TYYPPIKOKOELMA = New(TYYPPIKOKOELMA)
    instanssi\objekti = CloneObject(masterObjekti)
    ObjectInteger instanssi\objekti, ConvertToInteger(instanssi)
    
    ' Sitten kun tarvitset sen instanssin:
    poimittu = PickedObject()
    If poimittu Then
        instanssi.TYYPPIKOKOELMA = ConvertToType(ObjectInteger(poimittu))
        ' Käytä instanssia vapaasti nyt.
    EndIf 
EDIT:

Oikestaan cbAStarin esimerkkiohjelman mukana näyttäisi tulevan tuon ykköskohdan vaatimat funktiot. Ne kulkevat siellä nimellä NodeXtoWorldX ja NodeYtoWorldY.

EDIT:

Korjasin boksin piirron oikeaksi, ei siinä tarvinnutkaan lisäillä tai miinustella mitään erikoista.


Re: Tyhmät kysymykset (I/2011)

Posted: Thu May 10, 2012 4:22 pm
by skorpioni-cb
VesQ wrote:
skorpioni-cb wrote:
  1. miten voi korostaa tilen esim. laatikolla, mä olen kato tekemässä pientä strategiapelin tynkää.
  2. Äsköseen liittyen, tukeeko CBAstar-kirjasto reittiä, joka menee:
    1. tilejen kautta
    2. jossa mennään tilejen kulmien yli, eli 45 asteen kulmissa
  3. Kun tekee typen instanssin, jossa siellä olevan objekti-muuttujan tekee poimitavaksi, miten saa tietää, mikä typen instanssi on poimittu(objekti), jotta voidaan antaa esim joukolle käskyn
Fiksasinpa listasi ainakin kuntoon. Vastaukseni alla:
  1. Etsit tilen maailmankoordinaatit vaikkapa näillä funktioilla (kts. kommentit) ja sitten piirrät laatikon suoraan maailmankoordinaatteihin (DrawToWorld ON) seuraavanlaisesti (maailmaX ja maailmaY ovat edellisten funktioiden palautusarvoja ja tileLeveys ja tileKorkeus ovat yksittäisen tilen leveys tai korkeus pikseleissä):

    Code: Select all

    Box maailmaX + 1, maailmaY + 1, tileLeveys - 2, tileKorkeus - 2, OFF
  2. Molempia tuetaan. Katso cbAStar mukana tullut "Tilemap Example.cb" tiedosto.
  3. Tuota tarkoitusta varten suosittelisin käyttämään ObjectInteger-funktiota ja tallentamaan ConvertToInteger()-funktion arvon objektin yhteyteen. Sitten kun objekti on poimittu niin lukisit ObjectIntegerillä tyypin osoittimen kokonaisluvun ja käyttäisit ConvertToType() funktiota tyypin instanssin selville saamiseksi. Tämän tyylistä koodia siis:

    Code: Select all

    instanssi.TYYPPIKOKOELMA = New(TYYPPIKOKOELMA)
    instanssi\objekti = CloneObject(masterObjekti)
    ObjectInteger instanssi\objekti, ConvertToInteger(instanssi)
    
    ' Sitten kun tarvitset sen instanssin:
    poimittu = PickedObject()
    If poimittu Then
        instanssi.TYYPPIKOKOELMA = ConvertToType(ObjectInteger(poimittu))
        ' Käytä instanssia vapaasti nyt.
    EndIf 
EDIT:

Olen onnistunut ratkomaan seuranta-ongelman CBAStarin FollowPath-funktiolla, eikä kulma-vakioita edes tarvita :D


Re: Tyhmät kysymykset (I/2011)

Posted: Thu May 10, 2012 4:28 pm
by valscion
skorpioni-cb wrote:
EDIT:

Olen onnistunut ratkomaan seuranta-ongelman CBAStarin FollowPath-funktiolla, eikä kulma-vakioita edes tarvita :D

Hieno homma! Huomaathan, että muokkasin laatikon piirtoa varten tarvittavaa koodia viestissäni. Edellinen koodi oli hieman virheellistä.

Re: Tyhmät kysymykset (I/2011)

Posted: Wed May 16, 2012 3:35 pm
by beginner
Mikähän on vikana, kun yritän sijoittaa vihuja tilekartan data-kerroksen avulla, mutta kaikki vihut sijoittuvat samoihin koordinaatteihin?

Code: Select all

For i=1 To 16
    For x=1 To MapWidth()
    For y=1 To MapHeight()
        If GetMap2(3,x,y)=10 Then
            If VIHUTELOSSA(i)=0 Then    
                VIHUTx(i)=(x * 32 -ObjectSizeX(kartta) / 2)
                VIHUTy(i)=-(y * 32 - ObjectSizeY(kartta) / 2)
                VIHUT(i)=CloneObject (v)
                PositionObject VIHUT(i),VIHUTx(i),VIHUTy(i)
                VIHUTELOSSA(i)=1
            EndIf
        EndIf
    Next y
    Next x
Next i
Data-kerroksessa on siis määritelty vihuille 16 eri paikkaa, mutta tuolla koodilla kaikki sijoittuvat ensimmäiseen määriteltyyn paikkaan. Vika on varmaan useissa sisäkkäisissä for-rakenteissa, mutta en nyt äkkiseltään keksi kuinka ne tulisi tehdä jotta koodi toimisi.

Re: Tyhmät kysymykset (I/2011)

Posted: Wed May 16, 2012 4:42 pm
by valscion
beginner wrote:Mikähän on vikana, kun yritän sijoittaa vihuja tilekartan data-kerroksen avulla, mutta kaikki vihut sijoittuvat samoihin koordinaatteihin?

Code: Select all

--nips--
Data-kerroksessa on siis määritelty vihuille 16 eri paikkaa, mutta tuolla koodilla kaikki sijoittuvat ensimmäiseen määriteltyyn paikkaan. Vika on varmaan useissa sisäkkäisissä for-rakenteissa, mutta en nyt äkkiseltään keksi kuinka ne tulisi tehdä jotta koodi toimisi.
Kyllä tuo koodinpätkä näyttäisi olevan ihan toimiva. Oletko tarkistanut että pääset varmasti tuonne sisimpään for-looppiin asti etteivät nuo If-ehtolauseet estä sinne pääsyä?

Huomasin myös että käyt vähän hitaalla tavalla silmukoita läpi, kun tarkistat jokaisen vihollisen kohdalla aina uudelleen kartan kaikki tilet. Optimoidumpi versio olisi siirtää se ensimmäinen "For i=1 To 16" silmukka sisimmäiseksi, kas näin:

Code: Select all

For x=1 To MapWidth()
For y=1 To MapHeight()
    If GetMap2(3,x,y)=10 Then
        For i=1 To 16
            If VIHUTELOSSA(i)=0 Then   
                VIHUTx(i)=(x * 32 -ObjectSizeX(kartta) / 2)
                VIHUTy(i)=-(y * 32 - ObjectSizeY(kartta) / 2)
                VIHUT(i)=CloneObject (v)
                PositionObject VIHUT(i),VIHUTx(i),VIHUTy(i)
                VIHUTELOSSA(i)=1
            EndIf
        Next i
    EndIf
Next y
Next x

Re: Tyhmät kysymykset (I/2011)

Posted: Wed May 16, 2012 10:08 pm
by beginner
Sain toimimaan kun poistin tuon VIHUTELOSSA(i)=0 ehdon. Kiitokset avusta

Re: Tyhmät kysymykset (I/2011)

Posted: Wed May 16, 2012 11:04 pm
by beginner
Ei se oikein toimikaan...Nyt jokaiseen data-kerrokseen merkittyyn paikkaan kyllä ilmestyy vihu-objekti, mutta kun pääsilmukkaan laittaa esimerkiksi:

Code: Select all

For a=1 To 16
    MoveObject VIHUT(a),Rand(1,2)
Next a 
Niin kaikki muut vihut pysyvät paikallaan, paitsi tuon alkuperäisen "skannauksen" viimeisten koordinaattien kohdalta lähtee liikkeelle 16 vihulaisen jono. Mitähän ne 15 muuta paikoillaan pysyvää objektia sitten ovat? VIHUT() taulokossa on nimittäin vain tuo 16 solua.