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 SubFormilla 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.