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
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)
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.
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ä
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.
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.
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.
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
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.
Hyvä, juuri noinhan se kuuluukin tehdä. Siihen vielä For-silmukkaan ykkösen paikalle Piceste.Ubound, niin toimii erilaisilla estemäärillä.
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
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
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
Aihe on jo aika vanha, joten et voi enää vastata siihen.