Page 19 of 23

Re: Tyhmät kysymykset (I/2012)

Posted: Sat Apr 27, 2013 3:44 pm
by Awaclus
legend wrote:

Code: Select all

ObjectOrder ukko, 1
Se kartta varmaan kannattaisi ennemmin järjestää alimmaksi, jos vaikka joskus haluaa muitakin objekteja kuin pelkän ukon.

Tyhmät kysymykset (I/2012)

Posted: Sun May 12, 2013 12:11 pm
by Ize
Onko mitään keinoa saada hiiren sijainti tileinä? Ei ole sisäisiä komentoja, mutta joku funkkari mahdollisesti?

Re: Tyhmät kysymykset (I/2012)

Posted: Sun May 12, 2013 12:35 pm
by valscion
Ize wrote:Onko mitään keinoa saada hiiren sijainti tileinä? Ei ole sisäisiä komentoja, mutta joku funkkari mahdollisesti?
MouseWX(), MouseWY() ja nämä: www.cbrepository.com/codes/code/69/

Re: Tyhmät kysymykset (I/2012)

Posted: Tue May 21, 2013 12:54 am
by Ryitt
Miksi chatruutu kuva piirtyy kartan alle eikä päälle? Jos ottaa kartan pois niin sit se näkyy(oletettavasti). Missä vika?

Code: Select all

FrameLimit 40 
SCREEN 640,480,0,cbfullscreen

kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
PlayObject kartta,0,0,1

ukko = LoadObject ("Media\guy.bmp",72)

SetupCollision ukko, kartta, 1, 4, 2

tausta=LoadImage("Media\chatruutu.bmp")

gamma=-255
ScreenGamma gamma,gamma,gamma

MaskImage tausta, 255,255,255

While gamma<=0
    DrawImage tausta,0,320
    Text 30,350,"Jotain höopinää"
    text 30,370,"Ja lisää"
    Text 480,450,"..."

    ScreenGamma gamma,gamma,gamma
    gamma=gamma+1.5
    UpdateGame
    DrawScreen    
Wend

Re: Tyhmät kysymykset (I/2012)

Posted: Tue May 21, 2013 1:12 am
by koodaaja
Koska CB:ssä jälkimmäisenä piirretty kuva jää aina päällimmäiseksi, ja objektit piirretään oletuksena DrawScreeniä kutsuttaessa. Objektien piirtoa voi aikaistaa komentamalla DrawGame, joka piirtää siis objektit näytölle minkä jälkeen voit piirrellä niiden päälle. Vastaavasti UpdateGamesi on sinänsä turha että sitä kutsutaan joka tapauksessa DrawScreenin yhteydessä jos edellisen DrawScreenin jälkeen sitä ei ole erikseen kutsuttu.

Eli näin:

Code: Select all

FrameLimit 40 
SCREEN 640,480,0,cbfullscreen

kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
PlayObject kartta,0,0,1

ukko = LoadObject ("Media\guy.bmp",72)

SetupCollision ukko, kartta, 1, 4, 2

tausta=LoadImage("Media\chatruutu.bmp")

gamma=-255
ScreenGamma gamma,gamma,gamma

MaskImage tausta, 255,255,255

While gamma<=0
    DrawGame
    DrawImage tausta,0,320
    Text 30,350,"Jotain höopinää"
    text 30,370,"Ja lisää"
    Text 480,450,"..."

    ScreenGamma gamma,gamma,gamma
    gamma=gamma+1.5
    DrawScreen    
Wend
Ylimääräisiä huomioita: 1) on kiva jos korvaat omat mediasi jollain oletuskansiosta löytyvällä niin ohjelman voi suoraan ajaa kokeillakseen virhettä ja 2) pliis, ei kokoruudun tiloja pieniin testipätkiin, en ymmärrä miten kukaan jaksaa devata mitään siten että joka käännöllä odottaa monta sekuntia tilojen vaihtumisia :(

Re: Tyhmät kysymykset (I/2012)

Posted: Wed May 22, 2013 1:39 am
by Ryitt
Lisää kysymyksiä mutta ei niitä toivottavasti liikaa ole.
Kun tuo setupcollision törmäys näyttää toimivan vain objectin reunoihin niin miten voin tarkistaa onko esimerkiksi ukko törmättävän seinän sisällä ja täten estää liikkumisen jos ukko kerta liikkuu tilen kerrallaan niin että se pomppaa suoraan sisään.
Vaikeasti selitetty mutta esimerkki... ->

Code: Select all

FrameLimit 40 
kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
PlayObject kartta,0,0,1

ukko = LoadObject ("Media\guy.bmp",4)

SetupCollision ukko, kartta, 1, 4, 2

Repeat
    If LeftKey() Then 
        If ObjectAngle(ukko) = 180 Then
            MoveObject ukko,32
            liiku=Timer()
            Repeat 
            Until TIMER()>liiku+200
            ClearKeys            
        Else
            RotateObject ukko,180
            liiku=Timer()
            Repeat 
            Until TIMER()>liiku+200
            ClearKeys
        EndIf
    EndIf
            
    If RightKey() Then
        If ObjectAngle(ukko) = 0 Then
            MoveObject ukko,32
            liiku=Timer()
            Repeat 
            Until TIMER()>liiku+200
            ClearKeys
        Else
            RotateObject ukko,0
            liiku=Timer()
            Repeat 
            Until TIMER()>liiku+200
            ClearKeys
        EndIf
    EndIf
    
    If UpKey() Then 
        If ObjectAngle(ukko) = 90 Then
            MoveObject ukko,32
            liiku=Timer()
            Repeat 
            Until TIMER()>liiku+200
            ClearKeys
        Else
            RotateObject ukko,90
            liiku=Timer()
            Repeat 
            Until TIMER()>liiku+200
            ClearKeys
        EndIf
    EndIf    
        
    If DownKey() Then 
        If ObjectAngle(ukko) = 270 Then
            MoveObject ukko,32
            liiku=Timer()
            Repeat 
            Until TIMER()>liiku+200
            ClearKeys
        Else
            RotateObject ukko,270
            liiku=Timer()
            Repeat 
            Until TIMER()>liiku+200
            ClearKeys
        EndIf
    EndIf
    
    UpdateGame

    CloneCameraPosition ukko

    DrawScreen

Forever

Re: Tyhmät kysymykset (I/2012)

Posted: Wed May 22, 2013 3:05 am
by Awaclus
Ryitt wrote:Lisää kysymyksiä mutta ei niitä toivottavasti liikaa ole.
Kun tuo setupcollision törmäys näyttää toimivan vain objectin reunoihin niin miten voin tarkistaa onko esimerkiksi ukko törmättävän seinän sisällä ja täten estää liikkumisen jos ukko kerta liikkuu tilen kerrallaan niin että se pomppaa suoraan sisään.
Vaikeasti selitetty mutta esimerkki... ->

Code: Select all

FrameLimit 40 
kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
PlayObject kartta,0,0,1

ukko = LoadObject ("Media\guy.bmp",4)

SetupCollision ukko, kartta, 1, 4, 2

Repeat
    If LeftKey() Then 
        If ObjectAngle(ukko) = 180 Then
            MoveObject ukko,32
            liiku=Timer()
            Repeat 
            Until TIMER()>liiku+200
            ClearKeys            
        Else
            RotateObject ukko,180
            liiku=Timer()
            Repeat 
            Until TIMER()>liiku+200
            ClearKeys
        EndIf
    EndIf
            
    If RightKey() Then
        If ObjectAngle(ukko) = 0 Then
            MoveObject ukko,32
            liiku=Timer()
            Repeat 
            Until TIMER()>liiku+200
            ClearKeys
        Else
            RotateObject ukko,0
            liiku=Timer()
            Repeat 
            Until TIMER()>liiku+200
            ClearKeys
        EndIf
    EndIf
    
    If UpKey() Then 
        If ObjectAngle(ukko) = 90 Then
            MoveObject ukko,32
            liiku=Timer()
            Repeat 
            Until TIMER()>liiku+200
            ClearKeys
        Else
            RotateObject ukko,90
            liiku=Timer()
            Repeat 
            Until TIMER()>liiku+200
            ClearKeys
        EndIf
    EndIf    
        
    If DownKey() Then 
        If ObjectAngle(ukko) = 270 Then
            MoveObject ukko,32
            liiku=Timer()
            Repeat 
            Until TIMER()>liiku+200
            ClearKeys
        Else
            RotateObject ukko,270
            liiku=Timer()
            Repeat 
            Until TIMER()>liiku+200
            ClearKeys
        EndIf
    EndIf
    
    UpdateGame

    CloneCameraPosition ukko

    DrawScreen

Forever
Ukon siirtämisen perään GetMapilla tarkistat, onko ukon koordinaattien alla olevassa törmäyskerroksessa muu kuin 0, ja jos on niin ukon ei kuuluisi olla siinä (eli sitten se siirretään takaisin). Tai vaihtoehtoisesti voi tarkistaa, onko ukon leveyden verran ukon vieressä olevissa koordinaateissa törmäyskerroksessa 0 ja liikutaan jos ja vain jos se on 0.

Saattoi tulla näin kolmelta aamuyöstä hieman sekava viesti, mutta kai tuosta jotain saa irti.

Tyhmät kysymykset (I/2012)

Posted: Sat May 25, 2013 7:26 pm
by Ize
Olisi pieni ongelma. Jälleen.

Elikkäs olen wörkännyt objektin, joka hyppii ja pyörähtää samalla. Ongelma on se että kun objekti pyörii/on jossain muussa kulmassa, kuin alkuperäisessä, objektin ympärille ilmestyy "musta laatikko", joka katoaa kun objekti palaa alkuperäiseen asentoon. Olen törmännyt tähän monia kertoja, mutta vasta nyt se on todella haitaksi.

Re: Tyhmät kysymykset (I/2012)

Posted: Sat May 25, 2013 7:36 pm
by Latexi95
Ize wrote:Olisi pieni ongelma. Jälleen.

Elikkäs olen wörkännyt objektin, joka hyppii ja pyörähtää samalla. Ongelma on se että kun objekti pyörii/on jossain muussa kulmassa, kuin alkuperäisessä, objektin ympärille ilmestyy "musta laatikko", joka katoaa kun objekti palaa alkuperäiseen asentoon. Olen törmännyt tähän monia kertoja, mutta vasta nyt se on todella haitaksi.
Varmaankin käytät MaskObjectia? MaskObjectissa on sellainen ominaisuus/bugi, että se ei toimi objekteilla joita pyöritellään. :(
Ongelman voi kiertää käyttämällä maskivärinä mustaa, niin kuin oletuksena on, jolloin ei tarvitse kutsua MaskObjectia. Jos kuvassasi tarvitaan mustaa väriä voit muuttaa sen esimerkiksi 1,0,0 väriksi, jolloin se näyttää samalta mutta ei kuitenkaan maskaudu pois.

Re: Tyhmät kysymykset (I/2012)

Posted: Sat May 25, 2013 7:47 pm
by Ize
Latexi95 wrote: Varmaankin käytät MaskObjectia? MaskObjectissa on sellainen ominaisuus/bugi, että se ei toimi objekteilla joita pyöritellään. :(
Ongelman voi kiertää käyttämällä maskivärinä mustaa, niin kuin oletuksena on, jolloin ei tarvitse kutsua MaskObjectia. Jos kuvassasi tarvitaan mustaa väriä voit muuttaa sen esimerkiksi 1,0,0 väriksi, jolloin se näyttää samalta mutta ei kuitenkaan maskaudu pois.
Juu. Nyt toimii :)

Re: Tyhmät kysymykset (I/2012)

Posted: Mon May 27, 2013 6:22 pm
by Paroni
Taas pieni tyhmä kysymys. Tuntuu hyvin onnettomalta ku en saa millään seuraavaa koodia muutettua toimimaan For -looppina:

Code: Select all

Function UpdateDrawNums()
        For pwn.PAWN = Each PAWN
        If pwn\PosY = PlayerPosY-(TileSize*5) Then
                pwn\DrawNum = 1
        ElseIf pwn\PosY = PlayerPosY-(TileSize*4) Then
                pwn\DrawNum = 2
        ElseIf pwn\PosY = PlayerPosY-(TileSize*3) Then
                pwn\DrawNum = 3
        ElseIf pwn\PosY = PlayerPosY-(TileSize*2) Then
                pwn\DrawNum = 4
        ElseIf pwn\PosY = PlayerPosY-(TileSize*1) Then
                pwn\DrawNum = 5
        ElseIf pwn\PosY = PlayerPosY Then
                pwn\DrawNum = 6
        ElseIf pwn\PosY = PlayerPosY+(TileSize*1) Then
                pwn\DrawNum = 7
        ElseIf pwn\PosY = PlayerPosY+(TileSize*2) Then
                pwn\DrawNum = 8
        ElseIf pwn\PosY = PlayerPosY+(TileSize*3) Then
                pwn\DrawNum = 9
        ElseIf pwn\PosY = PlayerPosY+(TileSize*4) Then
                pwn\DrawNum = 10
        ElseIf pwn\PosY = PlayerPosY+(TileSize*5) Then
                pwn\DrawNum = 11
        Else
                pwn\DrawNum = 0
        EndIf
        Next pwn
EndFunction
Olen nyt ties mitä kokeillut mutta aina on sama tulos: Yksi rivi hahmoja näkyy kerrallaan ja pelaaja ei näy ollenkaan

Code: Select all

Function UpdateDrawNums()
CurDrawNum = 1
Tiles = 5
For i = -Tiles To Tiles
        For pwn.PAWN = Each PAWN
                If pwn\PosY = PlayerPosY+(TileSize*i)
                        pwn\DrawNum = CurDrawNum
                Else
                        pwn\DrawNum = 0
                EndIf
        Next pwn
        CurDrawNum+1
Next i
EndFunction

Re: Tyhmät kysymykset (I/2012)

Posted: Mon May 27, 2013 7:59 pm
by naputtelija
Paroni wrote:Taas pieni tyhmä kysymys. Tuntuu hyvin onnettomalta ku en saa millään seuraavaa koodia muutettua toimimaan For -looppina:

Code: Select all

Function UpdateDrawNums()
        For pwn.PAWN = Each PAWN
        If pwn\PosY = PlayerPosY-(TileSize*5) Then
                pwn\DrawNum = 1
        ElseIf pwn\PosY = PlayerPosY-(TileSize*4) Then
                pwn\DrawNum = 2
        ElseIf pwn\PosY = PlayerPosY-(TileSize*3) Then
                pwn\DrawNum = 3
        ElseIf pwn\PosY = PlayerPosY-(TileSize*2) Then
                pwn\DrawNum = 4
        ElseIf pwn\PosY = PlayerPosY-(TileSize*1) Then
                pwn\DrawNum = 5
        ElseIf pwn\PosY = PlayerPosY Then
                pwn\DrawNum = 6
        ElseIf pwn\PosY = PlayerPosY+(TileSize*1) Then
                pwn\DrawNum = 7
        ElseIf pwn\PosY = PlayerPosY+(TileSize*2) Then
                pwn\DrawNum = 8
        ElseIf pwn\PosY = PlayerPosY+(TileSize*3) Then
                pwn\DrawNum = 9
        ElseIf pwn\PosY = PlayerPosY+(TileSize*4) Then
                pwn\DrawNum = 10
        ElseIf pwn\PosY = PlayerPosY+(TileSize*5) Then
                pwn\DrawNum = 11
        Else
                pwn\DrawNum = 0
        EndIf
        Next pwn
EndFunction
Olen nyt ties mitä kokeillut mutta aina on sama tulos: Yksi rivi hahmoja näkyy kerrallaan ja pelaaja ei näy ollenkaan

Code: Select all

Function UpdateDrawNums()
CurDrawNum = 1
Tiles = 5
For i = -Tiles To Tiles
        For pwn.PAWN = Each PAWN
                If pwn\PosY = PlayerPosY+(TileSize*i)
                        pwn\DrawNum = CurDrawNum
                Else
                        pwn\DrawNum = 0
                EndIf
        Next pwn
        CurDrawNum+1
Next i
EndFunction
Auttaisi, jos selittäisit mitä koodin kuuluu tehdä. Jos tarkoitus on tehdä shakkilautatyyppinen peli, jossa pelaaja liikkuu ruudulla, niin tuota voisi lähteä toteuttaman paremminkin.

Re: Tyhmät kysymykset (I/2012)

Posted: Mon May 27, 2013 8:49 pm
by Paroni
Totta tosiaan. Tarkoitus siis olisi käydä x määrä tilejä, esimerkissäni 11, joiden keskimmäisessä tilessä on pelaajan sijainti. Käydään ylhäältä alas läpi näillä tileillä sijaitsevat hahmot ja annetaan sen mukaan DrawNum. Seuraava funktio sitten piirtää tämän numeron perusteella ruudulle:

Code: Select all

Function DrawPawns()
        For i = 1 To Tiles // edit: Tilesin sijaan oikeassa koodissa on vain "11" 
                For pwn.PAWN = Each PAWN
                        If pwn\DrawNum = i Then
                                DrawImage pwn\Img, pwn\PosX, pwn\PosY-(ImageHeight(pwn\Img)/2), pwn\Facing-1
                        EndIf
                Next pwn
        Next i
EndFunction
Tämän lisäksi UpdateDrawNums kutsutaan vain silloin, kun joku on lopettanut liikkumisen. Tämä tehdään siis siksi, koska spriteni ovat 32x64 kokoisia joten hahmojen "pitää" näkyä toisten edessä tai takan riippuen näiden y koordinaatista.

Varmasti noiden sorttaukseen olisi jokin elegantimpi ja tehokkaampi tapa, mutta tämä on paras tapa jonka olen tähän mennessä saanut toimimaan.
EDIT:

Hah!

Keksinkin yöunien jälkeen mistä kenkä puristaa. Else ...drawnum 0 tosiaan nollaa jokaisen hahmon drawnumin joten kukaan ei piirry :P
Toimiva koodi jos jotakuta mahtaa kiinnostaa/keksii parannettavaa:

Code: Select all

Function UpdateDrawNums()
        Tiles = 5
        CurDrawNum = 1
        For pwn.PAWN = Each PAWN
                pwn\DrawNum = 0
                For i = -Tiles To Tiles
                        If pwn\PosY = PlayerPosY+(TileSize*i) Then
                                pwn\DrawNum = CurDrawNum
                        EndIf
                        
                        If i = Tiles Then
                                CurDrawNum = 1
                        Else
                                CurDrawNum+1
                        EndIf
                Next i
        Next pwn
EndFunction
On hiukan tehokkaamman olonen näin ensialkuun kuin tuo elseif sotku (plus luonnollisesti paljon helpommin muokattavissa).[/edit]

Re: Tyhmät kysymykset (I/2012)

Posted: Tue May 28, 2013 1:38 pm
by _GRAAFIKKO_
minulla on sellainen ongelma, että kun avaan coolbasicin tietokoneen yhteydessä, coolbasic aukeaa, mutta kun yritän suorittaa jonkun tekemäni pelin niin kone väittää että ohjelma on jo käynnissä.
täten, joudun aina lataamaan coolbasicin uudestaan, jotta voin "koeajaa" pelini ??? missä piilee vika? :o

Re: Tyhmät kysymykset (I/2012)

Posted: Tue May 28, 2013 1:44 pm
by naputtelija
_GRAAFIKKO_ wrote:minulla on sellainen ongelma, että kun avaan coolbasicin tietokoneen yhteydessä, coolbasic aukeaa, mutta kun yritän suorittaa jonkun tekemäni pelin niin kone väittää että ohjelma on jo käynnissä.
täten, joudun aina lataamaan coolbasicin uudestaan, jotta voin "koeajaa" pelini ??? missä piilee vika? :o
Joka kerta ennen pelin ajamista painat Ctrl+Alt+Del, ja sammutat cbRun.exe prosesseista jos se on käynnissä.

Jos tämä ei toimi, niin
Coolbasic editorin pikakuvake>Right click>Ominaisuudet>Yhteensopivuus>Käynnistä ohjelma järjestelmänvalvojana
Sitten käynnistä. Pitäisi toimia.

Re: Tyhmät kysymykset (I/2012)

Posted: Tue May 28, 2013 2:30 pm
by Awaclus
Ja copypastaa tuosta toisesta stickystä:

Voi myös olla, että virustorjuntaohjelmasi jollain tavalla estää CoolBasicia toimimasta - lisää cbRun.exe ja cbEditor.exe luotettavien ohjelmien listaan niin pitäisi sitten viimeistään toimia. Jos huolimatta tästä ei toimi, yksi mahdollinen ratkaisuvaihtoehto voi olla myös CoolBasicin tallentaminen jonnekin muualle kuin C-aseman Program Files-kansioon.

Re: Tyhmät kysymykset (I/2012)

Posted: Tue May 28, 2013 4:06 pm
by Herra Siili
Tai sitten antaa itselleen kirjoitusoikeudet cb:n asennuskansioon. Mene kansioon, oletuksena C:\Program Files (x86)\CoolBasic, kakkosnappi -> ominaisuudet -> suojaus -> muokkaa -> lisää -> kirjoita käyttäjänimesi -> ok -> valitse täppä "kaikki oikeudet". Valinnat ei ehkä mene ihan sanatarkasti noin kun itsellä on vain englanninkielinen Windows käytössä.

Re: Tyhmät kysymykset (I/2012)

Posted: Sun Jun 02, 2013 9:57 am
by temetin123
Hei!

Kysyisin että miten saa tekstin tulemaan silloin kun koskee jotain toista objektia?

Esim. Jos on ukko ja talo ja kun ukko koskee taloa pitäisi saada näkyviiin teksti "talo on lukossa".

Re: Tyhmät kysymykset (I/2012)

Posted: Sun Jun 02, 2013 2:31 pm
by MrMonday
temetin123 wrote:Hei!

Kysyisin että miten saa tekstin tulemaan silloin kun koskee jotain toista objektia?

Esim. Jos on ukko ja talo ja kun ukko koskee taloa pitäisi saada näkyviiin teksti "talo on lukossa".
Mikäli talo on myös objekti (ei osa tilekarttaa), niin silloin homma hoituu helposti ObjectsOverlap-funktiolla.

Esimerkki:

Code: Select all

If ObjectsOverlap(ukko, talo, [tapa]) // Jos objekti 'ukko' on objektin 'talo' päällä, niin...
    Text 0,0,"talo on lukossa" //...tulostetaan vasempaan ylänurkkaan (0,0) teksti "talo on lukossa"
Endif
Mikäli taas talo on osa tilekarttaa (mikäli niitä käytät), niin silloin asetat kartan datakerrokseen talon tai oven kohdalle haluamasi arvon, aivan kuten piirrät näkyviä palikoita kartalle, ja koodissasi sitten tarkistat, että onko ukon alla olevassa tilessä haluttu arvo.

Esimerkki:

Code: Select all

// Oletuksena talon/oven kohdalle on asetettu arvoksi 1

If Getmap(3,ObjectX(ukko), ObjectY(ukko)) = 1 // Jos kartan 3. kerroksessa (datakerros) on ukon sijainnin kohdalla tilellä arvo 1, niin...
    Text 0,0,"talo on lukossa"  //...tulostetaan vasempaan ylänurkkaan (0,0) teksti "talo on lukossa"
Endif

Toivottavasti ei ollut liian sekavaa :)

Re: Tyhmät kysymykset (I/2012)

Posted: Sun Jun 02, 2013 8:17 pm
by temetin123
Muuten mahtava mutta mitä tarkoitat tuolla [tapa] kohdalla, tarkoitatko objektin törmäys tapaa???