рджреБрд╢реНрдорди рдПрдЕрд░ рдЗрдВрдбрд┐рдпрд╛: рдиреЗрд╡рд┐рдЧреЗрд╢рди 2 рдбреА рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд╛ рдкреАрдЫрд╛ рдХрд░рддреЗ рд╣реБрдП рдФрд░ рдП * рд░рд╛рд╕реНрддрд╛ рдкрд╛ рд░рд╣рд╛ рд╣реИ

рдРрд╕рд╛ рдЧреЗрдо рдмрдирд╛рдирд╛ рдЬрд┐рд╕рдореЗрдВ рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд╛ рдкреАрдЫрд╛ рдХрд░рдирд╛ рдкрдбрд╝реЗ? рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ - рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рджреБрд╢реНрдорди рдЪрд▓рд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЕрдЧрд░ рдпрд╣ рдПрдХ рдкреЗрдбрд╝ рдХреЗ рдкреАрдЫреЗ, рдпрд╛ рдПрдХ рджреАрд╡рд╛рд░ рдХреЗ рдХреЛрдиреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЛрддрд╛ рд╣реИ? рдЦреИрд░, рдЕрдм рджреБрд╢реНрдорди рдмрд╣реБрдд рдореВрд░реНрдЦ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ - рд╡рд╣ рдПрдХ рд╡рд╕реНрддреБ рдореЗрдВ рднрд╛рдЧ рдЬрд╛рдПрдЧрд╛, рдЬрдЧрд╣ рдореЗрдВ рдЙрдБрдЧрд▓рд┐рдпрд╛рдБ рдорд╛рд░рдирд╛ред рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ!

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк Godot ( рдпрд╣рд╛рдВ рджреЛрдиреЛрдВ рдиреЛрдбреНрд╕ рдкрд░ GDQuest рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╣реИ ) рдореЗрдВ рдирд┐рд░реНрдорд┐рдд Navigation2D рдпрд╛ AStar рдиреЛрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рд▓реЗрдХрд┐рди рд░реЛрд╖ рдХреЗ рд╣реЗрд▓реНрд╕ рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


рдХрд╛рд░реНрдп рдЕрд░реНрдЬрд┐рдд рдХрд░рдирд╛


рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рджреБрд╢реНрдорди рдХреЛ рдХрд╛рдЗрдиреЗрдореИрдЯрд┐рдХ рдмреЙрдбреА 2 рдбреА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреЗрдЯ рдорд╢реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреНрдпрд╛ рд╣реИ? рдореБрдЭреЗ рд░рд╛рдЬреНрдп рдорд╢реАрдиреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдпрд╣ рд▓реЗрдЦ рдкрд╕рдВрдж рд╣реИред рдЧреЛрдбреЛрдЯ рдореЗрдВ рд╕рд░рд▓ рд░рд╛рдЬреНрдп рдорд╢реАрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдФрд░ рд▓реЗрдЦ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

рдЖрдЗрдП рдПрдХ рдореВрд░реНрдЦ рд╢рддреНрд░реБ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЪреЗрд╕ рд░рд╛рдЬреНрдп рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬреЛ рд╕рд┐рд░реНрдл рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рдХреЗ рд▓рд┐рдП рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдХрд╣реАрдВ рдЕрдЯрдХ рдЬрд╛рддрд╛ рд╣реИ:

# ChaseState.gd

func _init(enemy, params):
  enemy.dir = (enemy.target.position - enemy.position).normalized()

func _physics_process(delta):
  var motion = enemy.dir * enemy.speed
  enemy.move_and_slide(motion)

рдЧрдВрдз рдХреЗ рдирд┐рд╢рд╛рди


рд░рд╛рдЬреНрдп рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдЪрд▓рддреЗ рд╕рдордп рдЕрдкрдиреЗ рдкрд┐рдЫрд▓реЗ рдкрджреЛрдВ рд╕реЗ рдПрдХ рдирд┐рд╢рд╛рди рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЬрдм рджреБрд╢реНрдорди рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЙрд╕рдХреЗ рдкрд┐рдЫрд▓реЗ рдкрджреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдЙрдирдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рдХреБрддреНрддреЗ рдХреЗ рдкрджрдЪрд┐рд╣реНрди рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЧрдВрдз рдкрджрдЪрд┐рд╣реНрди рдХрд╣реЗрдВрдЧреЗред

рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдВрдз рдЯреНрд░реЗрд╕ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд▓реЗрдпрд░ рдореЗрдВ рдЯрд╛рдЗрдорд░ рдиреЛрдб рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдХрд░реЗрдВ рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛_ рдЯрд╛рдЗрдо рд╕реЗрдЯ рдХрд░реЗрдВ (рд╣рдордиреЗ 0.1s рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛), рдФрд░ рдлрд┐рд░ рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ рддрд╛рдХрд┐ рдкреНрд▓реЗрдпрд░ рдХреА рдЙрд▓рдЯреА рдЧрд┐рдирддреА рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рдПрдХ рдЧрдВрдз рдЫреЛрдбрд╝ рджреЗрдВред

# Player.gd
extends KinematicBody2D

const scent_scene = preload("res://Player/Scent.tscn")

var scent_trail = []

func _ready():
  $ScentTimer.connect("timeout", self, "add_scent")

func add_scent():
  var scent      = scent_scene.instance()
  scent.player   = player
  scent.position = player.position

  Game.level.effects.add_child(scent)
  scent_trail.push_front(scent)

рдлрд┐рд░ рдЖрдкрдХреЛ рдкрд░рд┐рддреНрдпрдХреНрдд Scent.tscn рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рд╕рд░рд▓ Node2D рджреГрд╢реНрдп рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЯрд╛рдЗрдорд░ рд╣реИ рддрд╛рдХрд┐ рдЧрдВрдз рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПред

# Player.gd
extends KinematicBody2D

const scent_scene = preload("res://Player/Scent.tscn")

var scent_trail = []

func _ready():
  $ScentTimer.connect("timeout", self, "add_scent")

func add_scent():
  var scent      = scent_scene.instance()
  scent.player   = player
  scent.position = player.position

  Game.level.effects.add_child(scent)
  scent_trail.push_front(scent)

рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдЧрдВрдз рджрд┐рдЦрд╛рдИ рджреЗ, рддреЛ рдЖрдк рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ ColorRect рдиреЛрдб рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдЫрд┐рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЬрдм рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдкреАрдЫреЗ рджреМрдбрд╝ рд░рд╣рд╛ рд╣реИ рддреЛ рдЧрдВрдз рдХрд╛ рдирд┐рд╢рд╛рди рд╣реИред

рдЕрдм рд╣рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рдЦрд╝реВрди рдХреЗ рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдЬрдЧрд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рддрд╛рдХрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рди рджрд┐рдЦрдиреЗ рдкрд░ рд╡реЗ рдЗрди рдирдИ рдорд╣рдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рджреБрд╢реНрдордиреЛрдВ рдХреЗ рд▓рд┐рдП RayCast2D рдиреЛрдбреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЧреЛрдбреЛрдЯ рдореЗрдВ рднреМрддрд┐рдХреА рдкрд░рддреЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдмреАрдо рдХреЛ рдкрддрд╛ рдЪрд▓ рд╕рдХреЗ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдЯрдХрд░рд╛рд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рднреМрддрд┐рдХреА рдкрд░рддреЗрдВ


рдЧреЛрдбреЛрдЯ рдореЗрдВ рднреМрддрд┐рдХреА рдкрд░рддреЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╢реАрд░реНрд╖ рдореЗрдиреВ рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдФрд░ рдлрд┐рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдирд┐рдЪрд▓реЗ рдмрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рдкрд░рдд рдирд╛рдо рдЕрдиреБрднрд╛рдЧ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдлрд┐рд░ 2D рднреМрддрд┐рдХреА рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред


рдЙрдиреНрд╣реЗрдВ рдХреЛрдИ рднреА рдЙрдкрдпреБрдХреНрдд рдирд╛рдо рджреЗрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдЦреЗрд▓ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд╕рдВрдкрддреНрддрд┐ рдирд┐рд░реАрдХреНрд╖рдХ рд╕рд╛рдЗрдбрдмрд╛рд░ рдореЗрдВ рдЯрдХрд░рд╛рд╡ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ┬╖ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдкрд░рдд рдХреЗ рд░реВрдк рдореЗрдВ рд╕реМрдВрдкрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рднреМрддрд┐рдХ рдкрд░рддреЛрдВ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рджреБрд╢реНрдордиреЛрдВ рдХреЗ RayCast2D рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдЙрди рдкрд░рддреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреБрд╢реНрдорди рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдареЛрд╕, рд╡рд╕реНрддреБ, рдЯреЛрдХрд░рд╛, рдЫреЗрдж, рдЧреЗрдЯ_рдХреНрд▓реЛрдЬреНрдб) рд╣реИред

рднреМрддрд┐рдХреА рдкрд░рддреЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдВрддрд┐рдо рдЪрд░рдг рдЪреЗрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдирд╛ рд╣реИред

# ChaseState.gd

func _init(enemy, params):
  chase_target()

func chase_target():
  var look     = enemy.get_node("RayCast2D")
  look.cast_to = (enemy.target.position - enemy.position)
  look.force_raycast_update()

  # if we can see the target, chase it
  if !look.is_colliding():
    enemy.dir = look.cast_to.normalized()

  # or chase first scent we can see
  else:
    for scent in enemy.target.scent_trail:
      look.cast_to = (scent.position - enemy.position)
      look.force_raycast_update()

      if !look.is_colliding():
        enemy.dir = look.cast_to.normalized()
        break

func _physics_process(delta):
  var motion = enemy.dir * enemy.speed
  enemy.move_and_slide(motion)

рдЕрдм, рдЬрдм рджреБрд╢реНрдорди рдЪреЗрд╕ рд░рд╛рдЬреНрдп рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд╛рд╕реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд░ рдЙрд╕рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рддреЛ рд╡рд╣ рдЙрд╕рдХрд╛ рдкреАрдЫрд╛ рдХрд░реЗрдЧрд╛! рдЕрдЧрд░ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдХреБрдЫ рд╣реИ, рддреЛ рд╡рд╣ рдЧрдВрдз рдХреЗ рдирд┐рд╢рд╛рди рдкрд░ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд╛рд╕реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдирд╣реАрдВ рдкрд╛рддрд╛, рдФрд░ рдлрд┐рд░ - рдЙрд╕рдХрд╛ рдкреАрдЫрд╛ рдХрд░рддрд╛ рд╣реИ!


рдФрд░ рдЕрдм рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рджреБрд╢реНрдорди рдЦреВрди рдореЗрдВ рдмрджрд▓ рдЧрдПред рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреБрд╢реНрдордиреЛрдВ рдХреЗ рдмреАрдЪ рдЯрдХрд░рд╛рд╡ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рд╣реИред

All Articles