Page 23 of 23

Re: Tyhmät kysymykset (I/2012)

Posted: Wed Sep 10, 2014 10:09 pm
by Paroni
MaGetzUb wrote:Koodi näyttää siistiltä eikä pitäisi virheille jäädä paljoakaan varaa. Mutta kuitenkin spottasin tällaisen pätkän piirtokoodista:

Code: Select all

..
Text _x, _y, _val
If _val = 0 Then Goto UPDATE
UPDATE:
..
Pitäisikö "if _ val = 0 Then Goto UPDATE" olla "Goto DRAW" koska nythän if _val =0 -ehdon täyttyessä, tämän alapuolella oleva koodi suoritetaan jokatapauksessa, täyttyykö ehto vai ei.
Oikeassa koodissa se on itseasiassa näin:

Code: Select all

DRAW:
		_val% = PeekInt(Handle, _i)
		If _val = 0 Then Goto UPDATE
		' Calculate position
		_pos% = (_i Shr 2) - 1
		// Shl 3 = 8x8 tiles, Shl 4 = 16x16 tiles
		// Shl 5 = 32x32 tiles, Shl 6 = 64x64 tiles
		_x% = (_pos Mod _width) Shl 4
		_y% = (_pos / _width) Shl 4
		' Draw at position
		af_DrawSprite(_val, _x, _y)
		UPDATE:
		_i = (_i + 4)
		If _i = _memSize Then Return True
	Goto DRAW
Tuo minkä pastesin oli vain tekstiversiota varten. UPDATE:en mennään koska ei haluta piirtää samaa tileä jatkuvasti.

Re: Tyhmät kysymykset (I/2012)

Posted: Thu Sep 11, 2014 4:56 am
by MaGetzUb
Paroni wrote:
MaGetzUb wrote:...
Oikeassa koodissa se on itseasiassa näin:

Code: Select all

DRAW:
		_val% = PeekInt(Handle, _i)
		If _val = 0 Then Goto UPDATE
		' Calculate position
		_pos% = (_i Shr 2) - 1
		// Shl 3 = 8x8 tiles, Shl 4 = 16x16 tiles
		// Shl 5 = 32x32 tiles, Shl 6 = 64x64 tiles
		_x% = (_pos Mod _width) Shl 4
		_y% = (_pos / _width) Shl 4
		' Draw at position
		af_DrawSprite(_val, _x, _y)
		UPDATE:
		_i = (_i + 4)
		If _i = _memSize Then Return True
	Goto DRAW
Tuo minkä pastesin oli vain tekstiversiota varten. UPDATE:en mennään koska ei haluta piirtää samaa tileä jatkuvasti.
En tiedä kyllä mistä mahdollinen ongelmasi johtuu, pitäisi melkein saada testiajettua koko koodi, myös karttoinesi päivineen. Mutta tosiaan kannattaa jättää Goto kikkailut sikseen, ja yrittää selvitä noista ihan ehdoilla ja loopeilla. Esimerkiksi tässä "oikeassa koodissa", voisit tehdä näin:

Code: Select all

//Repeat loopilla saat suoritettua ainakin kerran alla olevan koodin, ennen Until:iä.
Repeat
    _val% = PeekInt(Handle, _i)
    If _val <> 0 Then 
        ' Calculate position
        _pos% = (_i Shr 2) - 1
        // Shl 3 = 8x8 tiles, Shl 4 = 16x16 tiles
        // Shl 5 = 32x32 tiles, Shl 6 = 64x64 tiles
        _x% = (_pos Mod _width) Shl 4
        _y% = (_pos / _width) Shl 4
        ' Draw at position
        af_DrawSprite(_val, _x, _y) //Kannattaa kokeilla myös tätä riviä näin: af_DrawSprite(_val - 1, _x, _y)
    EndIf 
    _i = _i + 4
Until _i = _memSize
Return True

Re: Tyhmät kysymykset (I/2012)

Posted: Thu Sep 11, 2014 10:28 am
by Paroni
Ongelmakoodi teillä itseasiassa onkin jo. MAVi tulee vain ja ainoastaan kun luodaan layeri johon pusketaan arvo ja sen jälkeen luodaan tyhjä kartta. Jos karttaa ei luoda, MAVia ei tule. Jos myös layer on tyhjä, MAVia ei tule. Tämä ei myöskään tapahdu kuin vain ja ainoastaan jos kirjoitetaan mitä _val sisältää. Jos _val piirretään, kaikki toimii normaalisti.

Päädyin Goto kikkailuun koska funktio itsessään on hyvin lyhyt ja oman testailun perusteella Goto vaikuttaisi pysyvän "vakionopeudessa", kun taas Repeat heittelee jonkin verran. Oma järjenjuoksu sanoo, että isommissa layereissa (ja varsinkin kartoissa) tällä on pieni merkitys. Muuten käytän ihan normi looppeja. Useampi for looppi gotoina voisi olla mukavaa luettavaa.

Sinänsä tosin merkityksetön boosti nyt kun kartta itsessään piirretään kahteen suurempaan kuvaan (background ja foreground) ohjelman alussa, ja näitä suurempia kuvia piirretään karttana :) Mutta näillä mennään.