Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: VB6: Törmäys esteeseen

Sivun loppuun

setä [14.01.2004 20:25:01]

#

Pelien yhteydessä jokin liikkuu ja törmää esteeseen. Tässä esimerkki, kuinka liike koodataan. Liikettä ohjataan hiirellä mutta koodia voi muuttaa erilaisille ohjauksille.
Formilla kaksi PictureBoxia, nimeltään P ja H (pelaaja ja hirviö). ScaleMode = 3, myös formilla. Jos P on H:n päällä se siirretään reunalle Form_Resize-tapahtumassa. Samalla tutkitaan, millä puolen H:ta P on. P:tä liikutellaan hiirellä raahaamalla. Kun se osuu esteseen, P liukuu esteen reunaa myöten hiiren liikkeen mukaan.

Option Explicit
Dim L As Integer, T As Integer 'katso koodista
Dim PL As Integer, PT As Integer 'pelaajan left ja Top
Dim L0 As Integer, T0 As Integer 'hirviön + pelaajan leveys ja korkeus
Dim X0 As Integer, Y0 As Integer 'MouseDown-piste
Dim X1 As Integer, Y1 As Integer 'paikka vasen reuna, yläreuna
Dim X2 As Integer, Y2 As Integer 'paikka oikea reuna, alareuna
Dim dx As Integer, dy As Integer 'muutos
Dim B As Byte, M As Integer      'tila:0=oik,1=ylh,2=vas,3=alh
Private Sub Form_Load()
  L0 = H.Width + P.Width
  T0 = H.Height + P.Height
  PL = P.Left: PT = P.Top
  X1 = H.Left - P.Width: X2 = H.Left + H.Width
  Y1 = H.Top - P.Height: Y2 = H.Top + H.Height
End Sub

Private Sub Form_Resize()
  L = PL - H.Left + P.Width
  T = PT - H.Top + P.Height
  'jos P on H:n päällä, se siirretään lähimpään paikkaan
  'H:n reunalle. Samalla testataan, millä puolen H:ta P on
  If L > 0 And L < L0 And T > 0 And T < T0 Then
    M = L0 - L: B = 0
    If T < M Then M = T: B = 1
    If L < M Then M = L: B = 2
    If T0 - T < M Then M = T0 - T: B = 3
    Select Case B
    Case 0
      PL = PL + M
    Case 1
      PT = PT - M
    Case 2
      PL = PL - M
    Case 3
      PT = PT + M
    End Select
  End If
  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 'tallennetaan koordinaatit
End Sub

Private Sub P_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button Then 'liikkuu vain jos painike alhaalla
    dx = X - X0: dy = Y - Y0 'erotukset
    'rajoitetaan dx, jottei mennä esteen läpi
    If Abs(dx) > H.Width Then dx = Sgn(dx) * H.Width
    If Abs(dy) > H.Height Then dy = Sgn(dy) * H.Height
    PL = PL + dx: PT = PT + dy
    L = PL - H.Left + P.Width
    T = PT - H.Top + P.Height
    If L > 0 And L < L0 And T > 0 And T < T0 Then
    'tullaan esteen päälle
      Select Case B 'millä puolen estettä
      Case 0
        PL = X2
      Case 1
        PT = Y1
      Case 2
        PL = X1
      Case 3
        PT = Y2
      End Select
    Else
      'tilan B muutokset
      Select Case B
      Case 0
        If L - L0 < -T Then B = 1 Else If L - L0 < T - T0 Then B = 3
      Case 1
        If L < T Then B = 2 Else If L - L0 > -T Then B = 0
      Case 2
        If L > T Then B = 1 Else If L > T0 - T Then B = 3
      Case 3
        If L < T0 - T Then B = 2 Else If L - L0 > T - T0 Then B = 0
      End Select
    End If
    P.Move PL, PT 'siirto korjattuun paikkaan
  End If
End Sub

rndprogy [15.01.2004 19:17:53]

#

ihan kuin olisit tehnyt tämän juuri sitä ruin baradia tekeville.

setä [15.01.2004 19:21:44]

#

Mikä ruin barad ??? Oikeestaan tämä oli jatkoa siihen osuma-keskusteluun. ja muistelin, että joku kyseli joskus jotain vastaavaa

sooda [15.01.2004 19:22:44]

#

aika kiva. toimii vähän paremmin kuin mun bugaavat yritykset :D

remontti-reiska [16.01.2004 08:13:16]

#

heh. Mukavaa. kiitos paljon nyt ei tartte soheltaa ton sqwiikin ymmärtämättömillä ohjeilla.

kaviaari [16.01.2004 08:19:12]

#

Aika purkkaa sanoisinko... kommenointi ei olisi pahasta ja tälläset yleensä blitataan eikä vaan liikuteta objekteja

setä [16.01.2004 12:06:56]

#

Joo, nuo kommentit itse asiassa unohtui. Voinhan lisäillä jotakin. Mitäs toi blttaaminen on suomeks???

kaviaari [16.01.2004 15:23:00]

#

Kaksoispuskurointi, kuva piirretään puskuriin ja filpataan näytölle... ei vilku kuvat

Pasikki [28.03.2004 20:58:26]

#

Elikkä miten tuota liikken ohjausta voisi muuttaa?


Sivun alkuun

Vastaus

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

Tietoa sivustosta