123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- extends KinematicBody2D
- var Pheromone = preload("res://pheromone.tscn")
- var tileSet = preload("res://main_tileset.tres")
- var pheromoneSet = preload("res://pheromones_tileset.tres")
- onready var PheromoneMap := .get_parent().get_node("Pheromones")
- onready var PheromoneMeta := .get_parent().get_node("PheromoneMeta")
- onready var tilemap := .get_parent().get_node("TileMap")
- var pheromoneSensivity = 1
- var lastDrop = 0
- var dropIntervall = 0.5
- # Declare member variables here. Examples:
- var maxSpeed := 1
- var speed := 0.0
- var accel := 0.1
- var move := true
- var vel := Vector2.UP
- var targetVel := Vector2.UP
- var closeToHome := 0.0
- var maxDepth := 10
- var depth := 0
- var oldTilePos : Vector2
- var oldPherTilePos : Vector2
- var mode = "search" # goHome
- var pheromoneMode = "search" # food
- var escapingWall := false
- # Called when the node enters the scene tree for the first time.
- func _ready():
- .set_meta('kind',"ant")
- rotation = Vector2.UP.angle_to(vel)
- lastDrop = OS.get_unix_time()
- oldTilePos = PheromoneMap.world_to_map(position)
- .get_node("target").add_point(Vector2())
- .get_node("target").add_point(targetVel)
- .get_node("vel").add_point(Vector2())
- .get_node("vel").add_point(vel)
-
- func _process(delta):
- get_node("sensivity").value=pheromoneSensivity*100
- get_node("close2home").value=closeToHome*100
- get_node("mode").text=mode
- if not escapingWall:
- _regenererateSensivity()
- var tilepos = tilemap.world_to_map(position)
- if oldTilePos != tilepos:
- _examine_new_tile(tilepos)
- oldTilePos = tilepos
- var pherTilePos = PheromoneMap.world_to_map(position)
- if oldPherTilePos != pherTilePos:
- if escapingWall:
- pass
- else:
- dropPheromone(oldPherTilePos)
- #_apply_pheromone(pherTilePos)
- oldPherTilePos = pherTilePos
- _draw_lines()
- closeToHome = closeToHome * 0.999
- if mode != "goHome" and closeToHome < 0.1:
- mode = "goHome"
- if speed < maxSpeed:
- speed += accel
- rotation = Vector2.UP.angle_to(vel)
- func _apply_pheromone(pherTilePos):
- if PheromoneMap.get_cellv(pherTilePos) == pheromoneSet.find_tile_by_name("search"):
- var dir = PheromoneMeta.getDir(pherTilePos)
- targetVel = targetVel.rotated(targetVel.angle_to(dir)) * PheromoneMeta.get_intensity(pherTilePos) * pheromoneSensivity * 0.5
- targetVel=targetVel.normalized()
- pheromoneSensivity -= 0.1
- func _draw_lines():
- .get_node("target").set_point_position(1, targetVel*100)
- .get_node("vel").set_point_position(1, vel*100)
- func _examine_new_tile(tilepos):
- var cell = tilemap.get_cellv(tilepos)
- var CellName = tileSet.tile_get_name(cell)
- escapingWall = false
- if CellName == "":
- return
- elif CellName == "wall":
- if not escapingWall:
- _on_wall()
- escapingWall = true
- elif CellName == "hill":
- _on_home()
- elif CellName == "food":
- _on_food()
- print(CellName)
- func _on_wall():
- targetVel = -vel
- pheromoneSensivity = 0.0
- speed = 0.1
-
- func _on_food():
- mode = "goHome"
- pheromoneMode = "food"
- func _on_home():
- closeToHome=1
- mode = "search"
- pheromoneMode = "search"
- func dropPheromone(tilepos):
- var cell = PheromoneMap.set_cellv(tilepos, pheromoneSet.find_tile_by_name(mode))
- var newpher = Pheromone.instance()
- newpher.tilePos = oldPherTilePos
- newpher.dir = vel.normalized()
- newpher.type = pheromoneMode
- newpher.closeToHome = closeToHome
- .get_parent().get_node("PheromoneMeta").addPheromone(newpher)
-
-
- #var ph = Pheromone.instance()
- #ph.set_meta("creator", name)
- #ph.set_meta('type',pheromoneMode)
- #if pheromoneMode == "search":
- # ph.closeToHome = closeToHome
- #ph.position = position
- #ph.rotation = rotation
- #get_parent().add_child(ph)
- #lastDrop = OS.get_unix_time()
- func _regenererateSensivity():
- if pheromoneSensivity < 1:
- pheromoneSensivity += pheromoneSensivity*0.01
- func _apply_targetVel():
- targetVel = targetVel.rotated(deg2rad(randi()%4 -1.5))
- var targetAngle = Vector2.UP.angle_to(targetVel)
- var velAngle = Vector2.UP.angle_to(vel)
- vel = vel.rotated((targetAngle - velAngle)*0.1)
- func _physics_process(delta):
- if move:
- _apply_targetVel()
- position = position + vel*speed
- #var collision = move_and_collide(vel*speed, true, true, true)
- #if collision:
- # #_handle_Collition(collision)
- # _apply_targetVel()
- # position = position + vel*speed
- #else:
- # _apply_targetVel()
- # move_and_collide(vel*speed)
- func _handle_Collition(collision):
- depth += 1
- if depth >= maxDepth:
- return false
- if not collision.local_shape.name == "CollisionShapeFront":
- collision = move_and_collide(collision.remainder)
- if collision:
- _handle_Collition(collision)
- var colliderName = collision.collider.name
- if collision.collider.name == "TileMap":
- var cell = tilemap.get_cellv(tilemap.world_to_map(collision.position))
- colliderName = collision.collider.tile_set.tile_get_name(cell)
-
- if colliderName == "wall":
- speed = 0.1
- #print("before", vel, targetVel)
- #var angle = collision.get_normal().angle_to(-vel)
- #print(rad2deg(angle))
- targetVel = Vector2()#vel.bounce(collision.get_normal())
- vel = Vector2()
- #print("after", vel, targetVel)
- #elif collision.collider.get_meta('kind') == "pheromone" and not collision.collider.get_meta("creator") == name and pheromoneSensivity > 0.5:
- # if mode == "search":
- # if collision.collider.get_meta('type') == "search":
- # targetRot += (collision.collider.rotation-targetRot) * collision.collider.intensity * pheromoneSensivity * 0.5
- # pheromoneSensivity -= 0.1
- # elif collision.collider.get_meta('type') == "food":
- # targetRot += (collision.collider.rotation-targetRot)
- # rotate(180)
- # elif mode == "goHome" and collision.collider.closeToHome > closeToHome:
- # if collision.collider.get_meta('type') == "search":
- # setRotation(collision.collider.rotation)
- # if collision.collider.get_meta('type') == "search":
- # rotate(180)
- # closeToHome = collision.collider.closeToHome
- # if collision.collider.get_meta('type') == "food":
- # pass
- #targetRot += (collision.collider.rotation-targetRot)
-
- #rotateRad( (rotation - collision.collider.rotation) * collision.collider.intensity )
- #rotation = collision.collider.rotation
- #vel = Vector2.UP.rotated(rotation)
- #self.position = self.position + collision.get_remainder()
- elif colliderName == "hill":
- _on_home()
- elif colliderName == "food":
- _on_food()
- #elif collision.collider.get_meta('kind') == "ant":
- # return
- #rotate(randi()%4 -1.5)
|