Tyhmät kysymykset (I/2012)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
Sly_Jack0
Devoted Member
Posts: 612
Joined: Mon Dec 10, 2007 8:25 am

Re: Tyhmät kysymykset (I/2011)

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

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.
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
kiinalainen
Newcomer
Posts: 2
Joined: Sun May 06, 2012 4:24 pm

Re: Tyhmät kysymykset (I/2011)

Post by kiinalainen »

Mikäs mahtaa olla helpoin tapa pistää peli .zip muotoon ja ladata jollekkin lataussivustolle (ja mikä sivusto mahtaa olla helpoin)?
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2011)

Post 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.
User avatar
anti-koodari
Newcomer
Posts: 13
Joined: Fri Dec 30, 2011 9:40 am

Re: Tyhmät kysymykset (I/2011)

Post by anti-koodari »

Olisiko jossain opas funktioista :mrgreen: , kun en itse osaa.
Olen amatööri.
projektit:
Space Company: the Border Guard
skorpioni-cb
Advanced Member
Posts: 364
Joined: Wed Dec 03, 2008 3:48 pm
Location: Turku

Re: Tyhmät kysymykset (I/2011)

Post 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
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
anti-koodari
Newcomer
Posts: 13
Joined: Fri Dec 30, 2011 9:40 am

Re: Tyhmät kysymykset (I/2011)

Post by anti-koodari »

Tarkoitan aivan yksinkertaisen selityksen kanssa.
Olen amatööri.
projektit:
Space Company: the Border Guard
skorpioni-cb
Advanced Member
Posts: 364
Joined: Wed Dec 03, 2008 3:48 pm
Location: Turku

Re: Tyhmät kysymykset (I/2011)

Post 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
Last edited by skorpioni-cb on Mon May 07, 2012 8:37 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.
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2011)

Post 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.
User avatar
anti-koodari
Newcomer
Posts: 13
Joined: Fri Dec 30, 2011 9:40 am

Re: Tyhmät kysymykset (I/2011)

Post by anti-koodari »

Nyt ehkä tajusin periaatteen :? . Olisiko jossain jotain oppitunnin tapasta juttua.
Olen amatööri.
projektit:
Space Company: the Border Guard
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset (I/2011)

Post 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
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: Tyhmät kysymykset (I/2011)

Post 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.
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
skorpioni-cb
Advanced Member
Posts: 364
Joined: Wed Dec 03, 2008 3:48 pm
Location: Turku

Re: Tyhmät kysymykset (I/2011)

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

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.

Last edited by valscion on Thu May 10, 2012 4:23 pm, edited 2 times in total.
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
skorpioni-cb
Advanced Member
Posts: 364
Joined: Wed Dec 03, 2008 3:48 pm
Location: Turku

Re: Tyhmät kysymykset (I/2011)

Post 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

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
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 »

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ä.
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
beginner

Re: Tyhmät kysymykset (I/2011)

Post 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.
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 »

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
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
beginner

Re: Tyhmät kysymykset (I/2011)

Post by beginner »

Sain toimimaan kun poistin tuon VIHUTELOSSA(i)=0 ehdon. Kiitokset avusta
beginner

Re: Tyhmät kysymykset (I/2011)

Post 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.
Locked