2015-02-17 62 views
0

我創建了NPC,可以移動您目前站立的方向。如果他們碰到什麼東西,他們永遠不會再移動。我沒有線索,已經浪費了6小時尋找故障。 這是我的布展方式:XNA Gamestudio - NPC卡在牆壁和對方(Visual Basic)

Overrides Sub Move() 

    Dim actorPosition As Vector2 
    Dim spieler As Actor 

    For Each obj As Actor In Actor.ActorList 
     If TypeOf obj Is Actor And obj.Alive And obj.ObjektTyp = "A"c Then 
      actorPosition = obj.position 
      spieler = obj 
     End If 
    Next 

    Dim difPos As Vector2 = position - actorPosition 
    normaldifpos = difPos 
    normaldifpos.Normalize() 

    If lastTimeAttack + intervallBetweenAttack1 < Game1.Game1Time Then 
     If difPos.Length < range Then 
      Select Case ObjektTyp 
       Case "Z"c 
        spieler.leben -= stärke 
       Case "H"c 
        For Each obj As Objekt In ObjList 
         If TypeOf obj Is Spells Then 
          If obj.ObjektTyp = "Z"c And obj.Alive = False Then 
           obj.position = position 
           obj.richtung = -normaldifpos 
           obj.senderE = Me 
           obj.stärke = stärke 
           obj.Alive = True 
           Exit For 
          End If 
         End If 
        Next 

      End Select 
      lastTimeAttack = Game1.Game1Time 
     End If 
    End If 

    If difPos.Length() < agroRange Then 
     If spieler IsNot Nothing And Not collide((normaldifpos + New Vector2(-4, -4) * speed)) Then 
      position = position - normaldifpos * speed 

     Else 

     End If 
    End If 

End Sub 

這我碰撞方法:

Public Overridable Function collide(vek As Vector2) As Boolean 
    Dim extrahitbox As Rectangle 
    extrahitbox = Hitbox 
    extrahitbox.X += vek.X 
    extrahitbox.Y += vek.Y 
    For Each obj As Objekt In Objekt.ObjList 
     If TypeOf obj Is Spells Or TypeOf obj Is Key Or TypeOf obj Is PowerUP Or TypeOf obj Is Coin Then 

     Else 
      If extrahitbox.Intersects(obj.Hitbox) Then 
       Return True 
      End If 

     End If 

    Next 
    For Each Act As Actor In Actor.ActorList 
     If Act IsNot Me Then 
      If extrahitbox.Intersects(Act.Hitbox) Then 
       Return True 
      Else 

      End If 
     End If 
    Next 

    If extrahitbox.X < 0 Then 
     Return True 
    ElseIf extrahitbox.Right > 1280 Then 
     Return True 
    ElseIf extrahitbox.Top < 0 Then 
     Return True 
    ElseIf extrahitbox.Bottom > 720 Then 
     Return True 
    End If 
End Function 

我將不勝感激幫助!

回答

0

從你的例子中看起來物體卡住了,因爲一旦它與其他物體發生碰撞,你不會對position進行任何更新。在確定碰撞之後,您必須計算物體在其他物體內的深度,並將其移回到之前的位置。

一種方法是在確定碰撞之後,您只是否定速度。

object.Position -= object.Velocity 
object.Velocity = new vector2(0,0) 

另一種方式是作爲速度保持相同的更準確,如果您的起源是在左上角的位置。碰撞發生後,它會將您的物體放置在其他物體的旁邊,取決於發生碰撞的位置。

If obj.Intersect(otherObj) Then 
    Dim newPos as new vector2d = obj.Position 
    if (obj.velocity.x>0) then newPos.x = otherObj.Left - obj.width 
    if (obj.velocity.x<0) then newPos.x = otherObj.right 
    obj.Position = newPos 
End If 

所以basicly是這樣

  1. 放位置臨時varialbe
  2. 檢查碰撞
  3. 如果發生碰撞設置原件溫度
+0

感謝幫助,我試過你的想法..現在他總是移植到不同的S ides ..我有一個頂部和一個底部..我沒有任何想法...如果我站着,他試圖穿過牆壁,他只是口吃。 – XBagon 2015-02-18 22:43:19