Gå til innhold

Generisk måte og finne kordinatene til alle label


Anbefalte innlegg

Halloen....

 

 

Jeg holder på å mekke en julepacman sak.. mitt problem:

 

Jeg bruker labels som vegger i spille... fant ut at det går an med enkel if kode som collition detection..

 

Hvordan kan jeg loope igjennom alle kontrollene i formen og liksom ligge konttrollen som har ordet Label i navnet inn i en array... for å så hente ut x og y senere....

 

Har prøvd men jeg klarer det ikke....

 

PLZ help me.. muchas gracis.. :innocent:

Lenke til kommentar
Videoannonse
Annonse

C#:

foreach(Control c in this.Controls)
{
 if(c.GetType() == typeof(System.Windows.Forms.Label)
 {
   System.Drawing.Rectangle r = c.Bounds;
   // koden din her
 }
}

 

VB.NET:

For Each c As Control In Me.Controls
 If c.GetType().Equals(GetType(System.Windows.Forms.Control)) Then
   Dim r As Rectangle = c.Bounds
   ' Koden din her
 End If
Next

Endret av GeirGrusom
Lenke til kommentar

takker... den delen funker... men et lite spørsmål til følgende kode:

Private Function goleft(ByVal obj As Label) As Boolean

On Error Resume Next

Dim i As Integer

Dim u As Integer = 1

Dim temp As Integer

For i = 1 To vegg.vegg.LongLength - 1

' Debug.WriteLine(i)

' Debug.WriteLine(vegg.vegg(i).Name)

'temp = vegg.vegg(i).Location.X

If i = vegg.vegg.LongLength Then

GoTo her

ElseIf i = 0 Then

GoTo her

End If

If vegg.vegg(i).Location.X + vegg.vegg(i).Width = obj.Location.X Then

If obj.Location.Y > vegg.vegg(i).Location.Y + vegg.vegg(i).Height Then

Return True

Exit Function

ElseIf obj.Location.Y + obj.Height < vegg.vegg(i).Location.Y Then

Return True

Exit Function

End If

Return False

Exit Function

End If

her:

Next

 

End Function

 

Den stopper som den skal i alt til venstre... viss jeg er on error resume next på toppen... tar jeg vekk den kommer det opp object referance not set to an instance of an objec elns

 

får beklage koden ser helt JÆVLIG ut... jobber med det

Lenke til kommentar

Goto skal en kun bruke hvis en absolut må, dette er sjeldent, og her er det strengt tatt unødvendig. grunnen til at en ikke bruker goto, er fordi koden blir utrolig uoversiktelig.

 

notater hvis du er interresert:

Din goto helt fullstendig unødvendig, den vil aldri bli kalt, og i vil aldri bli lik 0 (som det blir sjekket etter)

Du burde også bruke foreach istedet for vanlig for, for enkelhets skyld

Collision detection burde være en egen funksjon

Det er heller ikke nødvendig med Exit Function etter Return True, Exit Function burde compileren tagge som "unreachable code"

 

Public Function DoDetect() As Boolean
 Dim i As Integer
 For i = 0 To vegg.Length - 1
   If vegg.vegg(i).Bounds.Contains(obj.Location)
     Return True
   End If
 Next
 Return False
End Sub

 

Så enkelt kan det gjøres :)

Lenke til kommentar

Bruk System.Drawing.Graphics istedet, tegn i Form.OnPaint

Dropp labels, og slikt, det er tregt, pluss at det tar mye minne.

 

eksempel på hvordan det kan gjøres(Jeg ville egentlig brukt interfaces, men husker ikke hvordan de ser ut i VB.NET):

 

Public Class GameItem
 Protected m_loc As Point
 Protected m_size As Size
 Public Property Location As Point
   Get
     Return m_loc
   End Get
   Set(Value As Point)
     m_loc = Value
   End Set
 End Property
 Public Property Size As Size
   Get
     Return m_size
   End Get
   Set(value As Size)
     Return m_size
   End Set
 End Property
 Public Overridable Draw(System.Drawing.Graphics g)
   'This function should be overriden
 End Sub  
End Class

Public Class Wall
 Inherits GameItem
 Public Overrides Sub Draw(System.Drawing.Graphics g)
   g.DrawRectangle(0, 0, m_size.Width, m_size.Height)
 End Sub
End Class

Public Sub DrawAll(Items() As GameItem, g As System.Drawing.Graphics)
'Tegner alle i en array til et Graphics objekt
 Dim m As System.Drawing.Drawing2D.Matrix = g.Transform.Clone()
 For Each i As GameItem i Items
   ' Flytt objektet
   g.TranslateTransform(i.Location.X, i.Location.Y)
   i.Draw(g)
   g.Transform = m.Clone()
 Next
End Sub

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...