Tyhmät kysymykset (I/2011)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
User avatar
ItzRaines
Active Member
Posts: 211
Joined: Sat Feb 05, 2011 6:59 pm

Re: Tyhmät kysymykset (I/2011)

Post by ItzRaines »

Sly_Jack0 wrote:
ItzRaines wrote:Uskon, että tuon saa toimimaan, kunhan sinulla vain on kaikki tiedostot nimeltään välillä 0 ja 999. Kauhee homma luoda tuhat tiedostoa(?)
CB manual @ OpenToWrite wrote:Avaa tiedoston kirjoittamista varten. Jos tiedostoa ei ole olemassa, se luodaan. OpenToWrite palauttaa nollan, jos tiedostoa ei voitu kirjoittaa. Mahdollisia syitä ovat levytilan loppuminen, kirjoitussuojaus tai että kyseessä on kansio.
Tuohan olikin kätsä homma. Sitten vaan tekemään viirusta, joka täyttää kiintolevyt random datalla... 8-)
Awaclus
Forum Veteran
Posts: 2939
Joined: Tue Aug 28, 2007 2:50 pm

Re: Tyhmät kysymykset (I/2011)

Post by Awaclus »

ItzRaines wrote:
Sly_Jack0 wrote:
ItzRaines wrote:Uskon, että tuon saa toimimaan, kunhan sinulla vain on kaikki tiedostot nimeltään välillä 0 ja 999. Kauhee homma luoda tuhat tiedostoa(?)
CB manual @ OpenToWrite wrote:Avaa tiedoston kirjoittamista varten. Jos tiedostoa ei ole olemassa, se luodaan. OpenToWrite palauttaa nollan, jos tiedostoa ei voitu kirjoittaa. Mahdollisia syitä ovat levytilan loppuminen, kirjoitussuojaus tai että kyseessä on kansio.
Tuohan olikin kätsä homma. Sitten vaan tekemään viirusta, joka täyttää kiintolevyt random datalla... 8-)
viewtopic.php?p=49483#p49483
temu92
Web Developer
Web Developer
Posts: 1226
Joined: Mon Aug 27, 2007 9:56 pm
Location: Gamindustri
Contact:

Re: Tyhmät kysymykset (I/2011)

Post by temu92 »

Luo tiedoston jonka nimi on 10 merkkiä pitkä (plus .txt pääte) ja siinä on merkkejä väliltä a-z. Lisätehtäväksi numeroiden ja ääkkösten lisäys?

Code: Select all

f	= OpenToWrite(RandomString(10)+".txt")
WriteString f, "LOL KEK"
CloseFile f

Function RandomString(length)
	s$	= ""
	
	For i=0 To length-1
		s$	= s$ + Chr(Rand(97, 122))
	Next i
	
	Return s$
EndFunction
User avatar
TukeKoodi
Active Member
Posts: 142
Joined: Thu Feb 03, 2011 7:40 pm
Location: C:\Työpöytä

Re: Tyhmät kysymykset (I/2011)

Post by TukeKoodi »

temu92 wrote:Luo tiedoston jonka nimi on 10 merkkiä pitkä (plus .txt pääte) ja siinä on merkkejä väliltä a-z. Lisätehtäväksi numeroiden ja ääkkösten lisäys?

Code: Select all

f	= OpenToWrite(RandomString(10)+".txt")
WriteString f, "LOL KEK"
CloseFile f

Function RandomString(length)
	s$	= ""
	
	For i=0 To length-1
		s$	= s$ + Chr(Rand(97, 122))
	Next i
	
	Return s$
EndFunction
No tiedostoon noi merkit a-z + å + ä + ö + 1-9 ja sen jälkeen randilla ja seekfilellä arvot sieltä random rivin, luet sen ja kirjoitat siihen tiedostonimeen. Kun nimi on valmis, poista filu.
EDIT:

Kai nämä muistipaloillakin saisi, vaan enpä osaa auttaa kun en ole asiaan perehtynyt.

Aloittelija, koodaaja, jotain...
CbFUN :D
Rogem
Newcomer
Posts: 7
Joined: Sat Dec 04, 2010 3:49 pm

Re: Tyhmät kysymykset (I/2011)

Post by Rogem »

Noniin, päätin kysäistä asiasta ensiksi täällä... Tahtoisin tehdä pelin, jossa on 8-bit tyyppinen liikkuminen, grafiikka, yms.

Ongelmana vain on, että projekti jumittaa kun alan tekemään edellämainittua liikkumista - en älyä, että miten sen hahmon saa liikkumaan 16 pikseliä nimettyyn suuntaan ja toistamaan kolme framea tässä samalla. Lisäksi hahmolla on paha tapa liukua yli "gridistä" niin, että kollidoi kartan kanssa kohdassa, jossa sen ei pitäisi.

Mitään vinkkejä/snipukoita?
Dimple
Active Member
Posts: 103
Joined: Wed Nov 17, 2010 5:43 pm

Re: Tyhmät kysymykset (I/2011)

Post by Dimple »

Tarkoitatko siis, että pelikenttä on jaettu 16x16 tileihin ja pelihahmo on aina tilen keskellä? Kun pelaaja sitten haluaa liikkua esim. vasemmalle, niin hahmo liikkuu automaattisesti 16 pikseliä vasemmalle ja näyttää samalla animaation.
Rogem
Newcomer
Posts: 7
Joined: Sat Dec 04, 2010 3:49 pm

Re: Tyhmät kysymykset (I/2011)

Post by Rogem »

jep, ja hahmon kuuluu "kävellä" kyseiseen tileen, shunpon sijasta :P
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: Tyhmät kysymykset (I/2011)

Post by JATothrim »

Rogem wrote:jep, ja hahmon kuuluu "kävellä" kyseiseen tileen, shunpon sijasta :P
Tarvitaan lisää koodia. Puran ajatuksesti nyt näin kokeneena koodarina osiin:
#1 Mitä meidän pitää tehdä, kun pelaaja sörkii liikkumis näpäinten kanssa? -Liikuttaa pelaajaa.
#2 Kuinka meidän pitää liikuttaa pelaajaa? -Pykälittäin, 16x16 ruudukossa. Pelaaja on aina keskellä tileä, kun emme liiku.
#3 Kuinka liikumme tilestä toiseen? -Kun pelaaja painaa näppäintä, aloitamme usean framen kestävän animaation, jonka aikana pelaaja siirretään toiseen tileen. Animaation aikana emme ota huomioon liikenäppäimiä, eli pelaaja ei voi vaikuttaa pelihahmon liikeeseen animaation aikana. Kun animaatio päättyy, pelaaja voi liikuttaa hahmoa jälleen.

Huomaa, miten paljon yksityiskohtia paljastuu näinkin "simppelistä" pelimekaniikasta. :)
Paljastan muutaman muuttujan joita ainakin tarvitaan:
-animaatio_kaynnissa (liikuuko pelihahmo???)
-valittu_suunta (esim. 1-4. arvo määräytyy sen perusteella, mihin suuntaan olemme liikkumassa animaation aikana.)
-On selkeästi impulsiivinen koodaaja joka...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.
Dimple
Active Member
Posts: 103
Joined: Wed Nov 17, 2010 5:43 pm

Re: Tyhmät kysymykset (I/2011)

Post by Dimple »

Väsäsinpäs tässä jonkinlaisen esimerkin. En ikävä kyllä keksinyt, millä kaavalla animaatio-nopeuden pystyisi laskemaan joka kerta oikein riippumatta FPS:stä ja liikkumisnopeudesta eli joudut ns. kovakoodaamaan animaation nopeuden jos jollain muulla ei ole ratkaisua siihen (ongelma liittyy siis PlayObjectiin, ilman objekteja se olisi paljon helpompaa). Idea tässä on aika samanlainen, mitä JATothrim jo sanoikin. Tilen koko on oletuksen 64x64 (koska Zero on aika iso), mutta sitä voi pienentää muuttamalla vakioita TileWidth ja TileHeight. Kaiken pitäisi pyöriä oikein ainakin 16x16 tilekokoon asti (ainakin tasakokoisilla tileillä).

Code: Select all

FrameLimit 30           // Rajoitetaan pelin nopeutta. Tämä lähinnä siksi
                        // että animaatio pyörii oikeaa nopeutta
                        
Const TileWidth = 64    // Vakioita, jotka määrittävät tilen leveyden ja korkeuden.
Const TileHeight = 64   // Näitä muuttamalla saa ruudukon pienemmäksi. Kaikki laskut
                        // on siis sidottu näihin vakioihin eikä esim. lukuun 64. Siis
                        // näitä muuttamalla kaiken pitäisi toimia oikein pienmilläkin tilekoilla
                        // (olen testannut vain tasakokoisilla tileillä 16x16 asti).
                        
Const IDLE = 0          // Vakioita, jotka helpottavat muistamista. Eli siis, kun haluaa asettaa esim. suunnan oikeaksi voi kirjoittaa
Const VASEN = 1         // "suunta = OIKEA" sen sijaan, että täytyisi muistella, oliko oikea nyt numero 1 vai 2 ("suunta = 1"). Toinen
Const OIKEA = 2         // vaihtoehto olisi käyttää merkkijonomuuttujaa, mutta se menee mielestäni vain sotkuiseksi.

Const LiikkumisNopeus = 2       // Vakio, joka määrää ukon liikkumisnopeuden (animaatio ei toimi oikein muuttamatta AnimaatioNopeutta, jos tätä muuttaa).
Const AnimaationNopeus = 0.4    // Vakio, joka määrää animaation pyörimisnopeuden, jotta animaatio pysähtyy oikeassa kohdassa

zero_oikea = LoadAnimObject("Media\zerorun1.bmp", 47, 51, 0, 13)  // Ladataan animoidut objektit ja asetetaan maskiväri
MaskObject zero_oikea, 255, 0, 255

zero_vasen = LoadAnimObject("Media\zerorun2.bmp", 47, 51, 0, 13)
MaskObject zero_vasen, 255, 0, 255

ShowObject zero_vasen,  OFF     // Piilotetaan vasemmalle juokseva zero

suunta = OIKEA  // Alustetaan suunta oikeaksi. Suunta siis muistaa, mihin suuntaan zero katsoo
liiku = IDLE    // Alustetaan liiku idleksi. liiku muistaa suunnan, mihin liikutaan (se on siis IDLE, kun ei liikuta).

waypoint_x = 0  // Alustetaan waypoint. Waypoint on siis se kohde, mitä kohti zero lähtee liikkumaan, kun nappia painetaan
waypoint_y = 0

ScreenPositionObject zero_oikea, 2.5*TileWidth, 2.5*TileHeight  // Asetetaan zerot keskelle ruudukkoa
ScreenPositionObject zero_vasen, 2.5*TileWidth, 2.5*TileHeight

Repeat

    If liiku = IDLE Then            // Liikutetaan vain, jos ei olla liikkumassa
        If KeyHit(cbkeyLeft) Then
        
            liiku = VASEN           
            
            If suunta = OIKEA Then  // Jos zero katsoo väärään suuntaan, vaihdetaan suunta
            
                PositionObject zero_vasen, ObjectX(zero_oikea), ObjectY(zero_oikea)     // Asetetaan objekti oikeaan kohtaan
                ShowObject zero_oikea, OFF     
                ShowObject zero_vasen, ON
                
                suunta = VASEN
                
            EndIf
            
            waypoint_x = ObjectX(zero_vasen) - TileWidth    // Asetetaan waypointin koordinaatit. Zeron pitää tässä tapauksessa liikkuta vasemmalle
            waypoint_y = ObjectY(zero_vasen)                // eli x-koordinaatin pitää muuttua tilen leveyden verran ja y-koordinaatin pitää pysyä samana
            
            PlayObject zero_vasen, 0, 13, AnimaationNopeus*(64/TileWidth)   // Pyöritetään animaatio
     
        ElseIf KeyHit(cbKeyRight) Then      // Tehdään kaikki sama toiseen suuntaan
        
            liiku = OIKEA
            
            If suunta = VASEN Then
            
                PositionObject zero_oikea, ObjectX(zero_vasen), ObjectY(zero_vasen)
                ShowObject zero_vasen, OFF
                ShowObject zero_oikea, ON
                
                suunta = OIKEA
                
            EndIf
            
            waypoint_x = ObjectX(zero_oikea) + TileWidth
            waypoint_y = ObjectY(zero_oikea)
            
            PlayObject zero_oikea, 0, 13, AnimaationNopeus*(64/TileWidth)
        EndIf
    EndIf
    
    If liiku <> IDLE Then       // Jos liikutaan johonkin suuntaan
        If liiku = VASEN Then
            If Distance(ObjectX(zero_vasen), ObjectY(zero_vasen), waypoint_x, waypoint_y) > 2 Then  // Jos ei olla tarpeeksi lähellä waypointia, liikuta zeroa
                TranslateObject zero_vasen , -LiikkumisNopeus, 0    // Tässä tapauksessa liikutaan vasemmalle eli siksi miinus LiikkumisNopeuden edessä.
                
            Else            // Jos ollaan tarpeeksi lähellä, asetetaan objektin koordinaateiksi waypointin koordinaatit            
                liiku = IDLE
                PositionObject zero_vasen, waypoint_x, waypoint_y
                
            EndIf
        Else        // Kaikki sama toiseen suuntaan oikealle liikkuessa
        
            If Distance(ObjectX(zero_oikea), ObjectY(zero_oikea), waypoint_x, waypoint_y) > 2 Then
                TranslateObject zero_oikea , LiikkumisNopeus, 0
            Else
                liiku = IDLE
                PositionObject zero_oikea, waypoint_x, waypoint_y
            EndIf
        EndIf
    EndIf
    
    // Piirretään ruudukko (kuvastaa karttaa)
    
    For i=1 To ScreenWidth()/TileWidth
        Line i*TileWidth, 0, i*TileWidth, ScreenHeight() 
   Next i
   
   For i=1 To ScreenWidth()/TileHeight
        Line 0, i*TileHeight, ScreenWidth(), i*TileHeight
   Next i
   
   // Tulostetaan koordinaatit
   If suunta = VASEN Then
        Text 0,0, "X: "+ObjectX(zero_vasen)
        Text 0,15, "Y: "+ObjectY(zero_vasen)
   Else
        Text 0,0, "X: "+ObjectX(zero_oikea)
        Text 0,15, "Y: "+ObjectY(zero_oikea)
   EndIf
   
    DrawScreen
Forever
User avatar
Kille
Active Member
Posts: 249
Joined: Wed Aug 26, 2009 3:50 pm
Location: Juankoski

Re: Tyhmät kysymykset (I/2011)

Post by Kille »

Miten tehdään sellainen systeemi, että kun luoti osuu karttaan, osumatile poistetaan? Tässä on mitä olen saanut tehtyä. Se toimii joskus, mutta on riippuvainen osumakohdasta ja -kulmasta. Lisäksi jotkut tilet eivät tunnu häviävän ollenkaan.

Code: Select all

luodit:
For a.AMMUS = Each AMMUS
MoveObject a\obj,10
TranslateObject a\obj,0,-a\wgt
If GetMap(2,ObjectX(a\obj),ObjectY(a\obj))>0
Select GetMap(0,ObjectX(a\obj),ObjectY(a\obj))
Case 95,96,105,106,107
MoveObject a\obj,7.5
EditMap kartta,0,w2tx(10*RoundUp(ObjectX(a\obj)/10)-5),w2ty(10*RoundUp(ObjectY(a\obj)/10)-5),0
EditMap kartta,2,w2tx(10*RoundUp(ObjectX(a\obj)/10)-5),w2ty(10*RoundUp(ObjectY(a\obj)/10)-5),0
DeleteObject a\obj
Delete a
Default
DeleteObject a\obj
Delete a


End Select 

EndIf
Next a
Return
ja tässä funktiot:

Code: Select all

Function w2tX(tx)
    Return (tx / 20 + MapWidth() / 2)
EndFunction

Function w2tY(ty)
    Return -(ty / 20 - MapHeight() / 2)
EndFunction
ZEPPELIN
Jatkoa tulossa... tällä kertaa lataus ei kestä viikkoa
Dimple
Active Member
Posts: 103
Joined: Wed Nov 17, 2010 5:43 pm

Re: Tyhmät kysymykset (I/2011)

Post by Dimple »

Miksi käytät Select Case -rakennetta, jos kuitenkin haluat poistaa tilen riippumatta siitä, mihin tileen törmätään? Olettaen, että olet laittanut törmäyksen vain sellaisiin tileihin, joihin piirretään jotain, voisit tehdä jopa näin:

Code: Select all

If GetMap(2,ObjectX(a\obj),ObjectY(a\obj))>0
        'MoveObject a\obj,7.5    (Miksi muuten liikutat ammusta vielä täälläkin? Sitähän on liikutettu jo aikaisemmin ja tämähän muuttaa niitä koordinaatteja, joita seuraavilla riveillä käytät.)
        EditMap kartta,0,w2tx(10*RoundUp(ObjectX(a\obj)/10)-5),w2ty(10*RoundUp(ObjectY(a\obj)/10)-5),0
        EditMap kartta,2,w2tx(10*RoundUp(ObjectX(a\obj)/10)-5),w2ty(10*RoundUp(ObjectY(a\obj)/10)-5),0
        DeleteObject a\obj
        Delete a
    EndIf
Tuossahan sinä myös nollaat törmäyskerroksen datan, joten koodin pitäisi toimia oikein. Tosin nuo muunnos kaavat kyllä hieman ihmetyttävät. Mikä on tilen korkeus ja mikä leveys? 20 ja 20? Käyttämällä vakioita koodista saisi helpommin luettavaa. Eli esim.

Code: Select all

Const TileWidth = 20
Const TileHeight = 20

Function w2tX(tx)
    Return (tx / TileWidth + MapWidth() / 2)
EndFunction

Function w2tY(ty)
    Return -(ty / TileHeight - MapHeight() / 2)
EndFunction
Mutta voisitko hieman avata näitä rivejä:

Code: Select all

EditMap kartta,0,w2tx(10*RoundUp(ObjectX(a\obj)/10)-5),w2ty(10*RoundUp(ObjectY(a\obj)/10)-5),0
EditMap kartta,2,w2tx(10*RoundUp(ObjectX(a\obj)/10)-5),w2ty(10*RoundUp(ObjectY(a\obj)/10)-5),0
Mikä on 10, mikä on 5?
User avatar
Kille
Active Member
Posts: 249
Joined: Wed Aug 26, 2009 3:50 pm
Location: Juankoski

Re: Tyhmät kysymykset (I/2011)

Post by Kille »

Joo, tuohon alimpaan kohtaan unohtui yksi testijuttu, näin toimii paremmin, muttei aina kuitenkaan.

Code: Select all

EditMap kartta,0,w2tx(ObjectX(a\obj)),w2ty(ObjectY(a\obj)),0
EditMap kartta,2,w2tx(ObjectX(a\obj)),w2ty(ObjectY(a\obj)),0
Tilen koko on 20*20 ja se tosiaan olisi parempi vakioilla. Ja case-rakenne siksi, että siihen tulee muitakin vaihtoehtoja, kunhan saan tämän jutun toimimaan. Vika tuntuisi olevan muunnoksessa, koska muuten koodi toimii.
ZEPPELIN
Jatkoa tulossa... tällä kertaa lataus ei kestä viikkoa
Dimple
Active Member
Posts: 103
Joined: Wed Nov 17, 2010 5:43 pm

Re: Tyhmät kysymykset (I/2011)

Post by Dimple »

Onko tilekarttasi korkeus ja leveys jaollisia kahdella? Esim. CB:n mukana tulevan cdm2 kartan leveys on 41 tileä, jolloin MapWidth()/2 antaa tulokseksi 20, mikä johtaa virheelliseen toimintaan. Tein pienen testiohjelman

Code: Select all

SCREEN 800,600

Const TileWidth = 32
Const TileHeight = 32

map= LoadMap("Media\cdm2.til","Media\tileset.bmp")
guy= LoadObject("Media\soldier.bmp",72)

Repeat

    If LeftKey() Then TurnObject guy, 4
    If RightKey() Then TurnObject guy, -4
    
    If UpKey() Then MoveObject guy, 2
    If DownKey() Then MoveObject guy, -2
    
    If GetMap(0, ObjectX(guy), ObjectY(guy)) > 0 Then
        // Kokeile kommentoida seuraava rivi ja poistaa kommentointi sitä seuraavalta riviltä niin huomaat eron
        EditMap map, 0, RoundUp(ObjectX(guy)/TileWidth+Float(MapWidth())/2), RoundUp(-ObjectY(guy)/TileHeight+Float(MapHeight())/2), 0
        'EditMap map, 0, RoundUp(ObjectX(guy)/TileWidth)+MapWidth()/2, RoundUp(-ObjectY(guy)/TileHeight)+MapHeight()/2, 0
    EndIf

    DrawGame
    
    Circle ObjectX(guy)+ScreenWidth()/2, -ObjectY(guy)+ScreenHeight()/2, 3
    Text 0,0, "GetMap(0, ObjectX(guy), ObjectY(guy)): "+GetMap(0, ObjectX(guy), ObjectY(guy))
    Text 0,15, "MapWidth(): "+MapWidth()
    Text 0,30, "MapWidth()/2: "+MapWidth()/2
    Text 0, 45, "MapHeight(): "+MapHeight()
    
    DrawScreen
Forever
Ratkaisu on siis pakottaa kyseisen jakolaskun tulos liukuluvuksi, laskea kaikki yhteen ja pyöristää vasta sen jälkeen.
User avatar
Kille
Active Member
Posts: 249
Joined: Wed Aug 26, 2009 3:50 pm
Location: Juankoski

Re: Tyhmät kysymykset (I/2011)

Post by Kille »

kartan koko on 200*40, joten siinä ongelma ei ole. Erään jännän jutun olen huomannut, ongelmaa ei ole maailman nollakoordinaatin ylävasemmalla.
ZEPPELIN
Jatkoa tulossa... tällä kertaa lataus ei kestä viikkoa
Dimple
Active Member
Posts: 103
Joined: Wed Nov 17, 2010 5:43 pm

Re: Tyhmät kysymykset (I/2011)

Post by Dimple »

Tämä toimii ainakin itselläni:

Code: Select all

SCREEN 800,600

Type Bullets
    Field object
EndType

Const TileWidth = 32
Const TileHeight = 32

map= LoadMap("Media\cdm2.til","Media\tileset.bmp")
guy= LoadObject("Media\soldier.bmp",72)

bullet = LoadObject("Media\bullet.bmp")
ShowObject bullet, OFF

Repeat

    If LeftKey() Then TurnObject guy, 4
    If RightKey() Then TurnObject guy, -4
    
    If UpKey() Then MoveObject guy, 2
    If DownKey() Then MoveObject guy, -2
    
    If KeyHit(cbKeySpace) Then
        
        newBullet.Bullets = New(Bullets)
        newBullet\object = CloneObject(bullet)
        CloneObjectPosition newBullet\object, guy
        CloneObjectOrientation newBullet\object, guy 
        MoveObject newBullet\object, 24
    EndIf
    
    For iBullet.bullets = Each Bullets
    
        MoveObject iBullet\object, 5
        
        If GetMap(0, ObjectX(iBullet\object), ObjectY(iBullet\object)) > 0 Then
            EditMap map, 0, w2tx(ObjectX(iBullet\object)), w2tY(ObjectY(iBullet\object)), 0
            DeleteObject iBullet\object
            Delete iBullet
        EndIf
    Next iBullet
    
    DrawScreen
Forever

Function w2tX(tx#)
    Return RoundUp((tx# / TileWidth + Float(MapWidth()) / 2))
EndFunction

Function w2tY(ty#)
    Return RoundUp(-(ty# / TileHeight - Float(MapHeight()) / 2))
EndFunction

User avatar
Kille
Active Member
Posts: 249
Joined: Wed Aug 26, 2009 3:50 pm
Location: Juankoski

Re: Tyhmät kysymykset (I/2011)

Post by Kille »

Dimple wrote:Tämä toimii ainakin itselläni:

Code: Select all

SCREEN 800,600

Type Bullets
    Field object
EndType

Const TileWidth = 32
Const TileHeight = 32

map= LoadMap("Media\cdm2.til","Media\tileset.bmp")
guy= LoadObject("Media\soldier.bmp",72)

bullet = LoadObject("Media\bullet.bmp")
ShowObject bullet, OFF

Repeat

    If LeftKey() Then TurnObject guy, 4
    If RightKey() Then TurnObject guy, -4
    
    If UpKey() Then MoveObject guy, 2
    If DownKey() Then MoveObject guy, -2
    
    If KeyHit(cbKeySpace) Then
        
        newBullet.Bullets = New(Bullets)
        newBullet\object = CloneObject(bullet)
        CloneObjectPosition newBullet\object, guy
        CloneObjectOrientation newBullet\object, guy 
        MoveObject newBullet\object, 24
    EndIf
    
    For iBullet.bullets = Each Bullets
    
        MoveObject iBullet\object, 5
        
        If GetMap(0, ObjectX(iBullet\object), ObjectY(iBullet\object)) > 0 Then
            EditMap map, 0, w2tx(ObjectX(iBullet\object)), w2tY(ObjectY(iBullet\object)), 0
            DeleteObject iBullet\object
            Delete iBullet
        EndIf
    Next iBullet
    
    DrawScreen
Forever

Function w2tX(tx#)
    Return RoundUp((tx# / TileWidth + Float(MapWidth()) / 2))
EndFunction

Function w2tY(ty#)
    Return RoundUp(-(ty# / TileHeight - Float(MapHeight()) / 2))
EndFunction

Niin toimii minullakin. Kiitokset avusta!
ZEPPELIN
Jatkoa tulossa... tällä kertaa lataus ei kestä viikkoa
User avatar
Kille
Active Member
Posts: 249
Joined: Wed Aug 26, 2009 3:50 pm
Location: Juankoski

Re: Tyhmät kysymykset (I/2011)

Post by Kille »

Anteeksi tuplat, mutta oliko joku tehnyt timer-pohjaisen framelimitin? Muistan nähneeni sellaisen jossain, mutta pikaisella haeskelulla ei löytynyt. Cb:n framelimitti tuppaa laskemaan fps:ää, esim. fps ~50 > framelimit 40 > fps ~35.
ZEPPELIN
Jatkoa tulossa... tällä kertaa lataus ei kestä viikkoa
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 »

Kille wrote:Anteeksi tuplat, mutta oliko joku tehnyt timer-pohjaisen framelimitin? Muistan nähneeni sellaisen jossain, mutta pikaisella haeskelulla ei löytynyt. Cb:n framelimitti tuppaa laskemaan fps:ää, esim. fps ~50 > framelimit 40 > fps ~35.
CBSDK:ssa ainakin on yksi tapa, jolla liikkumisen voi tehdä FPS-riippumattomasti. Tällöin ei tarvita mitään framelimittejä.

Myös NetMatchissa on käytössä FPS-riippumaton liike:
Liikkumisen koodi ja siinä käytettävä funktio.
Tätä funktiota täytyy kutsua aina kerran pääsilmukan alussa. Tämä yhdistelmä vaatii kaksi globaalia, g_frameTime# ja g_tmpTime.
Huomaa myös kääntymiseen tarkoitettu DgrPerSec-funktio.
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
Rogem
Newcomer
Posts: 7
Joined: Sat Dec 04, 2010 3:49 pm

Re: Tyhmät kysymykset (I/2011)

Post by Rogem »

JATothrim wrote: Tarvitaan lisää koodia. Puran ajatuksesti nyt näin kokeneena koodarina osiin:
#1 Mitä meidän pitää tehdä, kun pelaaja sörkii liikkumis näpäinten kanssa? -Liikuttaa pelaajaa.
#2 Kuinka meidän pitää liikuttaa pelaajaa? -Pykälittäin, 16x16 ruudukossa. Pelaaja on aina keskellä tileä, kun emme liiku.
#3 Kuinka liikumme tilestä toiseen? -Kun pelaaja painaa näppäintä, aloitamme usean framen kestävän animaation, jonka aikana pelaaja siirretään toiseen tileen. Animaation aikana emme ota huomioon liikenäppäimiä, eli pelaaja ei voi vaikuttaa pelihahmon liikeeseen animaation aikana. Kun animaatio päättyy, pelaaja voi liikuttaa hahmoa jälleen.

Huomaa, miten paljon yksityiskohtia paljastuu näinkin "simppelistä" pelimekaniikasta.
Paljastan muutaman muuttujan joita ainakin tarvitaan:
-animaatio_kaynnissa (liikuuko pelihahmo???)
-valittu_suunta (esim. 1-4. arvo määräytyy sen perusteella, mihin suuntaan olemme liikkumassa animaation aikana.)
Idea yksinkertainen, käytännössä hankala. En vain keksi miten estää koodia kuuntelemasta pelaajan komentoja. Pitää varmaan katsoa joku arki-ilta, kun ei todellakaan pitäisi :D
Dimple wrote:Väsäsinpäs tässä jonkinlaisen esimerkin. En ikävä kyllä keksinyt, millä kaavalla animaatio-nopeuden pystyisi laskemaan joka kerta oikein riippumatta FPS:stä ja liikkumisnopeudesta eli joudut ns. kovakoodaamaan animaation nopeuden jos jollain muulla ei ole ratkaisua siihen (ongelma liittyy siis PlayObjectiin, ilman objekteja se olisi paljon helpompaa). Idea tässä on aika samanlainen, mitä JATothrim jo sanoikin. Tilen koko on oletuksen 64x64 (koska Zero on aika iso), mutta sitä voi pienentää muuttamalla vakioita TileWidth ja TileHeight. Kaiken pitäisi pyöriä oikein ainakin 16x16 tilekokoon asti (ainakin tasakokoisilla tileillä).

Code: Select all

*SNIP*
kiitos tästä, leikin tuon kanssa ja katson, josko pystyisi lyhentämään hiukan... lisäksi kannattaa huomata, etteivät 8bit hahmot ole 16x16 kokoisia, vaan 16x24. tämä aiheuttaa hieman ongelmia, mutta täytyy tosissaan leikkiä kun ei pitäisi.
Dimple
Active Member
Posts: 103
Joined: Wed Nov 17, 2010 5:43 pm

Re: Tyhmät kysymykset (I/2011)

Post by Dimple »

Jos meinaat tehdä tileistä suorakulmaisia neliöiden sijasta, niin sen ei käsittääkseni pitäisi vaikuttaa muuhun kuin siihen, että tarvitset vaaka- ja pystysuunnille omat animaationNopeus-vakiot. Kaiken muu (ainakin pitäisi) skaalautua automaattisesti.
Locked