extends KinematicBody signal player_damaged signal player_died # export (PackedScene) var PlayerBullet var PlayerBullet = preload("res://assets/PlayerBullet.tscn") const SPEED = 18 var velocity = Vector3() var bullets var hp = 50 var damage = 0 var damaging = false export var padding = 1.7 var camera:Camera var disparea = Vector2() var btopleft = Vector3() var bbottomright = Vector3() func _ready(): hp = 50 damage = 0 damaging = false # bullets = get_tree().root.get_node("Main/PlayerBullets") bullets = $"/root/Main/PlayerBullets" init_adjust_work() #func _process(delta): # pass func _physics_process(delta): # move velocity = Vector3() if Input.is_action_pressed("ui_right"): velocity.x = 1 elif Input.is_action_pressed("ui_left"): velocity.x = -1 if Input.is_action_pressed("ui_down"): velocity.z = 1 elif Input.is_action_pressed("ui_up"): velocity.z = -1 # Do not multiply by delta when using move_and_slide() velocity = velocity.normalized() * SPEED move_and_slide(velocity) adjust_pos(padding) if not damaging: if damage > 0: hp -= damage damage = 0 if hp <= 0: hp = 0 emit_signal("player_damaged") damaging = true $DamageTimer.start() $BlinkTimer.start() func _on_ShotTimer_timeout(): var bullet = PlayerBullet.instance() var pos = Vector3(translation.x, translation.y, translation.z - 1.5) bullet.translation = pos bullets.add_child(bullet) func _on_DamageTimer_timeout(): $BlinkTimer.stop() damage = 0 damaging = false visible = true if hp <= 0: hp = 0 emit_signal("player_died") func _on_BlinkTimer_timeout(): visible = not visible func init_adjust_work(): disparea = get_disp_area() camera = get_tree().root.get_node("Main/Camera") calc_move_area(camera, disparea.x, disparea.y) # get project display width and height func get_disp_area(): var w = ProjectSettings.get_setting("display/window/size/width") var h = ProjectSettings.get_setting("display/window/size/height") return Vector2(w, h) func adjust_pos(padding): if translation.z < btopleft.z + padding: translation.z = btopleft.z + padding if translation.z > bbottomright.z - padding: translation.z = bbottomright.z - padding var zd = btopleft.z - bbottomright.z var lz = translation.z - bbottomright.z var x = lz * (-btopleft.x - bbottomright.x) / zd + bbottomright.x if translation.x > x - padding: translation.x = x - padding if translation.x < -x + padding: translation.x = -x + padding func calc_move_area(camera:Camera, w, h): var cpos:Vector3 = camera.translation var crot:Vector3 = camera.rotation_degrees var fov = camera.fov var d = (h/2) / tan(deg2rad(fov/2)) var p1 = Vector3(-w/2, h/2, -d) var p2 = Vector3(w/2, -h/2, -d) var q1:Vector3 = _get_border(p1, -crot.x, -cpos.y, cpos.z) var q2:Vector3 = _get_border(p2, -crot.x, -cpos.y, cpos.z) btopleft = q1 bbottomright = q2 if false: print("topleft = (%f, %f, %f)" % [q1.x, q1.y, q1.z]) print("bottomright = (%f, %f, %f)" % [q2.x, q2.y, q2.z]) func _get_border(p:Vector3, rotx, y, cz): var v2:Vector2 = _get_rot_pos(p.z, p.y, rotx) var pr = Vector3(p.x, v2.y, v2.x) var x = y * pr.x / pr.y var z = y * pr.z / pr.y + cz return Vector3(x, 0, z) func _get_rot_pos(x, y, ang): var a = deg2rad(ang) var xr = x * cos(a) - y * sin(a) var yr = x * sin(a) + y * cos(a) return Vector2(xr, yr)