Misthema wrote:En tiedä ovatko muut tätä huomanneet, mutta jostain syystä muistipalat eivät toimi oikein - ainakaan luodun muistipalan koko ei ole "vakio":
Mielestäni muistipankin tulisi olla kokoa 4 (tavuina), jotta sinne voisi kirjoittaa kokonaislukua... Mutta tuon koodipätkän kanssa kokonaisluku tulostuu sellaisena kuin pitääkin, vaikkakin muistipalan koko on vain yhden (1) tavun.
Bugi vai feature?
Ominaisuus. Muistipalojen tarkoitus nimenomaan on siirtää muistinhallinta käyttäjän vastuulle.
Kyseessä on esimerkki puskuriylivuodosta. Juuri tuollaisia bugeja hakkerit käyttävät hyväkseen.
Misthema wrote:Jep jep. Sitten vielä ihmettelen tätä:
Ihan mielenkiintoinen... =D Luulisi jo puskevan erroria 'PokeInt':n kohdalla... Mutta noh.
Haluaisin vain olla varma että kirjoitan juuri sen verran muistipalaan kun olen siihen varannutkin, ilman että joutuisin sitä itse tarkistamaan joka välissä. =/
Juuri tuon ilmiön takia on hyvä tapa nollata pointteri aina kun data deletoidaan. Tällöin pointterin käyttäminen datan poistamisen jälkeen johtaa ohjelman kaatumiseen, mikä helpottaa bugin löytämistä (puskuriylivuodoilla on välillä aika järjettömiltä tuntuvia sivuvaikutuksia). Tuo koodi voi muuten joissain tilanteissa johtaa ohjelman kaatumiseen vaikka se ei tuossa tilanteessa niin teekään.
Muistinvarausongelman ratkaisemiseen auttaisi jos tietäisi, miksi haluat käyttää muistipaloja. Esimerkiksi voisit tehdä funktioita, jotka helpottavat muistipalojen käyttöä.
//nämä kertoo tiedon sijainnin tavuina joukon
//alusta lähtien
Const XIndex = 0 // kokonaisluku vie tilaa 4 tavua
Const YIndex = 4 // kokonaisluku vie tilaa 4 tavua
Const ValueIndex = 8 // vie vain tavun
// Muistipala näyttäisi siis tältä
//
//|0 tavu|1 tavu|2 tavu|3 tavu|4 tavu|5 tavu|6 tavu|7 tavu|8 tavu|
//|-------------xIndex--------|-------------YIndex--------|Value-|
//merkitään tietojoukon koko
Const DataSize = 9 //4+4+1 x,y,value
//varataan tilaa kymmenelle joukolle
MemSize = DataSize*10
//ja luodaan oikean kokoinen muistipala
mem = MakeMEMBlock(MemSize)
//tässä lisätään kymmenen tietojoukkoa
For i=0 To 9
//tämä osoittaa aina joukon alkuun
pointer = (i * DataSize)
//kirjoitetaan joukon alusta lisäten aiemmin määrätyt
//sijaintimuutokset
PokeInt mem,pointer+XIndex, Rand(100,-100)
PokeInt mem,pointer+YIndex, Rand(100,-100)
PokeByte mem,pointer+ValueIndex, Rand(0,255)
Next i
//Lukeminen on yhtä helppoa
//tässä toinen tapa indeksointiin
//eli käydään koko muistipalan koko tietojoukon
//kokosissa paloissa läpi
//i osoittaa aina kunkin tietojoukon alkuun
For i=0 To MemSize-1 Step DataSize
Print "X: "+PeekInt(mem,i+XIndex) +" Y: " + PeekInt(mem,i+YIndex) + " Value: "+ PeekByte(mem, i+ValueIndex)
Next i
WaitKey
Olen uusi täällä, ja minulla on tyhmä kysymys. Teen ylhäältäkuvattua räiskintäpeliä, mutta viholliset eivät lähde liikkeelle ukkoa kohti. Aina tulee MAV, kun lisään jahtaamiskoodin. Saattaa johtua siitä, kun ensimmäinen vihu luodaan vasta Timerin 3000 päässä, mutta liikkuminen laitetaan heti.
Olen uusi täällä, ja minulla on tyhmä kysymys. Teen ylhäältäkuvattua räiskintäpeliä, mutta viholliset eivät lähde liikkeelle ukkoa kohti. Aina tulee MAV, kun lisään jahtaamiskoodin. Saattaa johtua siitä, kun ensimmäinen vihu luodaan vasta Timerin 3000 päässä, mutta liikkuminen laitetaan heti.
Missäköhän vika?
Jos objektia ei ole olemassa ja sitä yritetään silti käyttää, seuraa MAV.
Paitsi, että sain sen juuri selvitettyä, objectin nimi oli vanha, koska vaihdoin sen.
Koodia kannattaa kommentoida. Jos haluat vaihtaa muuttujan nimeä, käytä Replace (korvaa) -toimintoa (CTRL+F). Kannattanee kuitenkin pitää mielessä, että jos sinulla on esimerkiksi funktio 'funkkari' ja muuttuja 'unkka' ja sitten haluaisit vaihtaa muuttujan nimeä, replace -toiminto sotkee myös funktion nimen.
For ia.ammukset = Each ammukset
For iv.vihut = Each vihut
If Osuvat( ia\obj, iv\obj ) Then
TuhoaAmmus()
TuhoaVihu()
Exit
EndIf
Next iv
Next ia
Voit käyttää funktion "Osuvat( obj1, obj2 )" kohdalla esim. ObjectsOverlap()-funkkaria. Tuhoa ammukset ja vihut näin:
DeleteObject jäsen/objekti
Delete jäsen
Edellisessä esimerkissä jäsen oli ia ammuksille, ja iv vihuille.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
<- protestipelikilpailun voittaja. Space War
For o.obj = Each obj
//[kaikki muu mahdollinen silmukan koodi ennen tätä]
If Objectsoverlap(o\objektimuuttuja, vihu) Then
DeleteObject o\objektimuuttuja
Delete o
EndIf
Next o
For v.vihu = Each vihu
For o.obj = Each obj
//[kaikki muu mahdollinen silmukan koodi ennen tätä]
If Objectsoverlap(o\objektimuuttuja, v\objektimuuttuja) Then
DeleteObject o\objektimuuttuja
Delete o
EndIf
Next o
Next v
En tehnyt editorilla vaan kirjoitin suoraan selaimella. Tämä niille jotka tulevat sitten valittamaan että "opettele käyttämään sisennysmerkkiä".
Miten olisi hyvä tehdä Palikkamoottori. Tarkoitan siis moottoria joka tekee ristikon pelin taakse. Niin kuin minecraftissa, ei palikat asetu muuaalle kuin ristikkoon(3Dnä tosin...). Tajuatte varmaan mitä haen...
ukkeli wrote:Miten olisi hyvä tehdä Palikkamoottori. Tarkoitan siis moottoria joka tekee ristikon pelin taakse. Niin kuin minecraftissa, ei palikat asetu muuaalle kuin ristikkoon(3Dnä tosin...). Tajuatte varmaan mitä haen...
Function kirjoitahei() //tässä MÄÄRITELLÄÄN funktio
AddText "helou!" //lisää teksti: helou!
End Function //funktion loppu
kirjoitahei() //tässä funktio KUTSUTAAN
Drawscreen //piirrä näyttö
WaitKey //odotetaan että jotain painetaan
Toivottavasti ymmärsit.
EDIT:
juu 2 hyvää vastausta siinä...
<Ize> Pitäs tehä allekirjotus..
<Ize> Vois keksiä jonkin nasahtavan sanonnan..
<Ize> Siitä tulis upea legenda ja kaikki vaihtaisivat allekirjoituksensa siihen.
<Ize> Ehkä ei kuitenkaa...
ukkeli wrote:Miten olisi hyvä tehdä Palikkamoottori. Tarkoitan siis moottoria joka tekee ristikon pelin taakse. Niin kuin minecraftissa, ei palikat asetu muuaalle kuin ristikkoon(3Dnä tosin...). Tajuatte varmaan mitä haen...
Korvaa tuo Pyorista-funktio Int():llä, RoundUp():lla tai RoundDown():lla, mikä nyt sopii parhaiten. Muuten olisin tehnyt ihan käännettävän esimerkin, mutta kun olen Linuxin puolella niin ei onnistu tähän hätään (Winukka on vielä säätämättä kuntoon).
EDIT: muistaakseni MouseX():lle ja MouseY():lle oli pelimaailman koordinaatteja käyttävät vastineet, joita kannattaa käyttää jos haluaa tuota objekteihin soveltaa. Itse en ole ikinä oikein objekteihin tykästynyt.
ukkeli wrote:Miten olisi hyvä tehdä Palikkamoottori. Tarkoitan siis moottoria joka tekee ristikon pelin taakse. Niin kuin minecraftissa, ei palikat asetu muuaalle kuin ristikkoon(3Dnä tosin...). Tajuatte varmaan mitä haen...
ukkeli wrote:Miten olisi hyvä tehdä Palikkamoottori. Tarkoitan siis moottoria joka tekee ristikon pelin taakse. Niin kuin minecraftissa, ei palikat asetu muuaalle kuin ristikkoon(3Dnä tosin...). Tajuatte varmaan mitä haen...
Siis kun sitä asetaobjectikoordinaatteihin() ei löydy, on hankala tehdä mappi generaattoria jossa voi rikkoa ja asettaa palikoita
sitäkö sinä meinasit? tuhota palikoita+asettaa? käytä SetTile:ä tai SetMap:ia.
Ja mappigene tarkoittaa sitä että ohjelma itse luo kartan randomilla.
<Ize> Pitäs tehä allekirjotus..
<Ize> Vois keksiä jonkin nasahtavan sanonnan..
<Ize> Siitä tulis upea legenda ja kaikki vaihtaisivat allekirjoituksensa siihen.
<Ize> Ehkä ei kuitenkaa...