Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: törmäys 2 samannimiseen

remontti-reiska [16.01.2004 14:07:56]

#

https://www.ohjelmointiputka.net/koodivinkit/24150-vb6-törmäys-esteeseen
Tuossa on se koodi. Miten voin pistää tuohon että se törmää kaikkiin samannimisiin objekteihin? And :ia olen koittanut jo eikä se toiminut.

setä [16.01.2004 15:35:07]

#

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.

setä [16.01.2004 17:42:58]

#

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.

Vastaus

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

Tietoa sivustosta