Visual Basic 2010 Programmierung eines npc gegner mit einer Picturebox?

...komplette Frage anzeigen

3 Antworten

So habs mal zu ende geschrieben:
Jetzt sucht die PB2 die PB1 egal an welcher Stelle sie sich befinden.
Sobald die beiden PictureBoxen sich getroffen haben wird eine MsgBox ausgegeben:

    'Sourcecode by xGlumi

Public rechteKantePB1 As Integer
Public linkeKantePB1 As Integer

Public linkeKantePB2 As Integer
Public rechteKantePB2 As Integer

Public untenKantePB1 As Integer
Public obenKantePB1 As Integer

Public untenKantePB2 As Integer
Public obenKantePB2 As Integer

Private Function kollidiert() As Boolean
If rechteKantePB1 = linkeKantePB2 And obenKantePB2 <= untenKantePB1 And untenKantePB2 >= obenKantePB2 Then
Return True
ElseIf linkeKantePB1 = rechteKantePB2 And obenKantePB2 <= untenKantePB1 And untenKantePB2 >= obenKantePB2 Then
Return True
ElseIf untenKantePB1 = obenKantePB2 And rechteKantePB2 >= linkeKantePB1 And linkeKantePB2 <= rechteKantePB1 Then
Return True
ElseIf obenKantePB1 <= untenKantePB2 And linkeKantePB1 <= rechteKantePB2 And rechteKantePB1 >= rechteKantePB2 Then
Return True
ElseIf obenKantePB1 <= untenKantePB2 And untenKantePB1 >= untenKantePB2 And rechteKantePB1 >= linkeKantePB2 And linkeKantePB1 <= linkeKantePB2 Then
Return True
ElseIf obenKantePB1 <= obenKantePB2 And untenKantePB1 >= obenKantePB2 And rechteKantePB1 >= rechtekantepb2 And linkeKantePB1 <= rechteKantePB2 Then
Return True
ElseIf obenKantePB1 <= obenKantePB2 And untenKantePB1 >= obenKantePB2 And linkeKantePB1 <= linkeKantePB2 And rechteKantePB1 >= linkekantepb2 Then
Return True
Else
Return False
End If
End Function
Private Sub horizontalSearch()
If rechteKantePB1 < linkeKantePB2 Then
PictureBox2.Left -= 1
ElseIf rechteKantePB1 > linkeKantePB2 And Not linkeKantePB2 > linkeKantePB1 Then
PictureBox2.Left += 1
End If
End Sub
Private Function verticalNeed() As Boolean
If untenKantePB1 >= obenKantePB2 And obenKantePB1 <= untenKantePB2 Then
Return False
Else
Return True
End If
End Function
Private Sub vertikalSearch()
If verticalNeed() = True Then
If untenKantePB1 < obenKantePB2 Then
PictureBox2.Top -= 1
ElseIf untenKantePB1 > obenKantePB2 Then
PictureBox2.Top += 1
End If
End If
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Application.DoEvents()

rechteKantePB1 = PictureBox1.Left + PictureBox1.Width
linkeKantePB1 = PictureBox1.Left

linkeKantePB2 = PictureBox2.Left
rechteKantePB2 = PictureBox2.Left + PictureBox2.Width

untenKantePB1 = PictureBox1.Top + PictureBox1.Height
obenKantePB1 = PictureBox1.Top

untenKantePB2 = PictureBox2.Top + PictureBox2.Height
obenKantePB2 = PictureBox2.Top

horizontalSearch()
vertikalSearch()

If kollidiert() = True Then
Timer1.Stop()
MsgBox("PB1 wurde gefangen!", MsgBoxStyle.Information, "Spiel Ende")
End If
End Sub

MFG xGlumi

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von CrystalixXx
27.01.2016, 16:42

Wenn man mit den Rectangle-Objekt der PictureBox arbeitet, dann kann man mit IntersectsWith prüfen, ob eine Überschneidung vorliegt.

Application.DoEvents sollte man grundsätzlich vermeiden, weil es bei aufwändigen Codeausführungen den eigentlichen Ablauf der Anwendung stört. Sobald man an Application.DoEvents denkt, sollte man sich lieber für Multithreading entscheiden. Das ist vielleicht etwas schwieriger, aber macht die Anwendung konsistenter.

Davon abgesehen wäre es besser, würde man statt PictureBox-Steuerelemente die Rechtecke selbst zeichnen (resourcenschonender).

0

Du schreibst nicht wirklich in eine IF-Abfrage mit:

if Picturebox1.left > PictureBox1.left

Du schreibst doch auch nicht:
"WENN 1 größer als 1" ...


Wohl eher sollte es so aussehen

        Application.DoEvents()
Dim rechteKantePB1 As Integer = PictureBox1.Left + PictureBox1.Width
Dim linkeKantePB2 As Integer = PictureBox2.Left

If rechteKantePB1 < linkeKantePB2 Then
PictureBox2.Left -= 1
End If

So würde jetzt z.b die Picturebox2 (auf der Rechten Seite), die Picturebox1 (auf der Linken Seite) "jagen".


MFG xGlumi


Antwort bewerten Vielen Dank für Deine Bewertung

Du brauchst einen Timer. In diesem überprüfst du wie di Position der PB2 relativ zur PB1 ist. Wenn PB1.Left > PB1.Left dann PB2.Left = PB2.Left + 1

Das gleiche auch für kleiner und für Top statt Left.

Mit dem Interval des Timers musst bißchen rumprobieren.  Auch ob du statt 1 einen anderen Änderungswert nehmen sollst 

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von xXJessicax
27.01.2016, 09:14

wen ich aber das jetzt so reinschreibe wie du es mir gesargt hast zeigt er mir wider rum ein fehler an da es woll irgentwas falsch ist :?
PictureBox1.Left > PictureBox1.Left PictureBox2.Left = PictureBox2.Left + 1 den timer habe ich probe weiße auf 1000 gestelt

0
Kommentar von xXJessicax
27.01.2016, 09:23

und wen ichs in der if form schreibe geht es zwar aber es reagiert nicht darauf

If PictureBox1.Left > PictureBox1.Left Then
PictureBox2.Left = PictureBox2.Left + 1
PictureBox2.Left = PictureBox2.Left - 1
End If
If PictureBox1.Top > PictureBox1.Top Then
PictureBox2.Top = PictureBox2.Top + 1
PictureBox2.Top = PictureBox2.Top - 1
End If

0
Kommentar von xXJessicax
27.01.2016, 09:25

Ah okay ich habs raus okay habs :D danke ^^

0

Was möchtest Du wissen?