Tyhmät kysymykset (I/2012)
Re: Tyhmät kysymykset (I/2011)
Terve taas. Tällä kertaa minulla on tällainen pieni ropleemi, että tilekartta ja hahmo, joiden välille on laitettu törmäys, solahtavat toistensa läpi. Tämä johtuu ilmeisesti siitä että tilet ovat 1x1 pikseli ja hahmo on myös yhden pikselin kokoinen. Miten törmäyksen saisi toimimaan? ObjectRangella kokeilin räpeltää, mutta silloin seinän ja hahmon väliin jää toisella puolella seinää pieni rako, joka ei oikein käy päinsä kun pikselit ovat tiukassa (älkää kysykö miksi minä tällaista viritän...).
Eli, osaatteko auttaa?
Eli, osaatteko auttaa?
Re: Tyhmät kysymykset (I/2011)
Tuollaiseen systeemiin kannattaa käyttää pelkkiä kuvia (tai piirtokomentoja, kuten putpixeliä), ja omaa törmäyksentunnistusta. Tee vaikka kaksiulotteinen taulukko joka pitää sisällään seinäkohdat. Kun seinään osutaan, asetetaan ukko takasin edellisiin koordinaatteihin.
Re: Tyhmät kysymykset (I/2011)
Joo, mietin moista, mutta jos kartan koko on 1280x720 niin se voi olla aika työlästä.Jonez wrote:Tuollaiseen systeemiin kannattaa käyttää pelkkiä kuvia (tai piirtokomentoja, kuten putpixeliä), ja omaa törmäyksentunnistusta. Tee vaikka kaksiulotteinen taulukko joka pitää sisällään seinäkohdat. Kun seinään osutaan, asetetaan ukko takasin edellisiin koordinaatteihin.
Re: Tyhmät kysymykset (I/2011)
Kuvittelisi että cb:n karttasysteemillä se vasta raskas olisi. Tässä kuitenkin jonkinlainen esimerkkiversio, jos nyt oikein käsitin mitä halusit:
Code: Select all
Const WIDTH = 1024
Const HEIGHT = 768
SCREEN WIDTH, HEIGHT
Dim karttadata (WIDTH, HEIGHT)
kartta = MakeImage(1024, 768)
DrawToImage kartta
For x = 0 To WIDTH
For y = 0 To HEIGHT
If (x Mod 100 = 0 Or y Mod 100 = 0) And (x Mod 50 <> 0 Or y Mod 50 <> 0) Then
karttadata(x, y) = 1
Dot x, y
EndIf
Next y
Next x
DrawToScreen
ux = 50
uy = 50
Repeat
oldX = ux
oldY = uy
If LeftKey() Or RightKey() Then
ux = ux + (RightKey() - LeftKey())
If ux < 0 Then ux = 0
If ux > WIDTH Then ux = WIDTH
If karttadata(ux, uy) <> 0
ux = oldX
EndIf
EndIf
If UpKey() Or DownKey() Then
uy = uy + (DownKey() - UpKey())
If uy < 0 Then uy = 0
If uy > WIDTH Then uy = WIDTH
If karttadata(ux, uy) <> 0
uy = oldY
EndIf
EndIf
DrawImage kartta, 0, 0
Color cbRed
Dot ux, uy
DrawScreen
Forever
Re: Tyhmät kysymykset (I/2011)
Aa, tämä taitaa mennä näin paremmin. Kiitoksia paljon.Jonez wrote:Kuvittelisi että cb:n karttasysteemillä se vasta raskas olisi. Tässä kuitenkin jonkinlainen esimerkkiversio, jos nyt oikein käsitin mitä halusit:
Code: Select all
koodi
-
- Member
- Posts: 73
- Joined: Sat Feb 25, 2012 3:42 pm
Re: Tyhmät kysymykset (I/2011)
Mihin laitan pääsilmukan? Minulla on monta silmukkaa, jotka pyörittävät syöttökonsoleita(Input-komento). Laitanko pääsilmukan, joka pitää huolen tallentamisesta ja musiikintoistosta yms pelin alkuun, niin se pyörii siellä koko pelin ajan?
Re: Tyhmät kysymykset (I/2011)
Sen voi laittaa mihin tahansa, vaikka alkuun.VerkkoGuru wrote:Mihin laitan pääsilmukan? Minulla on monta silmukkaa, jotka pyörittävät syöttökonsoleita(Input-komento). Laitanko pääsilmukan, joka pitää huolen tallentamisesta ja musiikintoistosta yms pelin alkuun, niin se pyörii siellä koko pelin ajan?
Re: Tyhmät kysymykset (I/2011)
Laita se siihen kohtaan, missä sitä tarvitaan (eli missä itse peli käynnistyy). Jos tarkoitus on ensin kysyä jotain tietoja inputin avulla, niin ne loopit tulevat ensin, sitten vasta pääsilmukka. Jos tarkoitus on pystyä kirjoittamaan samaan aikaan kuin peli pyörii, niin silloin pääsilmukka on sama silmukka, jossa se input komentokin on. Jos on tarkoitus pystyä kesken pelin avaamaan syötekonsolin, kannattaa siirtää tuo input silmukoineen aliohjelmaan (vaikkapa ohjelman loppuun) ja kutsua aliohjelmaa esim. välilyöntiä painettaessa.VerkkoGuru wrote:Mihin laitan pääsilmukan? Minulla on monta silmukkaa, jotka pyörittävät syöttökonsoleita(Input-komento). Laitanko pääsilmukan, joka pitää huolen tallentamisesta ja musiikintoistosta yms pelin alkuun, niin se pyörii siellä koko pelin ajan?
Tallentamista ei kannata tehdä silmukan sisällä (paitsi mahdollisen if-lausekkeen sisässä, joka laukeaa vain tarvittaessa, ei joka kierroksella), sillä tuloksena voi olla kiintolevyn täyttyminen, pelin ja järjestelmän hidastuminen ym.
-
- Member
- Posts: 73
- Joined: Sat Feb 25, 2012 3:42 pm
Re: Tyhmät kysymykset (I/2011)
Tyyppien käyttöä harjoitellessa....
Olen ruvennut opettelemaan tyyppien käyttöä, olen tekemässä samanlaista ohjelmaa, kuin oppitunti 18:ssa on, mutta CloneObjectin kohdalla herjaa kielioppivirhettä, virheilmoituksella, code 55 "Variable cannot be used like this. This should be an assignment statement.". En yhtään ymmärrä, tarkistin peräti oppitunnista, etten kirjoittanut komentoa väärin. Huomasin, että esimerkissä luoti/obj:n sijaan on on luoti\obj, koetin korvata sen=ei vaikutusta.
Varmuuden vuoksi vielä koko koodi(vaihdoin KAIKKI /-merkit \-merkeiksi, nyt herjaa Code 39 Invalid identifier obj/luoti
Olen ruvennut opettelemaan tyyppien käyttöä, olen tekemässä samanlaista ohjelmaa, kuin oppitunti 18:ssa on, mutta CloneObjectin kohdalla herjaa kielioppivirhettä, virheilmoituksella, code 55 "Variable cannot be used like this. This should be an assignment statement.". En yhtään ymmärrä, tarkistin peräti oppitunnista, etten kirjoittanut komentoa väärin. Huomasin, että esimerkissä luoti/obj:n sijaan on on luoti\obj, koetin korvata sen=ei vaikutusta.
Code: Select all
luoti/obj = CloneObject(luoti)
Code: Select all
Type AMMUKSET
Field obj
End Type
FrameLimit 50
ukko=LoadObject("media\soldier.bmp",360)
luoti=LoadObject("Media\bullet.bmp",360)
ShowObject luoti,OFF
Repeat
If LeftKey() Then TurnObject ukko,-1
If RightKey() Then TurnObject ukko,+1
If UpKey() Then MoveObject ukko,+1
If DownKey() Then MoveObject ukko,-1
If KeyDown(57) And reload=0 Then
pati.AMMUKSET = New(AMMUKSET)
luoti\obj = CloneObject(luoti)
CloneObjectPosition luoti\obj,ukko
CloneObjectOrientation luoti\obj,ukko
reload=5
EndIf
If reload=>0 Then reload=reload+1
For pati.AMMUKSET = Each AMMUKSET
MoveObject luoti\obj,+1
If ObjectX(luoti\obj)>262 Or ObjectX(luoti\obj)<32 Or ObjectY(luoti\obj)>32 Or ObjectY(luoti\obj)<263 Then
DeleteObject luoti\obj
Delete luoti
EndIf
Next pati
DrawGame
Color cbOrange
Box 32,32,350,230,0
DrawScreen
Until EscapeKey()
EDIT:
Yritin muuttaa noita pirun muuttujia, mutta ei tulosta, lopulta meni pää sekaisin...
Re: Tyhmät kysymykset (I/2011)
"luoti" on sinulla muuttujana jossa on "masterluoti", joten et voi käyttää sitä tyyppiosoittimena.VerkkoGuru wrote:Tyyppien käyttöä harjoitellessa....
Olen ruvennut opettelemaan tyyppien käyttöä, olen tekemässä samanlaista ohjelmaa, kuin oppitunti 18:ssa on, mutta CloneObjectin kohdalla herjaa kielioppivirhettä, virheilmoituksella, code 55 "Variable cannot be used like this. This should be an assignment statement.". En yhtään ymmärrä, tarkistin peräti oppitunnista, etten kirjoittanut komentoa väärin. Huomasin, että esimerkissä luoti/obj:n sijaan on on luoti\obj, koetin korvata sen=ei vaikutusta.
Varmuuden vuoksi vielä koko koodi(vaihdoin KAIKKI /-merkit \-merkeiksi, nyt herjaa Code 39 Invalid identifier obj/luotiCode: Select all
luoti/obj = CloneObject(luoti)
Code: Select all
Type AMMUKSET Field obj End Type FrameLimit 50 ukko=LoadObject("media\soldier.bmp",360) luoti=LoadObject("Media\bullet.bmp",360) ShowObject luoti,OFF Repeat If LeftKey() Then TurnObject ukko,-1 If RightKey() Then TurnObject ukko,+1 If UpKey() Then MoveObject ukko,+1 If DownKey() Then MoveObject ukko,-1 If KeyDown(57) And reload=0 Then pati.AMMUKSET = New(AMMUKSET) luoti\obj = CloneObject(luoti) CloneObjectPosition luoti\obj,ukko CloneObjectOrientation luoti\obj,ukko reload=5 EndIf If reload=>0 Then reload=reload+1 For pati.AMMUKSET = Each AMMUKSET MoveObject luoti\obj,+1 If ObjectX(luoti\obj)>262 Or ObjectX(luoti\obj)<32 Or ObjectY(luoti\obj)>32 Or ObjectY(luoti\obj)<263 Then DeleteObject luoti\obj Delete luoti EndIf Next pati DrawGame Color cbOrange Box 32,32,350,230,0 DrawScreen Until EscapeKey()
EDIT:Yritin muuttaa noita pirun muuttujia, mutta ei tulosta, lopulta meni pää sekaisin...
For-Each loopissa käytät muuttujaa "pati", joten loopin sisällä sinun pitäisi käyttää myöskin sitä. Eli vaihda luoti\obj -> pati\obj
- anti-koodari
- Newcomer
- Posts: 13
- Joined: Fri Dec 30, 2011 9:40 am
Re: Tyhmät kysymykset (I/2011)
Moi olen pitkästä aikaan taas havahtunut projektini pariin. Miten voisi hypätä takaisin pääsilmukkaan?
Pelin uusin versio tulee kohta ulos.
Pelin uusin versio tulee kohta ulos.
Code: Select all
alkumenu:
Gosub hideAll
Repeat
If KeyHit(cbkey1) Then GoSub alkulisavalikko
Box 100,100, 275, 50,0
Box 100,200, 275, 50,0
Color cborange
Text 100,110,"Paina 1 päästäksesi lisävalikkoon."
Text 100,210,"Paina Space päästäksesi pelaamaan."
DrawScreen
Until KeyHit(cbkeyspace)
Gosub showALL
Color cborange
Return
End
alkulisavalikko:
Gosub hideAll
Repeat
Box 100,200, 275, 50,0
If UpKey()Then volume+1
If DownKey()Then volume-1
Text 100,210, "voluumi" + volume
DrawScreen
Gosub showAll
Until KeyHit(cbKeySpace) Then Goto MainGame
End
Re: Tyhmät kysymykset (I/2011)
Suosittelen käyttämään ainoastaan Gotoa, koska GoSubin käyttö tekee koodista todella sekavaa. Mutta jos nyt haluat käyttää GoSubia niin Returnin avulla pääset takaisin.anti-koodari wrote:Moi olen pitkästä aikaan taas havahtunut projektini pariin. Miten voisi hypätä takaisin pääsilmukkaan?
Pelin uusin versio tulee kohta ulos.
- anti-koodari
- Newcomer
- Posts: 13
- Joined: Fri Dec 30, 2011 9:40 am
Re: Tyhmät kysymykset (I/2011)
Taas törmäsin uuteen ongelmaan .Jos koitat painaa alkumenun aikana entteriä niin ei tapahdu mitään?
Kiitos muuten äsköisestä vastauksesta.
Kiitos muuten äsköisestä vastauksesta.
Code: Select all
alkumenu:
Gosub hideAll
Repeat
If KeyHit(cbkey1) Then GoSub alkulisavalikko
Box 100,100, 275, 50,0
Box 100,200, 275, 50,0
Color cborange
Text 100,110,"Paina 1 päästäksesi lisävalikkoon."
Text 100,210,"Paina Space päästäksesi pelaamaan."
DrawScreen
Until KeyHit(cbkeyreturn)
Gosub showALL
Color cborange
Return
End
alkulisavalikko:
Gosub hideAll
Repeat
Box 100,200, 275, 50,0
If UpKey()Then volume+1
If DownKey()Then volume-1
If volume<0 Then volume=0
If volume > 100 Then volume=100
Text 100,210, "voluumi: " + volume
DrawScreen
Until KeyHit(cbKeySpace)
'Gosub showAll
Return
End
Re: Tyhmät kysymykset (I/2011)
^ Ongelmaan en tiedä ratkaisua, mutta mitä ideaa tehdä peliin valikkoa, jos kerran välilyönnistä pääsee suoraan pelaamaan? Ei mitään, jatkakaa.
Re: Tyhmät kysymykset (I/2011)
Näytä koko koodi. Vaikea arvailla kun hypit sinne sun tänne noilla gosubeilla, eikä kaikkia tarvittavia aliohjelmia ole näkyvissä. Jos mitään ei näytä tapahtuvan, johtuu ongelma todennäköisesti siitä että onnistut luomaan jonkinlaisen silmukan aliohjelmillasi, jolla pääset takaisin alkumenuun silmänräpäyksessä.
@Latexi95
Eikös juuri goton käyttö ole sekavaa? Gosubia voi käyttää pitkälti kuten funktioitakin, eli jaat koodisi järkeviin osiin jotka on nimetty kuvaavasti, ja kutsut aliohjelmia loogisessa järjestyksessä, joskus useammankin kerran. Goto taas hyppää johonkin kohtaa koodia, eikä sieltä enää pääse takaisin, jolloin itse ohjelman luku ei ole suoraviivaista ja koodista tulee sekavaa.
@Latexi95
Eikös juuri goton käyttö ole sekavaa? Gosubia voi käyttää pitkälti kuten funktioitakin, eli jaat koodisi järkeviin osiin jotka on nimetty kuvaavasti, ja kutsut aliohjelmia loogisessa järjestyksessä, joskus useammankin kerran. Goto taas hyppää johonkin kohtaa koodia, eikä sieltä enää pääse takaisin, jolloin itse ohjelman luku ei ole suoraviivaista ja koodista tulee sekavaa.
Re: Tyhmät kysymykset (I/2011)
Lähinnä puhuin sen käytöstä valikoissa. Minusta siinä tapauksessa Goton käyttö selkeyttää koodia.Jonez wrote: @Latexi95
Eikös juuri goton käyttö ole sekavaa? Gosubia voi käyttää pitkälti kuten funktioitakin, eli jaat koodisi järkeviin osiin jotka on nimetty kuvaavasti, ja kutsut aliohjelmia loogisessa järjestyksessä, joskus useammankin kerran. Goto taas hyppää johonkin kohtaa koodia, eikä sieltä enää pääse takaisin, jolloin itse ohjelman luku ei ole suoraviivaista ja koodista tulee sekavaa.
Code: Select all
pääsilmukka:
Repeat
//Ensimmäinen silmukka
if nappia painetaan then Goto asetukset
if toista nappia painetaan Then Goto peli
Forever
asetukset:
Repeat
//Asetussilmukka
if KeyHit(cbKeyEscape) then Goto pääsilmukka
Forever
peli:
Repeat
//Varsinainen peli
Forever
- anti-koodari
- Newcomer
- Posts: 13
- Joined: Fri Dec 30, 2011 9:40 am
Re: Tyhmät kysymykset (I/2011)
Kiitos kaikista vastauksista san sen toimimaan vähän muutin koodia.
- Konstaduck
- Advanced Member
- Posts: 267
- Joined: Sat Dec 17, 2011 3:09 pm
- Location: Nurmijärvi, Finland
- Contact:
Re: Tyhmät kysymykset (I/2011)
Mitäs hyötyä seuraavasta on?
Kuulin jossain, että tämä hyödyttää, mutta mitä?
Code: Select all
Const FP = 60
Framelimit FP
Re: Tyhmät kysymykset (I/2011)
Ainakin sitä, että myöhemmin koodissa voit kirjoittaa vain FP, kun tarvitset johonkin framelimittiin käyttämääsi arvoa, ja sen jälkeen framelimittiä on helppo muokata ilman, että tarvitsee jokaista kohtaa muuttaa erikseen. Samasta syystä myös SCREEN-komennon kanssa kannattaa tehdä samalla tavalla.Konstaduck wrote:Mitäs hyötyä seuraavasta on?
Kuulin jossain, että tämä hyödyttää, mutta mitä?Code: Select all
Const FP = 60 Framelimit FP
- Konstaduck
- Advanced Member
- Posts: 267
- Joined: Sat Dec 17, 2011 3:09 pm
- Location: Nurmijärvi, Finland
- Contact: