Game Making Should Be Easy...
https://www.coolbasic.com/phpBB3/
Exenpurkamis... UPX pakattu -> UPX -d filu.exe. Tässä vähän varmaa kysymykseesi liittyen asiaa viewtopic.php?p=38114#p38114naputtelija wrote:Hmm... Jossain täälläpäin oli joku exenpurkamistuto. Voisitteko vähän täsmentää, kuka sen kirjoitti ja mistä se löytyy?
Kiitos. Minulla olisi matematiikassa sellainen yhtälö, jota en ymmärrä:Viltzu wrote:Exenpurkamis... UPX pakattu -> UPX -d filu.exe. Tässä vähän varmaa kysymykseesi liittyen asiaa viewtopic.php?p=38114#p38114naputtelija wrote:Hmm... Jossain täälläpäin oli joku exenpurkamistuto. Voisitteko vähän täsmentää, kuka sen kirjoitti ja mistä se löytyy?
Code: Select all
Type Block
Field Z#
End Type
For i = 1 To 10
nB.Block = New(Block)
nB\Z = Rnd(50)
Next i
Repeat
Swap = False
iB.Block = After(First(Block))
While iB <> NULL
jB.Block = Before(iB)
If iB\Z > jB\Z Then Insert iB, Before(jB) : Swap = True
iB = After(iB)
Wend
Until Swap = False
Tuohan tietenkin kaatuu heti ensimmäisellä kerralla, koska Before(jB) = Before(Before(iB)) = Before(Before(After(First(Block))) = Before(First(Block)). Mutta kaatuu se silti vaikka menisi muuttamaan tuon rivin 12 iB.Block = After(After(First(Block))), en keksi järkevää syytä.
Voisin kuvitella, että tämä on helpointa toteuttaa käyttämällä kahta tyyppikokoelmaa, joista ensimmäistä oikeasti käytetään ja toinen on melkein koko ajan jäsenetön, mutta pitää sisällään samat fieldit kuin ensimmäinenkin. Sitten tarkistaa, mikä tyyppikokoelman 1 jäsenistä on tietyltä numeroarvoltaan suurin tai pienin ja tekee identtisen uuden jäsenen tyyppikokoelmaan 2 ja poistaa sen jäsenen tyyppikokoelmasta 1. Sitten toistaa tätä kunnes tyyppikokoelma 1 on tyhjä, ja sitten samaan tapaan "kopioi" jäsenet tyyppikokoelmasta 2 kokoelmaan 1, mutta tällä kertaa sen voi tehdä suoraan järjestyksessä ja sitten poistaa ne kokoelmasta 2.axu wrote:Olen yrittänyt tässä kirjoittaa koodia, joka järjestäisi typekokoelman jäsenet tietyn numeerisen arvon mukaan, mutta jostakin syystä en nyt saa aikaiseksi edes hitaasti toimivaa järjestysfunktiota. Milloin ohjelma jää ikuiseen silmukkaan, milloin kaatuu Mitä Auttavimpiin Virheilmoituksiin ja sain aikaan jopa virheimoituksen, jota en ollut ennen nähnyt :O
Huomasin myös, että Insertissä on erikoinen bugi. Yritäpä saada joku kokoelman jäsen toiseksi jäseneksi. Insert t, After(First(mytype)) lisääkin t:n yllättävästi kolmanneksi jäseneksi :S
Tässäpä hyvin pelkistetty koodi, jonka tarkoituksena on vain saada jäsenet järjestykseen. Kaatuu Insertin kohdalla seuraavanlaiseen virheilmoitukseen: "ERROR: Memory leak due to invalid type access attempt." (eli älä aja jos tämä pelottaa).Code: Select all
Type Block Field Z# End Type For i = 1 To 10 nB.Block = New(Block) nB\Z = Rnd(50) Next i Repeat Swap = False iB.Block = After(First(Block)) While iB <> NULL jB.Block = Before(iB) If iB\Z > jB\Z Then Insert iB, Before(jB) : Swap = True iB = After(iB) Wend Until Swap = False
EDIT:Tuohan tietenkin kaatuu heti ensimmäisellä kerralla, koska Before(jB) = Before(Before(iB)) = Before(Before(After(First(Block))) = Before(First(Block)). Mutta kaatuu se silti vaikka menisi muuttamaan tuon rivin 12 iB.Block = After(After(First(Block))), en keksi järkevää syytä.
Kuulostaa kyllä aika työläältä ja hitaalta tavalta... Mietin, voisiko jotain tehdä tallentamalla muistipaloihin typeosoittimet (converttointeger), järjestämällä muistipalan sisällä osoittimet järjestykseen ja siitä jotenkin muutettua itse tyyppikokoelman jäsenet.Chaosworm wrote:Voisin kuvitella, että tämä on helpointa toteuttaa käyttämällä kahta tyyppikokoelmaa, joista ensimmäistä oikeasti käytetään ja toinen on melkein koko ajan jäsenetön, mutta pitää sisällään samat fieldit kuin ensimmäinenkin. Sitten tarkistaa, mikä tyyppikokoelman 1 jäsenistä on tietyltä numeroarvoltaan suurin tai pienin ja tekee identtisen uuden jäsenen tyyppikokoelmaan 2 ja poistaa sen jäsenen tyyppikokoelmasta 1. Sitten toistaa tätä kunnes tyyppikokoelma 1 on tyhjä, ja sitten samaan tapaan "kopioi" jäsenet tyyppikokoelmasta 2 kokoelmaan 1, mutta tällä kertaa sen voi tehdä suoraan järjestyksessä ja sitten poistaa ne kokoelmasta 2.
Ei varmasti ole optimaalisin tapa, ja voi olla vaikea hyödyntää jotain universaalisti toimivaa funktiota tehdessä, mutta tällä tavalla minä tämän ongelman ratkaisin joku aika takaperin kun tällaista systeemiä yhdessä projektissa tarvitsin.
Code: Select all
määrä=10
//luodaan lista alkioille
lista=MakeMEMBlock(4+määrä*4)
//ensimmäiset neljä tavua merkkaa alkioiden määrää
PokeInt lista,0,määrä
//näin voidaan varata listaan kokoa ennen sen käyttöä
//sillä listan koon muuttaminen jatkuvasti vie aikaa
For i=1 To määrä
//luodaan uusi alkio
alkio=MakeMEMBlock(8)
PokeFloat alkio,0,Rnd(-1.0,1.0)
PokeInt alkio,4,Rand(1,1000)
Print PeekInt(alkio,4)+" "+PeekFloat(alkio,0)
//kirjoitetaan alkio listaan
PokeInt lista,i*4,alkio
Next i
Print "---"
t=Timer()
//järjestetään lista 0 tavusta alkavan liukuluvun suhteen
lista=QuickSortByFloat(lista,0)
//tai kokonaisluvun mukaan
//lista=QuickSortByInt(lista,4)
t= Timer()-t
//haetaan niin monta alkiota kuin lista sisältää
For i=1 To määrä
alkio=PeekInt(lista,i*4)
//tulostetaan arvot
Print PeekInt(alkio,4)+" "+PeekFloat(alkio,0)
Next i
Print "Sorting took "+t+" ms!"
WaitKey
//List on muistipala jonka alussa on kokonaislukuna alkioiden lukumäärä
//Alkiot ovat omia muistipalojansa ja voivat sisältää mitä tahansa arvoja
//Funktio etsii järjestettävää desimaalilukua alkiosta floatposition arvon perusteella,
//oletuksena alkion alusta.
Function QuickSortByFloat(list,floatposition=0)
//http://en.wikipedia.org/wiki/Quicksort
listsize = PeekInt(list,0)
If listsize=1 Then Return list
pivot = Rand(1,listsize)
pivotitem = PeekInt(list,pivot*4)
pivotvalue# = PeekFloat(pivotitem,floatposition)
For i=1 To listsize
If i<>pivot Then
iteritem = PeekInt(list,i*4)
If iteritem Then
itervalue# = PeekFloat(iteritem,floatposition)
If itervalue# < pivotvalue# Then
If Not lesserlist Then lesserlist = MakeMEMBlock(listsize*4)
lesserlistitems = lesserlistitems + 1
PokeInt lesserlist,lesserlistitems*4,iteritem
ElseIf itervalue# > pivotvalue# Then
If Not greaterlist Then greaterlist = MakeMEMBlock(listsize*4)
greaterlistitems = greaterlistitems + 1
PokeInt greaterlist,greaterlistitems*4,iteritem
ElseIf itervalue# = pivotvalue# Then
If Not pivotlist Then pivotlist = MakeMEMBlock(listsize*4)
PokeInt pivotlist, pivotlistitems*4,iteritem
pivotlistitems = pivotlistitems+1
EndIf
EndIf
EndIf
Next i
listpointer=4
If lesserlistitems > 0 Then
PokeInt lesserlist,0,lesserlistitems
If lesserlistitems > 1 Then sortedless = QuickSortByFloat(lesserlist,floatposition) Else sortedless = lesserlist
sortedlesssize = PeekInt(sortedless,0)
MemCopy sortedless,4,list,listpointer,sortedlesssize*4
listpointer=listpointer+sortedlesssize*4
DeleteMEMBlock sortedless
EndIf
PokeInt list,listpointer,pivotitem
listpointer=listpointer+4
If pivotlistitems > 0 Then
MemCopy pivotlist,0,list,listpointer,pivotlistitems*4
DeleteMEMBlock pivotlist
listpointer=listpointer+pivotlistitems*4
EndIf
If greaterlistitems > 0 Then
PokeInt greaterlist,0,greaterlistitems
If greaterlistitems> 1 Then sortedgreater = QuickSortByFloat(greaterlist,floatposition) Else sortedgreater = greaterlist
sortedgreatersize = PeekInt(sortedgreater,0)
MemCopy sortedgreater,4,list,listpointer,sortedgreatersize*4
DeleteMEMBlock sortedgreater
EndIf
PokeInt list,0,(sortedlesssize+1+pivotlistitems+sortedgreatersize)
Return list
End Function
//List on muistipala jonka alussa on kokonaislukuna alkioiden lukumäärä
//Alkiot ovat omia muistipalojansa ja voivat sisältää mitä tahansa arvoja
//Funktio etsii järjestettävää kokonaislukua alkiosta intposition arvon perusteella,
//oletuksena alkion alusta.
Function QuickSortByInt(list,intposition=0)
//http://en.wikipedia.org/wiki/Quicksort
listsize = PeekInt(list,0)
If listsize=1 Then Return list
pivot = Rand(1,listsize)
pivotitem = PeekInt(list,pivot*4)
pivotvalue = PeekInt(pivotitem,intposition)
For i=1 To listsize
If i<>pivot Then
iteritem = PeekInt(list,i*4)
If iteritem Then
itervalue = PeekInt(iteritem,intposition)
If itervalue < pivotvalue Then
If Not lesserlist Then lesserlist = MakeMEMBlock(listsize*4)
lesserlistitems = lesserlistitems + 1
PokeInt lesserlist,lesserlistitems*4,iteritem
ElseIf itervalue > pivotvalue Then
If Not greaterlist Then greaterlist = MakeMEMBlock(listsize*4)
greaterlistitems = greaterlistitems + 1
PokeInt greaterlist,greaterlistitems*4,iteritem
ElseIf itervalue = pivotvalue Then
If Not pivotlist Then pivotlist = MakeMEMBlock(listsize*4)
PokeInt pivotlist, pivotlistitems*4,iteritem
pivotlistitems = pivotlistitems+1
EndIf
EndIf
EndIf
Next i
listpointer=4
If lesserlistitems > 0 Then
PokeInt lesserlist,0,lesserlistitems
If lesserlistitems > 1 Then sortedless = QuickSortByInt(lesserlist,intposition) Else sortedless = lesserlist
sortedlesssize = PeekInt(sortedless,0)
MemCopy sortedless,4,list,listpointer,sortedlesssize*4
listpointer=listpointer+sortedlesssize*4
DeleteMEMBlock sortedless
EndIf
PokeInt list,listpointer,pivotitem
listpointer=listpointer+4
If pivotlistitems > 0 Then
MemCopy pivotlist,0,list,listpointer,pivotlistitems*4
DeleteMEMBlock pivotlist
listpointer=listpointer+pivotlistitems*4
EndIf
If greaterlistitems > 0 Then
PokeInt greaterlist,0,greaterlistitems
If greaterlistitems> 1 Then sortedgreater = QuickSortByInt(greaterlist,intposition) Else sortedgreater = greaterlist
sortedgreatersize = PeekInt(sortedgreater,0)
MemCopy sortedgreater,4,list,listpointer,sortedgreatersize*4
DeleteMEMBlock sortedgreater
EndIf
PokeInt list,0,(sortedlesssize+1+pivotlistitems+sortedgreatersize)
Return list
End Function
Tämä olisi muuten hyvä idea, mutta koodista tulee helposti vaikeaselkoista kun dataa on paljon (>10 muuttujaa) ja merkkijonoja ei voi toteuttaa järkevästi.MetalRain wrote:Tai sitten voi käyttää pelkästään muistipaloja.
Code: Select all
Dim Tyypit(1)
For iB.Block = Each Block
n + 1
Next iB
ReDim Tyypit(n)
iB = First(Block)
For i = 0 To n - 1
Tyypit(i) = ConvertToInteger(iB)
iB = After(iB)
Next i
//---järjesteleminen tähän
For i = 0 To n - 1
iB = ConvertToType(Tyypit(i))
//Tähän jotain toimintaa
Next i
Tämä sama virheilmoitus tulee myös jos yrität tunkea esim. merkkijonoon liian pitkää tekstiä eli toisin sanoen, kun tietotyypin kapasiteetti ylitetään.
En nyt jaksa miettiä läpikotaisin miten se tapahtuu, mutta kyseessähän on 2 askelta: 1. Selvitetään pitääkö kääntyä myötä- vai vastapäivään. 2. Käännytään halutun määrän verran.duck wrote:miten toteutetaan vihollisen tasainen kääntyminen pelaajaa kohti?
eli huolimatta pelaajan kulmasta viholliseen nähden, vihollinen kääntyy samaa tasaista vauhtia pelaajaa kohti.
curveanglella ja pointobjectilla molemmilla tulee tietyissä tilanteissa liian jyrkät kääntymiset.
Tai sitten siitä, että tuota MakeErroria oli lähemmäs kahtasataatuhattariviä. Pelleilin sisentäjällä, ja siitä tulikin sitten lisääjä. Täytti koko tiedoston ensimmäisellä merkkijonollatimpe99 wrote:Johtuu luultavasti siitä, että sinulla on liian paljon täysin samanlaisia komentoja peräkkäin joten CoolBasicin exenkirjoittaja valittaa.EDIT:Tämä sama virheilmoitus tulee myös jos yrität tunkea esim. merkkijonoon liian pitkää tekstiä eli toisin sanoen, kun tietotyypin kapasiteetti ylitetään.
No tuotahan minä juuri tarkoitin. Ja ei ole mitään koodirajaa ainakaan minun tietääkseni, jos olisi niin joku jolle se on tullut vastaan olisi varmaan kirjoitellut asiasta foorumille.Konstaduck wrote:Tai sitten siitä, että tuota MakeErroria oli lähemmäs kahtasataatuhattariviä. Pelleilin sisentäjällä, ja siitä tulikin sitten lisääjä. Täytti koko tiedoston ensimmäisellä merkkijonollatimpe99 wrote:Johtuu luultavasti siitä, että sinulla on liian paljon täysin samanlaisia komentoja peräkkäin joten CoolBasicin exenkirjoittaja valittaa.EDIT:Tämä sama virheilmoitus tulee myös jos yrität tunkea esim. merkkijonoon liian pitkää tekstiä eli toisin sanoen, kun tietotyypin kapasiteetti ylitetään.
Onko CB:ssä muuten minkäänlaista koodirajoitusta? Siis sillein että johonkin pisteeseen asti antaa koodata, mutta sen jälkeen antaa Erroria, että vähennä koodia??
Okei tämä selvä. [/edit]Chaosworm wrote:Minulla ainakin yli 100 000 riviä näkyi toimivan ihan hyvin.
Minulla ainakin yli 100 000 riviä näkyi toimivan ihan hyvin.Viltzu wrote:Muistelisin että editorissa oli jokin jännyys eikä näyttänyt kaikkia rivejä kun niitä oli paljon. Yli 6000 riviä. En enää edes muista mistä tämä tieto on peräisin enkä edes nyt jaksa testailla.
Ja tuo koko virheilmoitus menee näin: Sovellus tai DLL C:/Program Files/CoolBasic/Omat/Funktiokirjastot/cbChipmunk/cbChipmunk/cbChipmunk.cb ei ole kelvolinen windows NT - vedos. Tarkista tämä asennuslevykkeeltä