https://www.ohjelmointiputka.net/koodivinkit/
Tuossa on se koodi. Miten voin pistää tuohon että se törmää kaikkiin samannimisiin objekteihin? And :ia olen koittanut jo eikä se toiminut.
Onko sulla indeksoitu joukko noita esteitä? Voi mennä aika hankalaksi. Vastaavat tarkistukset pitäisi tehdä jokaisen esteen suhteen erikseen. Kaikki tarvittavat apumuuttujatkin pitäisi indeksoida ja sitten vaan silmukalla käydään kaikki vuorollaan läpi. Ei se mahdotonta ole mutta saattaa hidastua jos esteitä on monia.
Kokeilin koodia kahdelle esteelle. Näyttäis toimivan, mutta tuli muutoksia melkoisesti. Tässä koodi
Option Explicit Dim L(1) As Integer, T(1) As Integer 'katso koodista Dim PL As Integer, PT As Integer 'pelaajan left ja Top Dim L0(1) As Integer, T0(1) As Integer 'hirviön + pelaajan leveys ja korkeus Dim X0 As Integer, Y0 As Integer 'MouseDown-piste Dim X1(1) As Integer, Y1(1) As Integer 'paikka vasen reuna, yläreuna Dim X2(1) As Integer, Y2(1) As Integer 'paikka oikea reuna, alareuna Dim dx As Integer, dy As Integer 'muutos Dim B(1) As Byte, M As Integer 'tila:0=oik,1=ylh,2=vas,3=alh Dim I As Integer Private Sub Form_Load() PL = P.Left: PT = P.Top For I = 0 To 1 L0(I) = H(I).Width + P.Width T0(I) = H(I).Height + P.Height X1(I) = H(I).Left - P.Width: X2(I) = H(I).Left + H(I).Width Y1(I) = H(I).Top - P.Height: Y2(I) = H(I).Top + H(I).Height Next End Sub Private Sub Form_Resize() For I = 0 To 1 L(I) = PL - H(I).Left + P.Width T(I) = PT - H(I).Top + P.Height If L(I) > 0 And L(I) < L0(I) And T(I) > 0 And T(I) < T0(I) Then M = L0(I) - L(I): B(I) = 0 If T(I) < M Then M = T(I): B(I) = 1 If L(I) < M Then M = L(I): B(I) = 2 If T0(I) - T(I) < M Then M = T0(I) - T(I): B(I) = 3 Select Case B(I) Case 0 PL = X2(I) Case 1 PT = Y1(I) Case 2 PL = X1(I) Case 3 PT = Y2(I) End Select End If Next P.Move PL, PT End Sub Private Sub P_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) X0 = X: Y0 = Y End Sub Private Sub P_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim LL As Integer, TT As Integer LL = PL: TT = PT If Button Then For I = 0 To 1 dx = X - X0: dy = Y - Y0 If Abs(dx) > H(I).Width Then dx = Sgn(dx) * H(I).Width If Abs(dy) > H(I).Height Then dy = Sgn(dy) * H(I).Height PL = LL + dx: PT = TT + dy L(I) = PL - H(I).Left + P.Width T(I) = PT - H(I).Top + P.Height If L(I) > 0 And L(I) < L0(I) And T(I) > 0 And T(I) < T0(I) Then Select Case B(I) Case 0 PL = X2(I): Exit For Case 1 PT = Y1(I): Exit For Case 2 PL = X1(I): Exit For Case 3 PT = Y2(I): Exit For End Select Else Select Case B(I) Case 0 If L(I) - L0(I) < -T(I) Then B(I) = 1 _ Else If L(I) - L0(I) < T(I) - T0(I) Then B(I) = 3 Case 1 If L(I) < T(I) Then B(I) = 2 _ Else If L(I) - L0(I) > -T(I) Then B(I) = 0 Case 2 If L(I) > T(I) Then B(I) = 1 _ Else If L(I) > T0(I) - T(I) Then B(I) = 3 Case 3 If L(I) < T0(I) - T(I) Then B(I) = 2 _ Else If L(I) - L0(I) > T(I) - T0(I) Then B(I) = 0 End Select End If Next P.Move PL, PT Me.Refresh End If End Sub
Formilla on siis H(0) ja H(1). Resize-tapahtumassa voi tulla virhe, jos P on jomman kumman päällä. Esteet (H(0) ja H(1) oltava sillai, ettei P voi olla molempien päällä yhtäaikaa. Ei siis pelaa täysin oikein.
Aihe on jo aika vanha, joten et voi enää vastata siihen.