Facebook
From x-dfo, 1 Year ago, written in Python.
Embed
Download Paste or View Raw
Hits: 115
  1. extends Node2D
  2.  
  3. const DragPoly2DScene = preload("res://DragPoly2D.tscn")
  4. # export(NodePath) onready var dottedLineNode = get_node(dottedLineNode) as Node
  5. export(PackedScene) var dottedLineScene
  6. var dottedLineSceneInstance
  7. var doOnce = false
  8. var leftMouseDragging = false
  9. var startDragPos = Vector2()
  10. var startScreenPos = Vector2()
  11. var dragRatio = 1
  12. var startDragNode
  13. var endDragNode
  14. var polyWidth = 10.0
  15. var polyPoints = [PoolVector2Array()]
  16. var centerPolyPt = Vector2()
  17. var dragPolyInstance : DragPoly2D
  18. var dragPolySceneArray = [DragPoly2D]
  19. var dragPolyCounter = 0
  20.  
  21.  
  22.  
  23. # Declare member variables here. Examples:
  24. # var a = 2
  25. # var b = "text"
  26.  
  27.  
  28. # Called when the node enters the scene tree for the first time.
  29. func _ready():
  30.         set_process_input(true)
  31.        
  32.         pass # Replace with function body.
  33.         dottedLineSceneInstance = dottedLineScene.instance()
  34.         startDragNode = $StartPos
  35.         endDragNode = $EndPos
  36.  
  37. func _draw():
  38.         #var points = PoolVector2Array()
  39.         var colour = PoolColorArray()
  40.         colour = [Color(0.5,0.5,0.5,1.0)]
  41.         if polyPoints.size() > 0:
  42.                 draw_polygon(polyPoints,colour)
  43.                 print("drawing!")
  44.         # colour = [Color(slider.value,1,1,1)]
  45.        
  46.  
  47. func _process(_delta):
  48.         pass
  49.         # if !doOnce:
  50.         #       print(dottedLineSceneInstance.SayHi())
  51.         #       doOnce = true
  52.        
  53. func _input(event):
  54.         if event.is_action("Click"):
  55.                 if event.is_pressed():
  56.                         startDragPos = event.position
  57.                         startDragNode.position = startDragPos
  58.                         startScreenPos = position
  59.                         leftMouseDragging = true
  60.                         dottedLineSceneInstance.SetFrom(startDragNode.position)
  61.  
  62.                 else:
  63.                         # create a new instance of dragPoly2D
  64.                         # append it to the dragPolySceneArray
  65.                         # modify the dragPolySceneArray[dragPolyCounter].shape
  66.                        
  67.                         dragPolySceneArray.append(CreateDragPolyInstanceAndAddAsChild())
  68.                        
  69.                         dragPolySceneArray[dragPolyCounter].set_shape(polyPoints)
  70.                         print(str(dragPolySceneArray[dragPolyCounter].get_collision_layer()))
  71.                         update()
  72.                         leftMouseDragging = false
  73.                         startDragPos = Vector2()
  74.                         startScreenPos = Vector2()
  75.                         centerPolyPt = Vector2()
  76.                         polyPoints = [PoolVector2Array()]
  77.                 #dottedLineSceneInstance.SetFrom(Vector2())
  78.                 #dottedLineSceneInstance.SetTo(Vector2())
  79. # mouse release click...
  80.         elif event.is_action("AltClick"):
  81.                 if event.is_pressed():
  82.                         #spawn rock at mouse position
  83.                         var rock = $TestBoulder.duplicate()
  84.                         add_child(rock)
  85.                         rock.set_global_position(event.position)
  86.                         print(str(rock.get_collision_mask()))
  87.                
  88. # dragging with mouse...
  89.         elif event is InputEventMouseMotion and leftMouseDragging:
  90.                 var dragVector = Vector2()
  91.                 var perpLeftVector = Vector2()
  92.                 var perpRightVector = Vector2()
  93.                 var startPolyPArray = []
  94.                 var endPolyPArray = []
  95.                 var combinedPolyPArray = []
  96.                
  97.                 endDragNode.position = event.position
  98.                 dragVector = GetDragVector(startDragNode.position, endDragNode.position)
  99.                 perpLeftVector = GetCCWPerpendicularVector(dragVector)
  100.                 perpRightVector = GetCWPerpendicularVector(dragVector)
  101.                 #dottedLineSceneInstance.SetTo(endDragNode.position)
  102.                 startPolyPArray = CalcStartingPolyPoints(perpLeftVector,perpRightVector, startDragNode.position)
  103.                 endPolyPArray = CalcEndPolyPoints(perpLeftVector,perpRightVector,endDragNode.position)
  104.                 combinedPolyPArray = startPolyPArray + endPolyPArray
  105.                 # var unsortedArray = combinedPolyPArray
  106.                 # for p in unsortedArray.size():
  107.                 #       print("unsorted array + " + str(unsortedArray[p]))
  108.                
  109.                
  110.                 centerPolyPt = CalcCenterPoint((combinedPolyPArray))
  111.                 combinedPolyPArray.sort_custom(self, "SortPointsCCW")
  112.                 # for p in combinedPolyPArray.size():
  113.                 #       print("sorted array + " + str(combinedPolyPArray[p]))
  114.                 polyPoints = combinedPolyPArray
  115.                 #_draw()
  116.                 update()
  117.                 # print(str(CalcCenterPoint(polyArray)))
  118.                 # for p in polyArray.size():
  119.                 #       print("whole array " + str(polyArray[p]))
  120.                 #dottedLineSceneInstance.DoDashedLineUpdate()
  121.  
  122.                 # this is for camera position
  123.                 # position = GetPosition(event)
  124.                 pass
  125.  
  126. func CreateDragPolyInstanceAndAddAsChild():
  127.         var m_dragPolyInstance = DragPoly2DScene.instance()
  128.         add_child(m_dragPolyInstance)
  129.         dragPolyCounter += 1
  130.         return m_dragPolyInstance
  131.  
  132. func GetPosition(eventVar) -> Vector2:
  133.         # return zoom * ((mouseStartPos - eventVar.position) * dragRatio) + screenStartPosition
  134.         return (startDragPos - eventVar.position) * dragRatio + startScreenPos
  135.  
  136. func GetDragVector(startPos, endPos) -> Vector2:
  137.         return endPos - startPos
  138.  
  139. func GetCWPerpendicularVector(vectorFromDrag) -> Vector2:
  140.         var v = vectorFromDrag
  141.         # rotate right (clockwise)
  142.         return Vector2(-v.y, v.x).normalized()
  143.  
  144. func GetCCWPerpendicularVector(vectorFromDrag) -> Vector2:
  145.         var v = vectorFromDrag
  146.         # rotate left (counter-clockwise)
  147.         return Vector2(v.y, -v.x).normalized()
  148.  
  149. func CalcStartingPolyPoints(leftVec,rightVec, startPos) -> PoolVector2Array:
  150.         var startPolyPArray = []
  151.         var p1 = startPos + (leftVec * polyWidth)
  152.         var p2 = startPos + (rightVec * polyWidth)
  153.         startPolyPArray.push_back(p1)
  154.         startPolyPArray.push_back(p2)
  155.        
  156.         # for p in startPolyPArray.size():
  157.         #       print(str(startPolyPArray[p]))
  158.         return startPolyPArray
  159.  
  160. func CalcEndPolyPoints(leftVec,rightVec,endPos) -> PoolVector2Array:
  161.         var endPolyPArray = []
  162.         var p1 = endPos + (leftVec * polyWidth)
  163.         var p2 = endPos + (rightVec * polyWidth)
  164.         endPolyPArray.push_back(p1)
  165.         endPolyPArray.push_back(p2)
  166.  
  167.         # for p in endPolyPArray.size():
  168.         #       print("end points " + str(endPolyPArray[p]))
  169.         return endPolyPArray
  170.  
  171. func CalcCenterPoint(pointArray) -> Vector2:
  172.         var totalX = 0
  173.         var totalY = 0
  174.  
  175.         for p in pointArray.size():
  176.                 totalX += pointArray[p].x
  177.                 totalY += pointArray[p].y
  178.  
  179.         var centerX = totalX / pointArray.size()
  180.         var centerY = totalY / pointArray.size()
  181.         return Vector2(centerX, centerY)
  182.  
  183. func SortPointsCCW(a, b):
  184.         return (a - centerPolyPt).angle() > (b - centerPolyPt).angle()
  185.        
captcha