Jag håller på att göra ett spel där man styr image1 med piltangenterna och när man krockar med image2 så ska det hända något. Då knåpade jag ihop dem här koderna: Hej >Då knåpade jag ihop dem här koderna Hej igen Kanske denna funktionen fungerar? Lär mig snälla Svenpon varför man inte skall använda AND. Hej Är du säkert på att din satts hanterar alla situationer? Bilderna kan ju ha olika bred och sånt. Har inte satt mig i din satts men den ser lite skum ut. Efter som det kräver mindre jämförelse för att garantera att bilden inte koliderar med varandra än om det kolliderar med varandra. Det jag utnutjar i min funktion. Fick iden när jag arbetade med datum intervall. Där jag skulle kontrollera om perioker kolliderade med varandra. Har gjort ett litet exempel. Klistra in följande kod i ett tomt formulär:Lägga ihop if-satser....
If (Image1.Top > Image2.Top And Image1.Top < (Image2.Top + Image2.Height)) Or (Image2.Top > Image1.Top And Image2.Top < (Image1.Top + Image1.Height)) Then Form2.Show: Form1.Hide
If (Image1.Left > Image2.Left And Image1.Left < (Image2.Left + Image2.Width)) Or (Image2.Left > Image1.Left And Image2.Left < (Image1.Left + Image1.Width)) Then Form2.Show: Form1.Hide
Det fungerade inte så jag gick in på chatten och frågade. Då sa dom att jag måste sätta ihopa dom här två if-satserna till en. Då e min fråga. Hur gör jag? Någon som kan visa några exempel eller börja göra om min så jag förstår?
Tacksam för svar. /Daniel JönssonSv: Lägga ihop if-satser....
Så här skulle jag skriva.Om detta inte fungerar så är
vilkoren fel formulerade.
If Image1.Top > Image2.Top _
And Image1.Top < Image2.Top + Image2.Height _
Or Image2.Top > Image1.Top _
And Image2.Top < Image1.Top + Image1.Height _
Then Form2.Show
Form1.Hide
mvh
SvenSv: Lägga ihop if-satser....
Om jag inte minns fel var det jag som skrev dom, men men...
If (Image1.Top > Image2.Top And Image1.Top < (Image2.Top + Image2.Height)) Or _
(Image2.Top > Image1.Top And Image2.Top < (Image1.Top + Image1.Height)) AND _
(Image1.Left > Image2.Left And Image1.Left < (Image2.Left + Image2.Width)) Or _
(Image2.Left > Image1.Left And Image2.Left < (Image1.Left + Image1.Width)) Then
Form2.Show
Form1.Hide
End if
/JohanSv: Lägga ihop if-satser....
Efter att ha tänkt ett tag på ditt prob ,så bör det se ut så här
If Image1.Top > Image2.Top Then
If Image1.Top < Image2.Top + Image2.Height _
Or Image2.Top > Image1.Top Then
If Image2.Top < Image1.Top + Image1.Height Then
Form2.Show
Form1.Hide
End If
End If
End If
Man skall unvika AND så länge man kan,det är bättre att lägga
en If sats till under istället för AND
mvh
SvenSv: Lägga ihop if-satser....
Public Function HitTest(Image1 As Image, Image2 As Image) As Boolean
If Image2.Left + Image2.Width <= Image1.Left Then
ElseIf Image2.Left >= Image1.Left + Image1.Width Then
Else
If Image2.Top + Image2.Height <= Image1.Top Then
ElseIf Image2.Top >= Image1.Top + Image1.Height Then
Else
HitTest = True
End If
End If
End FunctionSv: Lägga ihop if-satser....
IT undrar...Sv: Lägga ihop if-satser....
>varför man inte skall använda AND .
Exemel enl ovan:
If Image1.Top > Image2.Top _
And Image1.Top < Image2.Top + Image2.Height _
Or Image2.Top > Image1.Top _
And Image2.Top < Image1.Top + Image1.Height _
Then Form2.Show
Form1.Hide
Om nu första påståendet ovan If Imag1 ......
är Falskt så måste iallafal programmet testa de andra
AND och OR vilkoren helt i onödan.
Är första vilkoret Falskt faller ju det övriga.
Dvs Ersätt AND med If........ Then
If .......Then osv osv.
mvh
Sven Sv: Lägga ihop if-satser....
Sv: Lägga ihop if-satser....
Option Explicit
Private MoveImage As Image
Private StillImage As Image
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyLeft
If Shift And vbShiftMask Then
MoveImage.Width = MoveImage.Width - Screen.TwipsPerPixelX
Else
MoveImage.Left = MoveImage.Left - Screen.TwipsPerPixelX
End If
Case vbKeyUp
If Shift And vbShiftMask Then
MoveImage.Height = MoveImage.Height - Screen.TwipsPerPixelY
Else
MoveImage.Top = MoveImage.Top - Screen.TwipsPerPixelY
End If
Case vbKeyRight
If Shift And vbShiftMask Then
MoveImage.Width = MoveImage.Width + Screen.TwipsPerPixelX
Else
MoveImage.Left = MoveImage.Left + Screen.TwipsPerPixelX
End If
Case vbKeyDown
If Shift And vbShiftMask Then
MoveImage.Height = MoveImage.Height + Screen.TwipsPerPixelY
Else
MoveImage.Top = MoveImage.Top + Screen.TwipsPerPixelY
End If
End Select
If HitTest(MoveImage, StillImage) Then
BackColor = vbRed
Else
BackColor = vbGreen
End If
End Sub
Public Function HitTest(Image1 As Image, Image2 As Image) As Boolean
If Image2.Left + Image2.Width <= Image1.Left Then
ElseIf Image2.Left >= Image1.Left + Image1.Width Then
Else
If Image2.Top + Image2.Height <= Image1.Top Then
ElseIf Image2.Top >= Image1.Top + Image1.Height Then
Else
HitTest = True
End If
End If
End Function
Private Sub Form_Load()
Set MoveImage = Controls.Add("VB.Image", "Image1")
MoveImage.Appearance = 0
MoveImage.BorderStyle = vbFixedSingle
MoveImage.Visible = True
Set StillImage = Controls.Add("VB.Image", "Image2")
StillImage.Appearance = 0
StillImage.BorderStyle = vbFixedSingle
StillImage.Visible = True
StillImage.Move MoveImage.Left + MoveImage.Width * 2, MoveImage.Top + MoveImage.Height * 2
End Sub