Tyhmät kysymykset (I/2012)

Voit pyytää apua ohjelmointiongelmiin täältä.
User avatar
Paroni
Newcomer
Posts: 20
Joined: Sun Jan 16, 2011 2:39 am

Re: Tyhmät kysymykset (I/2012)

Post 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.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: Tyhmät kysymykset (I/2012)

Post 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
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
Paroni
Newcomer
Posts: 20
Joined: Sun Jan 16, 2011 2:39 am

Re: Tyhmät kysymykset (I/2012)

Post 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.
Locked