Tyhmät kysymykset (I/2012)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset (I/2012)

Post 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
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
User avatar
Paroni
Newcomer
Posts: 20
Joined: Sun Jan 16, 2011 2:39 am

Re: Tyhmät kysymykset (I/2012)

Post 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.
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: Tyhmät kysymykset (I/2012)

Post 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.
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
User avatar
Paroni
Newcomer
Posts: 20
Joined: Sun Jan 16, 2011 2:39 am

Re: Tyhmät kysymykset (I/2012)

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

Re: Tyhmät kysymykset (I/2012)

Post by Guest »

Miten saisi esineen kiinteäksi ettei ukko mene läpi? :oops:
User avatar
Misthema
Advanced Member
Posts: 312
Joined: Mon Aug 27, 2007 8:32 pm
Location: Turku, Finland
Contact:

Re: Tyhmät kysymykset (I/2012)

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

Re: Tyhmät kysymykset (I/2012)

Post 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
User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset (I/2012)

Post 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.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Guest

Re: Tyhmät kysymykset (I/2012)

Post by Guest »

en kyllä vieläkään tajunnut tuota......kannattaa vääntää se minulle rautalangasta niin opin....
User avatar
axu
Devoted Member
Posts: 854
Joined: Tue Sep 18, 2007 6:50 pm

Re: Tyhmät kysymykset (I/2012)

Post 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.
Jos tämä viesti on kirjoitettu alle 5 min. sitten, päivitä sivu. Se on saattanut jo muuttua :roll:
Image
Guest

Re: Tyhmät kysymykset (I/2012)

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

User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset (I/2012)

Post 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.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: Tyhmät kysymykset (I/2012)

Post 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
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset (I/2012)

Post 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.
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
Jani
Devoted Member
Posts: 741
Joined: Fri Oct 31, 2008 4:53 pm

Re: Tyhmät kysymykset (I/2012)

Post 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
Dead men tell no tales. Also, Python rocks!
Codegolf: 99 bottles of beer (oneliner) - Water map partition
User avatar
valscion
Moderator
Moderator
Posts: 1599
Joined: Thu Dec 06, 2007 7:46 pm
Location: Espoo
Contact:

Re: Tyhmät kysymykset (I/2012)

Post 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.
cbEnchanted, uudelleenkirjoitettu runtime. Uusin versio: 0.4.1 — Nyt myös sorsat GitHubissa!
NetMatch - se kunnon nettimättö-deathmatch! Avoimella lähdekoodilla varustettu
vesalaakso.com
JjyKs
Newcomer
Posts: 2
Joined: Sun Feb 10, 2013 11:31 pm

Re: Tyhmät kysymykset (I/2012)

Post 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..
naput telija

Re: Tyhmät kysymykset (I/2012)

Post 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)
Viltzu
Guru
Posts: 1132
Joined: Sun Aug 26, 2007 5:45 pm
Location: Alavieska
Contact:

Re: Tyhmät kysymykset (I/2012)

Post 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.
JjyKs
Newcomer
Posts: 2
Joined: Sun Feb 10, 2013 11:31 pm

Re: Tyhmät kysymykset (I/2012)

Post 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 :)
Locked