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 SubPrivate 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 Subihan kuin olisit tehnyt tämän juuri sitä ruin baradia tekeville.
Mikä ruin barad ??? Oikeestaan tämä oli jatkoa siihen osuma-keskusteluun. ja muistelin, että joku kyseli joskus jotain vastaavaa
aika kiva. toimii vähän paremmin kuin mun bugaavat yritykset :D
heh. Mukavaa. kiitos paljon nyt ei tartte soheltaa ton sqwiikin ymmärtämättömillä ohjeilla.
Aika purkkaa sanoisinko... kommenointi ei olisi pahasta ja tälläset yleensä blitataan eikä vaan liikuteta objekteja
Joo, nuo kommentit itse asiassa unohtui. Voinhan lisäillä jotakin. Mitäs toi blttaaminen on suomeks???
Kaksoispuskurointi, kuva piirretään puskuriin ja filpataan näytölle... ei vilku kuvat
Elikkä miten tuota liikken ohjausta voisi muuttaa?
Aihe on jo aika vanha, joten et voi enää vastata siihen.