Hej...jag har suttit hela dagen idag med denna function: Den här typen av frågor är ganska svåra att svara på. Det bästa du kan göra är att lägga ut 4 labels och hela tiden visa dess värden. Sedan när du kör programmet så ser du vad som händer. Värdet på någon av dess positioner kan förändras på ett sätt som du inte tänkt på. jag använder debug print där jag skriver ut label2 left och top... Dim i As Integer den här if-satsen använde jag i en loop till ett snakespel. byt ut 'S(1)' mot 'Label2' och 'S(i)' mot 'Label(i)' och testa om den funkar för dig också. >banarne: tack för dig kod men den hjälpte inte....men buddas kod funkade.... Det är rätt bj, man lär sig inte om man inte gör det själv. Hoppas att mitt svar leder dig på rätt väg! Kanske man om några år kommer att köpa spel från bj-soft eller något sånt :-D ! hehe..=) Jag skulle föreslå en annan jämförelse. Det kräver mindre jämförelser att se om den inte krockar. Uppfylls inga av dessa så krockar det. En funktion som kapslar if-satsen: Bra skrivet Andreas! Kunde inte gjort det bättre själv (uppenbarligen!). Tack för komplimangen. Tror inte det är nån unik idé. Tack vare erfarenhet som jag lärt mig upptäckte jag det själv. Hej bj svenpon: jaha och? ett problem är till för att lösas..spela roll vilken tid det tar...tror jag lagt in 2frågor om detta....annars har jag försökt själv...jag fick en kod av trash men som nu är borta...=( Hej >Har du kollat hur game konstruktörerna gör.kolliderings fråga
Function leftallowed() As Boolean
Dim i As Integer
For i = 0 To Label1.Count - 1
If Label2.Left <= Label1(i).Left + Label1(i).Width Then
If Label2.Top < Label1(i).Top + Label1(i).Height And Label2.Top > Label1(i).Top Then
leftallowed = False
Exit Function
End If
End If
Next i
leftallowed = True
End Function
ops glömde...så här kollar jag koden:
Select Case KeyCode
Case vbKeyLeft
If leftallowed = False Then Exit Sub
Label2.Left = Label2.Left - 50
end select
label2 ska krocka med label1 som ligger i en array..därav for-loopen....
Krocken fungerar nästan...ibland stoppas label2 ibland inte...det är olika labels varje gång....alltså...första gången kanske label1(2) stoppas det..nästa gång kan jag gå igenom...
jag har frågat på chatten men dom ser inte felet....=(
/bj Sv: kolliderings fråga
En annan varian är att använda debug.print rätt frekvent och på så sätt hela tiden följa de värden som finns.
Hälsningar
/PelleSv: kolliderings fråga
men bara genom att veta left och top gör ju mig smartare eller?
eftersom label1(i) hela tiden är på samma plats..och jag kolalr ju om label2 left och top är samma som tex label1(i).left osv...
det ska ju stoppas....
nu kollar jag även i debug.print leftallowed...och det blir ju bara true eller false...ibland blev det false även om det inte var något där.....
/bj - blir tokigSv: kolliderings fråga
For i = 0 To Label1.Count - 1
If (Label2.Left <= Label1(i).Left + Label1(i).Width And Label2.Left >= Label1(i).Left) Or (Label2.Left + Label2.Width <= Label1(i).Left + Label1(i).Width And Label2.Left + Label2.Width >= Label1(i).Left) Then
If (Label2.Top >= Label1(i).Top And Label2.Top <= Label1(i).Top + Label1(i).Height) Or (Label2.Top + Label2.Height >= Label1(i).Top And Label2.Top + Label2.Height <= Label1(i).Top + Label1(i).Height) Then
leftallowed = False
Exit Function
End If
End If
Next i
leftallowed = True
End FunctionSv: kolliderings fråga
If S(1).Left + S(1).Width > S(i).Left And S(1).Left + S(1).Width < S(i).Left + S(i).Width And _
S(1).Top + S(1).Height > S(i).Top And S(1).Top + S(1).Height < S(i).Top + S(i).Height Or _
S(1).Left > S(i).Left And S(1).Left < S(i).Left + S(i).Width And _
S(1).Top + S(1).Height > S(i).Top And S(1).Top + S(1).Height < S(i).Top + S(i).Height Or _
S(1).Left = S(i).Left And S(1).Top = S(i).Top Then
jag kom inte ihåg att den var såhär lång... men den funkar har jag för mig.Sv: kolliderings fråga
tack för att ni tog er tid med mitt problem...=)
nu ska jag bara göra up,right och down också... =D
men det löser jag nog själv..=)
/bjSv: kolliderings fråga
Sv: kolliderings fråga
det blev en bugg när man har rightallowed också....buggen är att om man går på mot vänster och nuddar label1(i) då kan man inte backa...samma sak med höger...men det löser jag nog....
/bjSv: kolliderings fråga
<code>
Function Collision(NewLeft As Single, NewTop As Single, NewWidth As Single, NewHeight As Single) As Boolean
Dim Label As Label
For Each Label In Label1
If Label.Left + Label.Width < NewLeft Then
ElseIf Label.Left > NewLeft + NewWidth Then
ElseIf Label.Top + Label.Height < NewTop Then
ElseIf Label.Top > NewTop + NewHeight Then
Else
Collision = True
Exit Function
End If
Next
End Function
</code>
Har dessutom skickat upp ett utförligt exempel på hur man kan implementera det i filarean:
Programarkivet:Kollisionsdetecteringa mellan rectanglarSv: kolliderings fråga
Satt och tänkte på BJs problem och lösningen var ju att kollas om slutdestination kolliderade, inte om startpositionen kolliderade.
/BuddaSv: kolliderings fråga
Jag satt och ritade upp på ett papper vilka olika fall som kunde gälla för att kontrollera om en bokning överlappade ett annan.
Såg då at bara två fall som den inte överlappade. Om slutvärdet för perod1 var mindre än startvärdet för period2 eller om period1 startvärde var större än slutvärdet för period2.
Det krävde alltså mindre jämförelser att kontrollera om de inte kolliderade än om det gjorde det.
Men samma princip går att tillämpa. i detta fallet, fast för två dimensioner. I exemplet har jga gjort det möjligt att flytta objektet i två dimensioner samtidigt(diagonalt). Om det finns ett hinder kan man fortsätta flytta det i den andra dimensionen om den är obehindrad.Sv: kolliderings fråga
Du har snurrat runt med dina kollideringsfrågor nu snart
ett halvår, snart kolliderar du med dig själv.
SvenSv: kolliderings fråga
/bjSv: kolliderings fråga
Ja det är jätte struligt, har inte följt alla vinklingar.
men det måste bli en massa if eller case satser.
Phuuuuuuuuuuu. orkar inte
Har du kollat hur game konstruktörerna gör.
DSSv: kolliderings fråga
nope jag har knappt letat efter koder på internet...tänkte få till det själv med lite hjälp från pellesoft.nu
ett annat problem jag jobbar med då och då är bitblt som jag också ska lösa själv!!
/bj