Tyhmät kysymykset (I/2012)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
User avatar
Noun
Newcomer
Posts: 19
Joined: Sun May 08, 2011 8:17 pm
Contact:

Re: Tyhmät kysymykset (I/2011)

Post by Noun »

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?
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset (I/2011)

Post by Jonez »

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.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
User avatar
Noun
Newcomer
Posts: 19
Joined: Sun May 08, 2011 8:17 pm
Contact:

Re: Tyhmät kysymykset (I/2011)

Post by Noun »

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.
Joo, mietin moista, mutta jos kartan koko on 1280x720 niin se voi olla aika työlästä.
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset (I/2011)

Post by Jonez »

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
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
User avatar
Noun
Newcomer
Posts: 19
Joined: Sun May 08, 2011 8:17 pm
Contact:

Re: Tyhmät kysymykset (I/2011)

Post by Noun »

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
Aa, tämä taitaa mennä näin paremmin. Kiitoksia paljon.
VerkkoGuru
Member
Posts: 73
Joined: Sat Feb 25, 2012 3:42 pm

Re: Tyhmät kysymykset (I/2011)

Post by VerkkoGuru »

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?
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2011)

Post by Awaclus »

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?
Sen voi laittaa mihin tahansa, vaikka alkuun.
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: Tyhmät kysymykset (I/2011)

Post by axu »

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?
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.
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.
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
VerkkoGuru
Member
Posts: 73
Joined: Sat Feb 25, 2012 3:42 pm

Re: Tyhmät kysymykset (I/2011)

Post by VerkkoGuru »

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.

Code: Select all

    luoti/obj = CloneObject(luoti)
Varmuuden vuoksi vielä koko koodi(vaihdoin KAIKKI /-merkit \-merkeiksi, nyt herjaa Code 39 Invalid identifier obj/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...

Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2011)

Post by Latexi95 »

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.

Code: Select all

    luoti/obj = CloneObject(luoti)
Varmuuden vuoksi vielä koko koodi(vaihdoin KAIKKI /-merkit \-merkeiksi, nyt herjaa Code 39 Invalid identifier obj/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...

"luoti" on sinulla muuttujana jossa on "masterluoti", joten et voi käyttää sitä tyyppiosoittimena.
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
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 »

Moi olen pitkästä aikaan taas havahtunut projektini pariin. :) Miten voisi hypätä takaisin pääsilmukkaan?
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 
    
Olen amatööri.
projektit:
Space Company: the Border Guard
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2011)

Post by Latexi95 »

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

Taas törmäsin uuteen ongelmaan :oops:.Jos koitat painaa alkumenun aikana entteriä niin ei tapahdu mitään?
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 
 
Olen amatööri.
projektit:
Space Company: the Border Guard
Storm-koulussa

Re: Tyhmät kysymykset (I/2011)

Post by Storm-koulussa »

^ Ongelmaan en tiedä ratkaisua, mutta mitä ideaa tehdä peliin valikkoa, jos kerran välilyönnistä pääsee suoraan pelaamaan? Ei mitään, jatkakaa.
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset (I/2011)

Post by Jonez »

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.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Latexi95
Guru
Posts: 1166
Joined: Sat Sep 20, 2008 5:10 pm
Location: Lempäälä

Re: Tyhmät kysymykset (I/2011)

Post by Latexi95 »

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.
Lähinnä puhuin sen käytöstä valikoissa. Minusta siinä tapauksessa Goton käyttö selkeyttää koodia.

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
Tietysti vastaavaan voisi käyttää Gosubia, mutta se muuttuu mielestäni sekavaksi kun hypitään enemmän. Return on ongelmallinen ja aiheuttaa helposti sekavuutta, kun se palaa sinne missä on kutsuttu. Tämä on tietysti milipideasia.Usein silmukan alussa tehdään kaikenlaisia alustuksia kuten avataan Input tai ladataan jotain. Jos tälläisiä täytyy tehdä esimerkiksi päävalikossa mistä napeilla pääsee toisiin valikkoihin, niin alustukset täytyy laittaa joko toiseen silmukkaan ennen Returnin kutsumista taikka Gosubin jälkeen. Gotolla taas voidaan mennä suoraan silmukan "päälle" ja tehdä alustukset sillä joka kerta. Tässä tapauksessa Gosubin käyttö aiheuttaisi ylimääräistä kirjoittamista.
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 »

Kiitos kaikista vastauksista san sen toimimaan vähän muutin koodia.
Olen amatööri.
projektit:
Space Company: the Border Guard
User avatar
Konstaduck
Advanced Member
Posts: 267
Joined: Sat Dec 17, 2011 3:09 pm
Location: Nurmijärvi, Finland
Contact:

Re: Tyhmät kysymykset (I/2011)

Post by Konstaduck »

Mitäs hyötyä seuraavasta on?

Code: Select all

Const FP = 60
Framelimit FP
Kuulin jossain, että tämä hyödyttää, mutta mitä?
Konstaduck.net
<Ize> Pitäs tehä allekirjotus..
<Ize> Vois keksiä jonkin nasahtavan sanonnan..
<Ize> Siitä tulis upea legenda ja kaikki vaihtaisivat allekirjoituksensa siihen.
<Ize> Ehkä ei kuitenkaa...
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2011)

Post by Awaclus »

Konstaduck wrote:Mitäs hyötyä seuraavasta on?

Code: Select all

Const FP = 60
Framelimit FP
Kuulin jossain, että tämä hyödyttää, mutta mitä?
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.
User avatar
Konstaduck
Advanced Member
Posts: 267
Joined: Sat Dec 17, 2011 3:09 pm
Location: Nurmijärvi, Finland
Contact:

Re: Tyhmät kysymykset (I/2011)

Post by Konstaduck »

Jostain luin, että tällöin peli on FPS riippumaton...
Konstaduck.net
<Ize> Pitäs tehä allekirjotus..
<Ize> Vois keksiä jonkin nasahtavan sanonnan..
<Ize> Siitä tulis upea legenda ja kaikki vaihtaisivat allekirjoituksensa siihen.
<Ize> Ehkä ei kuitenkaa...
Locked