Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: indexointi probleema

Sivun loppuun

tesmu [26.04.2005 20:36:56]

#

Miksi ihmeessä näitten indexointi ei toimi esteessä jonka indexi on 0 se toimii mutta miksei muissa toimi

Const NOPEUS As Integer = 10

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    For i = 0 To 1
    Select Case KeyCode
        Case vbKeyUp
            'Tarkistetaan, ettei olla menossa esteen päälle
            If PicUkko.Top < (piceste(i).Top + piceste(i).Height + NOPEUS) And _
            (PicUkko.Top + PicUkko.Height - NOPEUS) > piceste(i).Top And _
            PicUkko.Left < (piceste(i).Left + piceste(i).Width) And _
            (PicUkko.Left + PicUkko.Width) > piceste(i).Left Then
                'Jos kaikki ehdot täyttyivät näin on, ei liikuteta
                Exit Sub
            End If
            'Muuten voidaan liikuttaa ukkoa
            PicUkko.Top = PicUkko.Top - NOPEUS
        Case vbKeyRight
            If PicUkko.Top < (piceste(i).Top + piceste(i).Height) And _
            (PicUkko.Top + PicUkko.Height) > piceste(i).Top And _
            PicUkko.Left < (piceste(i).Left + piceste(i).Width - NOPEUS) And _
            (PicUkko.Left + PicUkko.Width + NOPEUS) > piceste(i).Left Then
                Exit Sub
            End If
            PicUkko.Left = PicUkko.Left + NOPEUS
        Case vbKeyDown
            If PicUkko.Top < (piceste(i).Top + piceste(i).Height - NOPEUS) And _
            (PicUkko.Top + PicUkko.Height + NOPEUS) > piceste(i).Top And _
            PicUkko.Left < (piceste(i).Left + piceste(i).Width) And _
            (PicUkko.Left + PicUkko.Width) > piceste(i).Left Then
                Exit Sub
            End If
            PicUkko.Top = PicUkko.Top + NOPEUS
        Case vbKeyLeft
            If PicUkko.Top < (piceste(i).Top + piceste(i).Height) And _
            (PicUkko.Top + PicUkko.Height) > piceste(i).Top And _
            PicUkko.Left < (piceste(i).Left + piceste(i).Width + NOPEUS) And _
            (PicUkko.Left + PicUkko.Width - NOPEUS) > piceste(i).Left Then
                Exit Sub
            End If
            PicUkko.Left = PicUkko.Left - NOPEUS
    End Select
    Next i
End Sub

esakom [26.04.2005 20:41:46]

#

sun for-silmukka on:

For i = 0 To 1

paljonko niitä esteitä oikein on?
Voisit laittaa ton silmukan vaikka:

For i = 0 To UBound(picEste)

hunajavohveli [26.04.2005 20:43:00]

#

Ai miten niin indeksointi ei toimi? Tarkoitatko, että ukko pääsee sellaisen esteen läpi, jonka indeksi on nolla?
Laita muuten ihmeessä tuo törmäystarkistus noiden näppäintarkistusten ulkopuolelle. Ei sitä tarvitse erikseen jokaiselle kirjoittaa. Näppäinten koodissa määrittelet vain ne koordinaatit, johon ollaan aikeissa siirtyä, ja sitten myöhemmin tarkistat, törmäävätkö ne koordinaatit esteeseen.

tesmu [26.04.2005 21:32:01]

#

ei vaan ukko ei pääse läpi 0 indeksissä olevista boxieista mutta kaikista muista pääsee
niin ja tuo mun for silmukka on lähinnä tällänen testi siel on 2 estettä toisen indexi on 0 ja toisen 1
Ja mitenköhän tuo tapahtuisi käytännössä tuo tarkastus muualla ?

EDIT: Huomasin juuri että nuo muut esteet hidastaa ukkelia mutta ei pysäytä

peran [26.04.2005 22:33:03]

#

Sinun koodisi todellakin hidastaa muiden esteiden yhteydessä, koska silmukassa se liikuttaa heti ukkoa, jos ei törmää ensimmäiseen esteeseen.
Elikkä ukon liikuttaminen pitää siirtää silmukan ulkopuolelle.
Koodia en rupea antamaan, koska olen kännykän selaimen varassa.

hunajavohveli [26.04.2005 23:26:32]

#

Periaate on siis tämä:

1. Selvitetään mitä näppäintä on painettu.
2. Luodaan näppäimen perusteella koordinaatit, joihin ollaan aikeissa siirtyä.
3. Tarkistetaan esteiden perusteella, voidaanko uusiin koordinaatteihin siiryä.
4. Jos voidaan, niin vaihdetaan varsinaiset koordinaatit (eli siis Left ja Top) uusiksi koordinaateiksi. Ja jos ei voida, niin sitten ei vaihdeta.

Edit: Kokeilepa tehdä se näin. Tuo koodi on tässä vaiheessa niin sekava, etten uskalla lähteä arvailemaan indeksiongelmasta vielä mitään. Mahdolliset typotkin on helpompi korjata, jos samaa virhettä ei ole kirjoitettu neljään kertaan.

peran [27.04.2005 16:20:00]

#

Ei se koodi niin hirvittävän sekava ole. Varsinkin kun on tiedossa, että se toimii yhden esteen kohdalla.
Seuraava koodiin tein tarvittavat muutokset, joka toiminneen, vaikken olekaan sitä testannut.

Idea selvinneen ainakin Tesmulle.

Const NOPEUS As Integer = 10

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    For i = 0 To 1
    Select Case KeyCode
        Case vbKeyUp
            'Tarkistetaan, ettei olla menossa esteen päälle
            If PicUkko.Top < (piceste(i).Top + piceste(i).Height + NOPEUS) And _
            (PicUkko.Top + PicUkko.Height - NOPEUS) > piceste(i).Top And _
            PicUkko.Left < (piceste(i).Left + piceste(i).Width) And _
            (PicUkko.Left + PicUkko.Width) > piceste(i).Left Then
                'Jos kaikki ehdot täyttyivät näin on, ei liikuteta
                Exit Sub
            End If
        Case vbKeyRight
            If PicUkko.Top < (piceste(i).Top + piceste(i).Height) And _
            (PicUkko.Top + PicUkko.Height) > piceste(i).Top And _
            PicUkko.Left < (piceste(i).Left + piceste(i).Width - NOPEUS) And _
            (PicUkko.Left + PicUkko.Width + NOPEUS) > piceste(i).Left Then
                Exit Sub
            End If
        Case vbKeyDown
            If PicUkko.Top < (piceste(i).Top + piceste(i).Height - NOPEUS) And _
            (PicUkko.Top + PicUkko.Height + NOPEUS) > piceste(i).Top And _
            PicUkko.Left < (piceste(i).Left + piceste(i).Width) And _
            (PicUkko.Left + PicUkko.Width) > piceste(i).Left Then
                Exit Sub
            End If
        Case vbKeyLeft
            If PicUkko.Top < (piceste(i).Top + piceste(i).Height) And _
            (PicUkko.Top + PicUkko.Height) > piceste(i).Top And _
            PicUkko.Left < (piceste(i).Left + piceste(i).Width + NOPEUS) And _
            (PicUkko.Left + PicUkko.Width - NOPEUS) > piceste(i).Left Then
                Exit Sub
            End If
    End Select
    Next i
    Select Case KeyCode
        Case vbKeyUp
            'Muuten voidaan liikuttaa ukkoa
            PicUkko.Top = PicUkko.Top - NOPEUS
        Case vbKeyRight
            PicUkko.Left = PicUkko.Left + NOPEUS
        Case vbKeyDown
            PicUkko.Top = PicUkko.Top + NOPEUS
        Case vbKeyLeft
            PicUkko.Left = PicUkko.Left - NOPEUS
    End Select

End Sub

Tesmu ilmoittelehan, jos saat koodisi toimimaan.

tesmu [27.04.2005 19:15:57]

#

Pera kiitoksia toimii perfect mut tota toi ubound silmukka en jotenki saanut toimimaan olisi kätevä ettei tuota 1 tarvitsisi muutella sitä mukaan ku tuodaan lisää seiniä esim

hunajavohveli [27.04.2005 21:58:57]

#

peran kirjoitti:

Ei se koodi niin hirvittävän sekava ole

Ei ehkä vielä, mutta odotapas vaan, jos tuota pitää lähteä vielä kehittelemään, ja sitten kirjoitetaan monta kertaa hirveä litania koodia. Ja jos yhdessäkin sattuu jokin typo, tai muu virhe, niin sitä ei ole todellakaan kiva lähteä debugaamaan.

Helpommin sinä selviät, kun teet koko homman näin:

Select Case KeyCode
  Case vbKeyUp
    uusix = Picukko.Left
    uusiy = Picukko.Top - NOPEUS
  Case vbKeyRight
    uusix = Picukko.Left + NOPEUS
    uusiy = Picukko.Top
  Case vbKeyDown
    uusix = Picukko.Left
    uusiy = Picukko.Top + NOPEUS
  Case vbKeyLeft
    uusix = Picukko.Left - NOPEUS
    uusiy = Picukko.Top
End Select

For i = 0 To 1
  If uusiy < (Piceste(i).Top + Piceste(i).Height) And _
    (uusiy + Picukko.Height) > Piceste(i).Top And _
    uusix < (Piceste(i).Left + Piceste(i).Width) And _
    (uusix + Picukko.Width) > Piceste(i).Left Then Exit Sub
Next i

Picukko.Left = uusix
Picukko.Top = uusiy

Eli ensin lasketaan uusi koordinaatti, sitten käydään läpi esteet ja poistutaan silmukasta, jos uudet koordinaatit törmäävät esteeseen. Jos esteeseen ei törmätä, edetään viimeiseen osaan, jossa vaihdetaan ukon koordinaatit uusiksi. Tällainen tapa helpottaa jo toiminnan ajatteluakin.

setä [28.04.2005 00:16:22]

#

Hyvä, juuri noinhan se kuuluukin tehdä. Siihen vielä For-silmukkaan ykkösen paikalle Piceste.Ubound, niin toimii erilaisilla estemäärillä.

tesmu [28.04.2005 07:59:30]

#

setä kirjoitti:

Hyvä, juuri noinhan se kuuluukin tehdä. Siihen vielä For-silmukkaan ykkösen paikalle Piceste.Ubound, niin toimii erilaisilla estemäärillä.

Eipäs vaan tuli joku errrooori et array puuttuu mut selvitin ongelman sillä et pistin näin

for i = 0 to piceste.count -1

netman87 [28.04.2005 16:53:48]

#

Eli jos tuotas... Mä tekisin tommosen ja siin ois kaiketi monta estettä... niin mitä ne palauttaa koordinaateiks?
Vai miten se tarkistetaan onkone tiel... ei vält tarvi vastata mutta nyt en jaksa tehä ja testata joten ois kiva olla varma asiasta :D

tesmu [29.04.2005 17:59:37]

#

Tuo peran koodi toimii mutta pistä tuon forsilmukan 1 paikalle
piceste.count-1 niin voit lisätä vaikka 100 picestettä jotka on indexoitu järjestyksessä 0 - 100 ja se ei mene mistään niistä läpi


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta