ObjDataBank!

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
Post Reply
User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

ObjDataBank!

Post by MaGetzUb » Mon Jun 13, 2011 10:10 pm

Eilis yönä kun ukkosti ja kuuntelin musaa (en saanut siis nukuttua btw) niin tuli tämmöinen idea mieleen. :) Eli siis objekteillehan voi asettaa minkä vain arvon Object Integerillä, niin tälle arvollehan voitaisiin tallentaa Muistipalan kahva.(Muistipala siis luodaan funktiossa.) Objektin kahvalla voitaisiin hakea siis hakea sen "nimikko" muistipalasta enemmän arvoja ja sille voitaisiin kirjoittaa myös enemmän arvoja pelkän ObjectInteger/Floatin sijasta. :)
Tällähetkellä pystyy tallentamaan vain desimaali arvoja, mutta nehän ovat käytännössä parempia kuin pelkät kokonaisluvut. (koska tarkemmat arvot ja ne ovat helppoja muuttaa kokonaisluvuiksi ;)) Tulen kyllä lisäämään vielä tekstin tallennuksen tuonne muistipalaan. :)
Esimerkki + Funktiot:

Code: Select all


//Luodaan liput joilla ohjataan data oikeisiin soluihin
Const Flag_ID = 0
Const Flag_Energy = 1
Const Flag_Stealth = 2
Const Flag_Kills = 3
Const Flag_Cells = 3

ukko = LoadObject("Media\Guy.BMP") //Ladataan objekti

//Asetetaan objekteille dataa :)
ObjDataBank(ukko, Flag_Cells)
SetObjData(ukko, Flag_ID, 1)
SetObjData(ukko, Flag_Energy, 100.0)
SetObjData(ukko, Flag_Stealth, 75.0)
SetObjData(ukko, Flag_Kills, 0)


Repeat
    SetWindow ""+FPS()
    ClearText 
    
    //Nyt luetaan dataa objektin pankista..
    AddText "Obj ID:"+GetObjData(ukko, Flag_ID)
    AddText "Obj Energy: "+GetObjData(ukko, Flag_Energy)
    AddText "Obj Stealth: "+GetObjData(ukko, Flag_Stealth)
    AddText "Obj Kills: "+GetObjData(ukko, Flag_Kills)
    
    //Tällä koodinpätkällä muokataan dataa lennosta. 
    If UpKey() Then IncrObjData(ukko, Flag_Energy, 0.5)
    If DownKey() Then IncrObjData(ukko, Flag_Energy, -0.5)
    
    
    DrawScreen
Forever

//Funktiot
//Parametrien selitykset:
'obj <- objekti jolle halutaan asettaa datapankki, tai objekti jolla on jo datapankki
'cell <- solu, josta luetaan tai jonne kirjoitetaan dataa
'var# <- arvon määrä
'amount <- määrä paljonko arvoa lisätään tai vähennetään 

//Tällä funktiolla luot data pankin, arvo vaatii objektimuuttujaa ja solujen määrää, joka on valmiina asetettu kolmeen.
//Muttakun nolla arvokin lasketaan soluksi oikeasti soluja on siis 4 :)
Function ObjDataBank(obj, cells = 3) 
    cells = Int(cells)
    memblock = MakeMEMBlock((cells+1)*4)
    If ObjectInteger(obj) Then MakeError "Object already has data!"
    ObjectInteger obj, memblock
    Return False
End Function 

//Tällä funktiolla voit asettaa tietttyyn soluun arvon
Function SetObjData(obj, cell, var#)
    cell = Int(cell*4)
    block = ObjectInteger(obj)

    If Not block Then MakeError "Object doesn't has a databank!"
    PokeFloat block, cell, var#

    Return False 
End Function 

//Tällä funktiolla voit hakea tietystä solusta arvon
Function GetObjData(obj, cell)
    cell = Int(cell*4)
    block = ObjectInteger(obj)
    If Not block Then MakeError "Object doesn't has a databank!"
    Return PeekFloat(block, cell)
End Function 

//Tällä funktiolla voit lisätä ja vähentää olemassa olevaa arvoa
Function IncrObjData(obj, cell, amount#)
    cell = Int(cell*4)
    block = ObjectInteger(obj)
    If Not block Then MakeError "Object doesn't has a databank!"
    newdata# = PeekFloat(block, cell) + amount
    PokeFloat block, cell, newdata
End Function 


//Tällä funktiolla tuhoat objektilla olevan datapankin. 
//MUISTA KUTSUA TÄMÄ ENNENKUIN TUHOAT OBJEKTIN! 
Function DeleteDatabank(obj)
    block = ObjectInteger(obj)
    If block Then 
        DeleteMEMBlock block
    EndIf 
End Function 
Pelkät funktiot:

Code: Select all

//Parametrien selitykset:
'obj <- objekti jolle halutaan asettaa datapankki, tai objekti jolla on jo datapankki
'cell <- solu, josta luetaan tai jonne kirjoitetaan dataa
'var# <- arvon määrä
'amount <- määrä paljonko arvoa lisätään tai vähennetään 

//Tällä funktiolla luot data pankin, arvo vaatii objektimuuttujaa ja solujen määrää, joka on valmiina asetettu kolmeen.
//Muttakun nolla arvokin lasketaan soluksi oikeasti soluja on siis 4 :)
Function ObjDataBank(obj, cells = 3) 
    cells = Int(cells)
    memblock = MakeMEMBlock((cells+1)*4)
    If ObjectInteger(obj) Then MakeError "Object already has data!"
    ObjectInteger obj, memblock
    Return False
End Function 

//Tällä funktiolla voit asettaa tietttyyn soluun arvon
Function SetObjData(obj, cell, var#)
    cell = Int(cell*4)
    block = ObjectInteger(obj)

    If Not block Then MakeError "Object doesn't has a databank!"
    PokeFloat block, cell, var#

    Return False 
End Function 

//Tällä funktiolla voit hakea tietystä solusta arvon
Function GetObjData(obj, cell)
    cell = Int(cell*4)
    block = ObjectInteger(obj)
    If Not block Then MakeError "Object doesn't has a databank!"
    Return PeekFloat(block, cell)
End Function 

//Tällä funktiolla voit lisätä ja vähentää olemassa olevaa arvoa
Function IncrObjData(obj, cell, amount#)
    cell = Int(cell*4)
    block = ObjectInteger(obj)
    If Not block Then MakeError "Object doesn't has a databank!"
    newdata# = PeekFloat(block, cell) + amount
    PokeFloat block, cell, newdata
End Function 


//Tällä funktiolla tuhoat objektilla olevan datapankin. 
//MUISTA KUTSUA TÄMÄ ENNENKUIN TUHOAT OBJEKTIN! 
Function DeleteDataBank(obj)
    block = ObjectInteger(obj)
    If block Then 
        DeleteMEMBlock block
    EndIf 
End Function 
Last edited by MaGetzUb on Tue Jun 14, 2011 12:06 am, edited 1 time in total.
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

User avatar
MetalRain
Active Member
Posts: 188
Joined: Sun Mar 21, 2010 12:17 pm
Location: Espoo

Re: ObjDataBank!

Post by MetalRain » Mon Jun 13, 2011 10:54 pm

Joo kokonaislukuun saa kivasti muistipalan (jossa toisia muistipaloja). Näin saadaan vaikka mitä ominaisuuksia objekteille, vaikkapa kuljettavista reiteistä ja tavarataulukoista tarpeellisiin huudahduksiin.

Kuinka paljon näitä sitten jaksaa tehdä riippuu pelin tekijästä.

User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: ObjDataBank!

Post by MaGetzUb » Tue Jun 14, 2011 12:08 am

Ja esimerkiksi kun panos törmää objektiin, voidaan GetCollissionilla tarkistaa suoraan mihin objektiin törmättiin ja sitten sen objektin datapankista voidaan muokata solua joka sisältää energian sen verran mitä tuli vahinkoa. Näin taas säästytään turhalta läpikäymiseltä. :)
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

User avatar
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: ObjDataBank!

Post by JATothrim » Tue Jun 14, 2011 10:50 am

MaGetzUb wrote:Ja esimerkiksi kun panos törmää objektiin, voidaan GetCollissionilla tarkistaa suoraan mihin objektiin törmättiin ja sitten sen objektin datapankista voidaan muokata solua joka sisältää energian sen verran mitä tuli vahinkoa. Näin taas säästytään turhalta läpikäymiseltä. :)
Tuli mieleen, että eräs aniharvoin häytetty tekniikka on tallentaa ConvertToInteger(typpimuuttuja):n tulos ObjectIntegerillä objektiin. Helpottaa jännästi törmäysten käsittelyä, kun systeemistä tipahtaa kokonaan yksi ForEach looppi pois/kokoelma.
Esim. Chipmunk ja Box2D eivät toimi niin kuin OldCB:n törmäystarkistus, vaan näissä kirjastoissa selataan vain Objekti <---> Objekti törmäyspareja, mikä tarkoittaa, että tarvitaan vain YHTÄ looppia tarvitaan koko systeemin törmäysten tarkistamiseen. Ja jos ei ole törmäyksiä, mitään ei tarvitse loopata. :)
-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'.

User avatar
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

Re: ObjDataBank!

Post by MaGetzUb » Tue Jun 14, 2011 10:37 pm

JATothrim wrote: Tuli mieleen, että eräs aniharvoin häytetty tekniikka on tallentaa ConvertToInteger(typpimuuttuja):n tulos ObjectIntegerillä objektiin. Helpottaa jännästi törmäysten käsittelyä, kun systeemistä tipahtaa kokonaan yksi ForEach looppi pois/kokoelma.
Kuinka niin? Missä yhteydessä? o_o
Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.

Post Reply