Re: Tyhmät kysymykset (I/2011)
Haulla löytyi: viewtopic.php?f=12&t=574hienohemmo wrote:Haluasin kysyä miten voin tarkistaa osuuko piirtokomennoilla tehty ympyrä harmaaseen boxin reunaan ja antaa esimerkiksi errorin??
Game Making Should Be Easy...
https://www.coolbasic.com/phpBB3/
Haulla löytyi: viewtopic.php?f=12&t=574hienohemmo wrote:Haluasin kysyä miten voin tarkistaa osuuko piirtokomennoilla tehty ympyrä harmaaseen boxin reunaan ja antaa esimerkiksi errorin??
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.Sly_Jack0 wrote:Haulla löytyi: viewtopic.php?f=12&t=574hienohemmo wrote:Haluasin kysyä miten voin tarkistaa osuuko piirtokomennoilla tehty ympyrä harmaaseen boxin reunaan ja antaa esimerkiksi errorin??
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.kiinalainen wrote:Mikäs mahtaa olla helpoin tapa pistää peli .zip muotoon ja ladata jollekkin lataussivustolle (ja mikä sivusto mahtaa olla helpoin)?
Ihan vaan coolbasicin omaa dokumentaatiota lukemaan, tässä on linkki nettiversioon, ole hyväanti-koodari wrote:Olisiko jossain opas funktioista , kun en itse osaa.
Miten nyt tuota yksinkertaisemmin voi asian sanoa, yritetään kuitenkinanti-koodari wrote:Tarkoitan aivan yksinkertaisen selityksen kanssa.
Code: Select all
Repeat
Text 20, 20, "Hei!"
DrawScreen
Forever
Code: Select all
Repeat
KirjoitaHei() //Funktiokutsu
DrawScreen
Forever
//Itse funktio
Function KirjoitaHei()
Text 20, 20, "Hei!"
EndFunction
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
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
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
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 )axu wrote:Tekstiä funktioista ja aliohjelmista
Fiksasinpa listasi ainakin kuntoon. Vastaukseni alla:skorpioni-cb wrote:
- miten voi korostaa tilen esim. laatikolla, mä olen kato tekemässä pientä strategiapelin tynkää.
- Äsköseen liittyen, tukeeko CBAstar-kirjasto reittiä, joka menee:
- tilejen kautta
- jossa mennään tilejen kulmien yli, eli 45 asteen kulmissa
- 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
Code: Select all
Box maailmaX, maailmaY, tileLeveys, tileKorkeus, OFF
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
Oikestaan cbAStarin esimerkkiohjelman mukana näyttäisi tulevan tuon ykköskohdan vaatimat funktiot. Ne kulkevat siellä nimellä NodeXtoWorldX ja NodeYtoWorldY.
Korjasin boksin piirron oikeaksi, ei siinä tarvinnutkaan lisäillä tai miinustella mitään erikoista.
VesQ wrote:Fiksasinpa listasi ainakin kuntoon. Vastaukseni alla:skorpioni-cb wrote:
- miten voi korostaa tilen esim. laatikolla, mä olen kato tekemässä pientä strategiapelin tynkää.
- Äsköseen liittyen, tukeeko CBAstar-kirjasto reittiä, joka menee:
- tilejen kautta
- jossa mennään tilejen kulmien yli, eli 45 asteen kulmissa
- 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
- 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
- Molempia tuetaan. Katso cbAStar mukana tullut "Tilemap Example.cb" tiedosto.
- 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
Olen onnistunut ratkomaan seuranta-ongelman CBAStarin FollowPath-funktiolla, eikä kulma-vakioita edes tarvita
Hieno homma! Huomaathan, että muokkasin laatikon piirtoa varten tarvittavaa koodia viestissäni. Edellinen koodi oli hieman virheellistä.skorpioni-cb wrote:EDIT:Olen onnistunut ratkomaan seuranta-ongelman CBAStarin FollowPath-funktiolla, eikä kulma-vakioita edes tarvita
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
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ä?beginner wrote:Mikähän on vikana, kun yritän sijoittaa vihuja tilekartan data-kerroksen avulla, mutta kaikki vihut sijoittuvat samoihin koordinaatteihin?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.Code: Select all
--nips--
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
Code: Select all
For a=1 To 16
MoveObject VIHUT(a),Rand(1,2)
Next a