Page 17 of 23

Re: Tyhmät kysymykset (I/2012)

Posted: Sun Feb 03, 2013 2:28 pm
by valscion
Paroni wrote:Miksiköhän seuraava koodi ei toimi?

Code: Select all

--- snip ---

DrawImage pwn\Img, pwn\PosX, pwn\PosY-(ImageHeight(pwn\Img)-TileSize), pwn\Facing-1

--- snip ---
Mitä tarkalleen ottaen haluat koodin tekevän? En näe missään vaiheessa sinun muuttavan pwn\Facing arvoa enkä tiedä mitä sen pitäisi tehdä.

Code: Select all

DrawToImage pwn\Img
    For f = 0 To 3
        DrawImage char\Body, TileSize*f, 0, f
    Next f
DrawToScreen
Tässä siis piirrät kuvan, johon teet neljä framea ja jokaisessa on sama char\Body kuva piirrettynä? Mikä ajatus tässä on takana?

Ja nyt kun tarkemmin tutkiskelin asiaa, vaikuttaisi siltä ettei MakeImagella luotuun, animoituun kuvaan voi piirtää kuin ensimmäisen framen oikein. Koitin säätää CopyBoxin kanssa mutta en onnistunut. Onnistuin säätämään kuitenkin tämän kaiken toimimaan niin, että kuva tallennetaan väliaikaisesti kovalevylle ja ladataan heti perään LoadAnimImage-funktiolla:

Code: Select all

'Kuva johon piirretään kaikki framet
tmpImg = MakeImage(50 * 4, 128)

'Piirretään väliaikaiseen isoon kuvaan
DrawToImage tmpImg

    For f = 0 To 3
        Color f * 60 + 40, f * 20 + 40, 0
        Box f * 50, 0, 50, 128, ON
    Next f

DrawToScreen

' Tallennetaan kuva väliaikaisesti kovalevylle
SaveImage tmpImg, "tmp-img.bmp"

' Ladataan kuva animImg muuttujaan framejen kera.
animImg = LoadAnimImage("tmp-img.bmp", 50, 128, 0, 4)

' Poistetaan väliaikainen kuva kovalevyltä
DeleteFile "tmp-img.bmp"

' Piirretään eri framet sisältämä kuva irrallisina frameina
DrawImage animImg, 0, 0, 0
DrawImage animImg, 60, 0, 1
DrawImage animImg,120, 0, 2
DrawImage animImg,180, 0, 3

' Referenssikuva
DrawImage tmpImg, 0, 140

Color cbwhite
Text 10,270,"Paina mitä tahansa näppäintä lopettaaksesi..."

DrawScreen

WaitKey

Re: Tyhmät kysymykset (I/2012)

Posted: Sun Feb 03, 2013 2:59 pm
by Paroni
VesQ wrote: Mitä tarkalleen ottaen haluat koodin tekevän? En näe missään vaiheessa sinun muuttavan pwn\Facing arvoa enkä tiedä mitä sen pitäisi tehdä.
Olisi tosiaan pitänyt kommentoida koodia, mutta kun kyseessä oli oma testi toivoin, että joku täällä ymmärtäisi tarkoituksen ilman kommentteja :)
Lyhyesti sanottuna käytän AssemblePawnia kokoamaan hahmon eri osat yhteen kuvaan. Kaikki osat ovat animoituja kuvia. Tarkoitus olisi luoda helposti muokattavia hahmoja tällä tavalla.
pwn\Facing muutetaan aina kun hahmon suunta vaihtuu, toisin sanoen liikkuessa. Käytän sitä juurikin kertomaan ohjelmalle, mikä frame pitäisi piirtää.

Code: Select all

DrawToImage pwn\Img
    For f = 0 To 3
        DrawImage char\Body, TileSize*f, 0, f
    Next f
DrawToScreen
Tässä siis piirrät kuvan, johon teet neljä framea ja jokaisessa on sama char\Body kuva piirrettynä? Mikä ajatus tässä on takana?
Ajatus olisi, että char\Body on kuva jossa on neljä framea (ylös, alas ja sivuille). Yritän siis piirtää jokaiseen pwn\Img frameen oikean framen char\Body:sta. Tai ajattelin sen toimivan noin, mutta eipäs toiminut.
Ja nyt kun tarkemmin tutkiskelin asiaa, vaikuttaisi siltä ettei MakeImagella luotuun, animoituun kuvaan voi piirtää kuin ensimmäisen framen oikein.
Ja tämä sitten selittäisikin miksei funktioni toiminut, sillä ainoastaan ensimmäinen frame toimi, muut näyttivät tyhjää. Kokeilen koodiasi heti kun olen kotona.

Re: Tyhmät kysymykset (I/2012)

Posted: Sun Feb 03, 2013 3:27 pm
by Jani
Paroni wrote:
VesQ wrote: Mitä tarkalleen ottaen haluat koodin tekevän? En näe missään vaiheessa sinun muuttavan pwn\Facing arvoa enkä tiedä mitä sen pitäisi tehdä.
Olisi tosiaan pitänyt kommentoida koodia, mutta kun kyseessä oli oma testi toivoin, että joku täällä ymmärtäisi tarkoituksen ilman kommentteja :)
Lyhyesti sanottuna käytän AssemblePawnia kokoamaan hahmon eri osat yhteen kuvaan. Kaikki osat ovat animoituja kuvia. Tarkoitus olisi luoda helposti muokattavia hahmoja tällä tavalla.
pwn\Facing muutetaan aina kun hahmon suunta vaihtuu, toisin sanoen liikkuessa. Käytän sitä juurikin kertomaan ohjelmalle, mikä frame pitäisi piirtää.

Code: Select all

DrawToImage pwn\Img
    For f = 0 To 3
        DrawImage char\Body, TileSize*f, 0, f
    Next f
DrawToScreen
Tässä siis piirrät kuvan, johon teet neljä framea ja jokaisessa on sama char\Body kuva piirrettynä? Mikä ajatus tässä on takana?
Ajatus olisi, että char\Body on kuva jossa on neljä framea (ylös, alas ja sivuille). Yritän siis piirtää jokaiseen pwn\Img frameen oikean framen char\Body:sta. Tai ajattelin sen toimivan noin, mutta eipäs toiminut.
Ja nyt kun tarkemmin tutkiskelin asiaa, vaikuttaisi siltä ettei MakeImagella luotuun, animoituun kuvaan voi piirtää kuin ensimmäisen framen oikein.
Ja tämä sitten selittäisikin miksei funktioni toiminut, sillä ainoastaan ensimmäinen frame toimi, muut näyttivät tyhjää. Kokeilen koodiasi heti kun olen kotona.
Miksi edes tarvitset kuvan kopiointia? Piirä vain char\body useaan paikkaan.

Re: Tyhmät kysymykset (I/2012)

Posted: Sun Feb 03, 2013 4:43 pm
by Paroni
Jani wrote:Miksi edes tarvitset kuvan kopiointia? Piirä vain char\body useaan paikkaan.
Ajattelin, että yhden kuvan kasaaminen (ja päivitys kun on tarvis) ja sen piirto olisi jokseenkin tehokkaampaa kuin jokaiselle eri hahmolle eri osien piirto aina kun ovat ruudulla, mutta toisaalta cbE:n ansiosta tällä ei nyt taida olla muutenkaan niin väliä. Eikä siinä mitään, funktio toimi kuten oli tarkoituskin kun kyseessä oli animoimaton kuva.

Re: Tyhmät kysymykset (I/2012)

Posted: Tue Feb 05, 2013 6:16 pm
by Guest
Miten saisi esineen kiinteäksi ettei ukko mene läpi? :oops:

Re: Tyhmät kysymykset (I/2012)

Posted: Tue Feb 05, 2013 6:27 pm
by Misthema
Guest wrote:Miten saisi esineen kiinteäksi ettei ukko mene läpi? :oops:
Aseta esineen ja ukon välille törmäys, mikäli objekteja käytät (manuaalista SetupCollision).
Jos käytät kuvia, niin joudut itse laskemaan ja määrittelemään törmäykset koodissasi.

Re: Tyhmät kysymykset (I/2012)

Posted: Tue Feb 05, 2013 8:27 pm
by Guest
Voisiko joku ketoa miten saa sitten tehtyä kokonaisia seiniä sinne???


Tuommosta koodia olis sisässä:


SCREEN 450,350

FrameLimit 40

kartta = MakeObjectFloor ()
maailma = LoadImage ("C:\Users\Pauna\Pictures\lattia.bmp")

PaintObject kartta, maailma

seinä = LoadObject ("C:\Users\Pauna\Pictures\seinä.bmp")

ukko= LoadObject ("C:\Users\Pauna\Pictures\ukkeli4.bmp",72)

PositionObject ukko, 150,100
PositionObject seinä, 110,100

SetupCollision ukko,seinä,2,2,2
SetupCollision seinä,ukko,2,2,2

Repeat

If KeyDown(cbkeyA) Then TurnObject ukko, 5
If KeyDown(cbkeyD) Then TurnObject ukko, -5
If KeyDown(cbkeyW) Then MoveObject ukko, 2
If KeyDown(cbkeyS) Then MoveObject ukko, -2

UpdateGame

CloneCameraPosition ukko

DrawScreen

Forever

Re: Tyhmät kysymykset (I/2012)

Posted: Tue Feb 05, 2013 8:36 pm
by Jonez
Suosittelen käyttämään tilemappeja, mallia voi katsoa oppitunnista #12. Lisäksi, kun laitat koodia, laita ne mieluiten [ code][/code] -tagien väliin.

Re: Tyhmät kysymykset (I/2012)

Posted: Wed Feb 06, 2013 8:00 am
by Guest
en kyllä vieläkään tajunnut tuota......kannattaa vääntää se minulle rautalangasta niin opin....

Re: Tyhmät kysymykset (I/2012)

Posted: Wed Feb 06, 2013 8:32 am
by axu
Vieras wrote:en kyllä vieläkään tajunnut tuota......kannattaa vääntää se minulle rautalangasta niin opin....
Voisit eritellä ongelmaa hieman enemmän. Kirjoittamasi koodi sinänsä on ihan toimiva (paitsi rivi SetupCollision seinä,ukko,2,2,2 on täysin turha ellet aio liikutella seinää), joskin se olettaa, että seinä on ympyrän muotoinen. Tilekarttoihin minäkin suosittelen tutustumaan, todennäköisesti ovat juuri sitä mitä haet.

Muutama vinkki: Tiedostopolut kannattaa kirjoittaa suhteellisina eikä absoluuttisina. Jos esim. tallennat koodin kansioon "C:\Ohjelmointi\Projekti\" ja kuvat kansioon "C:\Ohjelmointi\Projekti\Kuvat\", niin voit koodissa ladata ne tiedostopolulla "Kuvat\_tiedostonimi_". Näin peli toimii, vaikka sen siirtäisi (medioineen) muualle. Vähemmän tärkeää, mutta suosittelen käyttämään kuvien tiedostomuotona png:tä bmp:n sijasta (ainakin Paintissa tallennettaessa voit valita tiedostomuodon). Etenkin isommilla kuvilla tilan säästö on huomattava.

Re: Tyhmät kysymykset (I/2012)

Posted: Wed Feb 06, 2013 6:21 pm
by Guest
Ei toimi vaikka tein tuon tilekartan herjaa että ei pysty lukemaan....en tiedä missä muodossa nuo pitäisi pistää:

Code: Select all

SCREEN 450,350

FrameLimit 40

kartta = LoadMap ("C:\Program Files (x86)\Tilester\test.til","media\tileset.bmp")
PlayObject kartta, 0,0,1


ukko= LoadObject ("C:\Users\Pauna\Pictures\ukkeli4.bmp",72)

PositionObject ukko, 150,100

SetupCollision ukko, kartta, 1,4,2


Repeat

If KeyDown(cbkeyA) Then TurnObject ukko, 5
If KeyDown(cbkeyD) Then TurnObject ukko, -5
If KeyDown(cbkeyW) Then MoveObject ukko, 2
If KeyDown(cbkeyS) Then MoveObject ukko, -2

UpdateGame

CloneCameraPosition ukko

DrawScreen

Forever
EDIT:

koodaaja-edit, pistin kooditagit kuntoon kun vieras ei niitä itsekään voi käydä säätämässä.


Re: Tyhmät kysymykset (I/2012)

Posted: Wed Feb 06, 2013 7:56 pm
by Jonez
Kun kirjoitat sen koodisi, ole kiltti ja käytä niitä code-tageja, kuten jo sanoin pari viestiä ylempänä. Ei ole mukava auttaa ihmistä joka ei selvästi vaivaudu lukemaan viestejäsi tarpeeksi hyvin unohtaessaan tai jättäessään huomiotta noinkin yksinkertaisen asian.

Edit.

Code: Select all

Kaiken lisäämäsi koodin siis kuuluisi olla tällaisessa laatikossa
Itse ongelmaasi:

1. Varmista että tallensit til-tiedoston 1.3-muodossa, 1.0-muoto ei toimi. (En osaa sanoa onko test.til alkuperäinen tilesterin mukana tuleva tilekartta, minulla on sellainen, ja se toimii).
2. Varmista myös että tiedosto todella on Tilester-kansiossa, ja että sen nimi on "test.til", eikä esim. pelkkä "test".
3. Varmista myös että itse tilesetti on oikeassa kansiossa. Jos esim. tallensit pelisi tässä välissä johonkin muuhun kuin coolbasic-kansioon, ei "media/tileset.bmp" -tiedostopolku toimi (koska etsiminen aloitetaan väärästä kansiosta), ellet sitten tehnyt omaa.

Jos test.til on alkuperäinen tilesterin mukana tuleva kartta, on ongelmasi ratkaisu todennäköisesti kohdassa 3.

Re: Tyhmät kysymykset (I/2012)

Posted: Fri Feb 08, 2013 11:47 pm
by Jani
Satunnaista MAVia kyseessä, ratkaisua toivossa.

Ohjelma kaatuu kun haetaan tälläinen tieto:

Code: Select all

(PeekInt(mem, 1) - 1) / 4
Johon on siis asetettu:

Code: Select all

PokeInt mem, 1, 5 + n * 4
Jos jotakuta kiinnostaa koko systeemi niin tässäpä olisi:

Code: Select all

Const STACK_LIFO = 0
Const STACK_FIFO = 1
Const STACK_STARTOFFSET = 5

// Esimerkki

fifo = StackInit(STACK_FIFO)
lifo = StackInit(STACK_LIFO)

StackPush(fifo, 30)
StackPush(fifo, 17)
StackPush(fifo, 20)
StackPush(fifo, "Heips!")
StackPush(fifo, 16.7)

StackPush(lifo, 30)
StackPush(lifo, 17)
StackPush(lifo, 20)
StackPush(lifo, "Heips!")
StackPush(lifo, 16.7)

// MAVMAVMAVMAV
For i = 1 To StackCount(fifo) '5 ja toimii
    Print StackPop(fifo) + " - " + StackPop(lifo)
Next i

StackDelete(fifo)
StackDelete(lifo)

WaitKey

// Esimerkin loppu

// Säästytään leikkimiseltä arvojen lukemisen kanssa.
Type STACK_VALUE
    Field value As String
EndType

Function StackInit(stacktype As Byte = 0)
    mem = MakeMEMBlock(5)
    PokeByte mem, 0, stacktype
    PokeInt mem, 1, STACK_STARTOFFSET // offset
    Return mem
EndFunction

Function StackDelete(mem)
    pos = PeekInt(mem, 1) - 4
    For i = STACK_STARTOFFSET To pos Step 4
        If PeekInt(mem, pos) <> 0 Then
            val.STACK_VALUE = ConvertToType(PeekInt(mem, pos))
            Delete val
        EndIf
    Next i
    DeleteMEMBlock mem
EndFunction

Function StackPush(mem, value As String)
    pos = PeekInt(mem, 1)
    If pos + 4 > MEMBlockSize(mem) Then ResizeMEMBlock mem, pos + 4
    val.STACK_VALUE = New(STACK_VALUE)
    val\value = value
    PokeInt mem, pos, ConvertToInteger(val)
    PokeInt mem, 1, pos + 4
EndFunction

// LIFO: O(1)
// FIFO: O(n)
Function StackPop(mem)
    pos = PeekInt(mem, 1) - 4
    If pos < STACK_STARTOFFSET Then Return 0
    Dim value As String
    If PeekByte(mem, 0) = STACK_LIFO Then
        val.STACK_VALUE = ConvertToType(PeekInt(mem, pos))
        value = val\value
        Delete val
        PokeInt mem, pos, 0
        PokeInt mem, 1, pos
    ElseIf PeekByte(mem, 0) = STACK_FIFO Then
        val.STACK_VALUE = ConvertToType(PeekInt(mem, STACK_STARTOFFSET))
        value = val\value
        Delete val
        PokeInt mem, 1, pos
        For i = STACK_STARTOFFSET To pos - 4 Step 4
            PokeInt mem, i, PeekInt(mem, i + 4)
        Next i
    EndIf
    Return value
EndFunction

Function StackPeek(mem)
    pos = PeekInt(mem, 1) - 4
    If pos < STACK_STARTOFFSET Then Return 0
    If PeekByte(mem, 0) = STACK_LIFO Then
        val.STACK_VALUE = PeekInt(mem, pos)
    ElseIf PeekByte(mem, 0) = STACK_FIFO Then
        val.STACK_VALUE = PeekInt(mem, STACK_STARTOFFSET)
    EndIf
    Return val\value
EndFunction

Function StackCount(mem)
    Return (PeekInt(mem, 1) - 1) / 4
EndFunction

Re: Tyhmät kysymykset (I/2012)

Posted: Sun Feb 10, 2013 12:13 am
by valscion
Jani wrote:Satunnaista MAVia kyseessä, ratkaisua toivossa.
cbE:llä ajettaessa kaatuu virheilmoitukseen "ConvertToType() failed! Could not find a converted type with ID 5." Eli ei kaadu tuossa kohtaa missä luulet.

Koodi kaatuu siinä, kun yrität poistaa StackDelete funkkarilla lifoa. Katso vaikka:

Code: Select all

Const STACK_LIFO = 0
Const STACK_FIFO = 1
Const STACK_STARTOFFSET = 5

// Esimerkki

fifo = StackInit(STACK_FIFO)
lifo = StackInit(STACK_LIFO)

StackPush(fifo, 30)
StackPush(fifo, 17)
StackPush(fifo, 20)
StackPush(fifo, "Heips!")
StackPush(fifo, 16.7)

StackPush(lifo, 30)
StackPush(lifo, 17)
StackPush(lifo, 20)
StackPush(lifo, "Heips!")
StackPush(lifo, 16.7)

// MAVMAVMAVMAV
For i = 1 To StackCount(fifo) '5 ja toimii
    Print "asd"
    Print StackPop(fifo) + " - " + StackPop(lifo)
    Print "dsa"
Next i

Print "jee"
StackDelete(fifo)
Print "jee2"
StackDelete(lifo)
Print "jee3"

WaitKey

// Esimerkin loppu

// Säästytään leikkimiseltä arvojen lukemisen kanssa.
Type STACK_VALUE
    Field value As String
EndType

Function StackInit(stacktype As Byte = 0)
    mem = MakeMEMBlock(5)
    PokeByte mem, 0, stacktype
    PokeInt mem, 1, STACK_STARTOFFSET // offset
    Return mem
EndFunction

Function StackDelete(mem)
    pos = PeekInt(mem, 1) - 4
    For i = STACK_STARTOFFSET To pos Step 4
        If PeekInt(mem, pos) <> 0 Then
            val.STACK_VALUE = ConvertToType(PeekInt(mem, pos))
            Delete val
        EndIf
    Next i
    DeleteMEMBlock mem
EndFunction

Function StackPush(mem, value As String)
    pos = PeekInt(mem, 1)
    If pos + 4 > MEMBlockSize(mem) Then ResizeMEMBlock mem, pos + 4
    val.STACK_VALUE = New(STACK_VALUE)
    val\value = value
    PokeInt mem, pos, ConvertToInteger(val)
    PokeInt mem, 1, pos + 4
EndFunction

// LIFO: O(1)
// FIFO: O(n)
Function StackPop(mem)
    pos = PeekInt(mem, 1) - 4
    If pos < STACK_STARTOFFSET Then Return 0
    Dim value As String
    If PeekByte(mem, 0) = STACK_LIFO Then
        val.STACK_VALUE = ConvertToType(PeekInt(mem, pos))
        value = val\value
        Delete val
        PokeInt mem, pos, 0
        PokeInt mem, 1, pos
    ElseIf PeekByte(mem, 0) = STACK_FIFO Then
        val.STACK_VALUE = ConvertToType(PeekInt(mem, STACK_STARTOFFSET))
        value = val\value
        Delete val
        PokeInt mem, 1, pos
        For i = STACK_STARTOFFSET To pos - 4 Step 4
            PokeInt mem, i, PeekInt(mem, i + 4)
        Next i
    EndIf
    Return value
EndFunction

Function StackPeek(mem)
    pos = PeekInt(mem, 1) - 4
    If pos < STACK_STARTOFFSET Then Return 0
    If PeekByte(mem, 0) = STACK_LIFO Then
        val.STACK_VALUE = PeekInt(mem, pos)
    ElseIf PeekByte(mem, 0) = STACK_FIFO Then
        val.STACK_VALUE = PeekInt(mem, STACK_STARTOFFSET)
    EndIf
    Return val\value
EndFunction

Function StackCount(mem)
    Return (PeekInt(mem, 1) - 1) / 4
EndFunction 
Ehkä tämä auttaa koodisi debuggaamisessa. Itse en jaksa alkaa perehtymään siihen, mitä olet kikkaillut muistipalojen kanssa enemmän.

Re: Tyhmät kysymykset (I/2012)

Posted: Sun Feb 10, 2013 9:15 am
by Jani
VesQ wrote:
Jani wrote:Satunnaista MAVia kyseessä, ratkaisua toivossa.
cbE:llä ajettaessa kaatuu virheilmoitukseen "ConvertToType() failed! Could not find a converted type with ID 5." Eli ei kaadu tuossa kohtaa missä luulet.

Koodi kaatuu siinä, kun yrität poistaa StackDelete funkkarilla lifoa. Katso vaikka:

Ehkä tämä auttaa koodisi debuggaamisessa. Itse en jaksa alkaa perehtymään siihen, mitä olet kikkaillut muistipalojen kanssa enemmän.
StackDelete-funkkareihin asti ei edes päästä normaalilla cb:llä. Ohjelma pyörii täydellisesti jos

Code: Select all

StackCount(fifo)
->
5

Re: Tyhmät kysymykset (I/2012)

Posted: Sun Feb 10, 2013 12:51 pm
by valscion
Jani wrote:StackDelete-funkkareihin asti ei edes päästä normaalilla cb:llä. Ohjelma pyörii täydellisesti jos

Code: Select all

StackCount(fifo)
->
5
Hassua, sillä itse postaamani koodipätkä johon on lisätty vain printtejä, tulostaa "jee2" normaalillakin CB:llä ja kaatuu vasta sitten aina samassa kohtaa.

EDIT: For-loopin takia sitä StackCount-funkkaria kutsutaan jatkuvasti ja se palauttaa aina joka kierroksella eri arvon. Siksi homma taitaa kusahtaa. Kannattaa ottaa se StackCount(fifo) arvo talteen johonkin muuttujaan ensin ja sitten käyttää sitä for-loopissa. Alla oleva koodinpätkä toimii minulla ainakin varmaan oikein:

Code: Select all

Const STACK_LIFO = 0
Const STACK_FIFO = 1
Const STACK_STARTOFFSET = 5

// Esimerkki

fifo = StackInit(STACK_FIFO)
lifo = StackInit(STACK_LIFO)

StackPush(fifo, 30)
StackPush(fifo, 17)
StackPush(fifo, 20)
StackPush(fifo, "Heips!")
StackPush(fifo, 16.7)

StackPush(lifo, 30)
StackPush(lifo, 17)
StackPush(lifo, 20)
StackPush(lifo, "Heips!")
StackPush(lifo, 16.7)

// FIXEDFIXEDFIXED?
count = StackCount(fifo)
For i = 1 To count
    Print StackPop(fifo) + " - " + StackPop(lifo)
Next i

StackDelete(fifo)
StackDelete(lifo)

WaitKey

// Esimerkin loppu

// Säästytään leikkimiseltä arvojen lukemisen kanssa.
Type STACK_VALUE
    Field value As String
EndType

Function StackInit(stacktype As Byte = 0)
    mem = MakeMEMBlock(5)
    PokeByte mem, 0, stacktype
    PokeInt mem, 1, STACK_STARTOFFSET // offset
    Return mem
EndFunction

Function StackDelete(mem)
    pos = PeekInt(mem, 1) - 4
    For i = STACK_STARTOFFSET To pos Step 4
        If PeekInt(mem, pos) <> 0 Then
            val.STACK_VALUE = ConvertToType(PeekInt(mem, pos))
            Delete val
        EndIf
    Next i
    DeleteMEMBlock mem
EndFunction

Function StackPush(mem, value As String)
    pos = PeekInt(mem, 1)
    If pos + 4 > MEMBlockSize(mem) Then ResizeMEMBlock mem, pos + 4
    val.STACK_VALUE = New(STACK_VALUE)
    val\value = value
    PokeInt mem, pos, ConvertToInteger(val)
    PokeInt mem, 1, pos + 4
EndFunction

// LIFO: O(1)
// FIFO: O(n)
Function StackPop(mem)
    pos = PeekInt(mem, 1) - 4
    If pos < STACK_STARTOFFSET Then Return 0
    Dim value As String
    If PeekByte(mem, 0) = STACK_LIFO Then
        val.STACK_VALUE = ConvertToType(PeekInt(mem, pos))
        value = val\value
        Delete val
        PokeInt mem, pos, 0
        PokeInt mem, 1, pos
    ElseIf PeekByte(mem, 0) = STACK_FIFO Then
        val.STACK_VALUE = ConvertToType(PeekInt(mem, STACK_STARTOFFSET))
        value = val\value
        Delete val
        PokeInt mem, 1, pos
        For i = STACK_STARTOFFSET To pos - 4 Step 4
            PokeInt mem, i, PeekInt(mem, i + 4)
        Next i
    EndIf
    Return value
EndFunction

Function StackPeek(mem)
    pos = PeekInt(mem, 1) - 4
    If pos < STACK_STARTOFFSET Then Return 0
    If PeekByte(mem, 0) = STACK_LIFO Then
        val.STACK_VALUE = PeekInt(mem, pos)
    ElseIf PeekByte(mem, 0) = STACK_FIFO Then
        val.STACK_VALUE = PeekInt(mem, STACK_STARTOFFSET)
    EndIf
    Return val\value
EndFunction

Function StackCount(mem)
    val = (PeekInt(mem, 1) - 1) / 4
    'Print "::DBG:: " + val // Tällä voi debuggailla että mitä palautellaan
    Return val
EndFunction 
Edelleen taitaa olla ongelmana se, että StackCount palauttaa arvon 6 kun sen pitäisi varmaan palauttaa arvo 5. Tämän takia lukaistaan kerran vielä, ehkä yli muistista tai jotain.

Re: Tyhmät kysymykset (I/2012)

Posted: Sun Feb 10, 2013 11:43 pm
by JjyKs
Olen väsäillyt kahden pelaajan online Wings kloonia tässä nyt jonkun aikaa CBNetworkilla. Nyt kumminkin tuli ongelma, jota en ainakaan googlettemalla onnistunut ratkaisemaan. Eli pitäisi saada IP kerrottua clientille muutenkin, kuin suoraan koodiin laittamalla.

Tällä hetkellä toimivana ratkaisuna on siis tämä:

Code: Select all

rtn = InitClient("localhost", UDP_PORT, 100 )
Yritin saada IP:n syötettyä, ennen ohjelman suorittamista tällätavalla:

Code: Select all

AddText "Enter IP"
    Repeat
        ip=Input("IP:  ")    
        DrawScreen    
    Until KeyHit(cbkeyreturn)

rtn = InitClient(ip, UDP_PORT, 100 )
Aivan sama mitä tuohon inputtiin laittaa, niin clientti ei yhdistä palvelimelle. Veikkaan, että erittäin yksinkertainen ongelma, mutta nyt ei aivot oikein suostu toimimaan..

Re: Tyhmät kysymykset (I/2012)

Posted: Sun Feb 10, 2013 11:57 pm
by naput telija
JjyKs wrote:Olen väsäillyt kahden pelaajan online Wings kloonia tässä nyt jonkun aikaa CBNetworkilla. Nyt kumminkin tuli ongelma, jota en ainakaan googlettemalla onnistunut ratkaisemaan. Eli pitäisi saada IP kerrottua clientille muutenkin, kuin suoraan koodiin laittamalla.

Tällä hetkellä toimivana ratkaisuna on siis tämä:

Code: Select all

rtn = InitClient("localhost", UDP_PORT, 100 )
Yritin saada IP:n syötettyä, ennen ohjelman suorittamista tällätavalla:

Code: Select all

AddText "Enter IP"
    Repeat
        ip=Input("IP:  ")    
        DrawScreen    
    Until KeyHit(cbkeyreturn)

rtn = InitClient(ip, UDP_PORT, 100 )
Aivan sama mitä tuohon inputtiin laittaa, niin clientti ei yhdistä palvelimelle. Veikkaan, että erittäin yksinkertainen ongelma, mutta nyt ei aivot oikein suostu toimimaan..
Joku estää coolbasicin verkkoliikenteen. Jos käytössäsi on modeemin kautta reititetty internet, avaa käyttämäsi portti (löytyy internetistä hakusanoilla "port forwarding") . Voit kokeilla myös virustorjuntasi kautta kaiken coolbasic-verkkoliikenteen sallimista ja virustorjunnasta käyttämäsi portin avaamista. Kokeilepa myös käyttää omaa ulkoista ip-osoitettasi tai sisäistä (löytyy komentorivikomennolla ipconfig)

Re: Tyhmät kysymykset (I/2012)

Posted: Mon Feb 11, 2013 12:35 am
by Viltzu
JjyKs wrote:Olen väsäillyt kahden pelaajan online Wings kloonia tässä nyt jonkun aikaa CBNetworkilla. Nyt kumminkin tuli ongelma, jota en ainakaan googlettemalla onnistunut ratkaisemaan. Eli pitäisi saada IP kerrottua clientille muutenkin, kuin suoraan koodiin laittamalla.

Tällä hetkellä toimivana ratkaisuna on siis tämä:

Code: Select all

rtn = InitClient("localhost", UDP_PORT, 100 )
Yritin saada IP:n syötettyä, ennen ohjelman suorittamista tällätavalla:

Code: Select all

AddText "Enter IP"
    Repeat
        ip=Input("IP:  ")    
        DrawScreen    
    Until KeyHit(cbkeyreturn)

rtn = InitClient(ip, UDP_PORT, 100 )
Aivan sama mitä tuohon inputtiin laittaa, niin clientti ei yhdistä palvelimelle. Veikkaan, että erittäin yksinkertainen ongelma, mutta nyt ei aivot oikein suostu toimimaan..
Et ole määritellyt muuttujaa ip merkkijonoksi, jolloin syötetty ip:stä jää jäljelle vain ensimmäinen luku. (Esim. "192.168.0.1" -> "192") tulee 0.

Re: Tyhmät kysymykset (I/2012)

Posted: Mon Feb 11, 2013 4:02 pm
by JjyKs
naput telija wrote:Joku estää coolbasicin verkkoliikenteen. Jos käytössäsi on modeemin kautta reititetty internet, avaa käyttämäsi portti (löytyy internetistä hakusanoilla "port forwarding") . Voit kokeilla myös virustorjuntasi kautta kaiken coolbasic-verkkoliikenteen sallimista ja virustorjunnasta käyttämäsi portin avaamista. Kokeilepa myös käyttää omaa ulkoista ip-osoitettasi tai sisäistä (löytyy komentorivikomennolla ipconfig)
Kysymys saattoi olla hiukan epäselvä, mutta ongelmanahan oli juuri tuo Viltzu:n korjaama muuttujan tyyppi, eihän nyt localhostia varten mitään portteja tarvitse avata.
Viltzu wrote:Et ole määritellyt muuttujaa ip merkkijonoksi, jolloin syötetty ip:stä jää jäljelle vain ensimmäinen luku. (Esim. "192.168.0.1" -> "192") tulee 0.
Kiitos paljon. En vielä päässyt tuota testaamaan, mutta eiköhän se ongelma löytynyt :)