рджреЛ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдореБрдЭреЗ рдПрдХреНрдЯреАрд╕реНрдХреНрд░рд┐рдкреНрдЯрд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдРрд╢ рдкрд░ рдЧреЗрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрднреБрдд рд░реВрдкрд░реЗрдЦрд╛ рдорд┐рд▓реА рдереА (рд▓рдЧрднрдЧ рдЙрд╕рд╕реЗ рдорд┐рд▓рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд┐рд╕реА рднреА рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛ред рдФрд░ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж, рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдорд╡рд░реНрдХ рдкреЛрд░реНрдЯ рдереЗ - рд▓реЗрдЦрди рдХреЗ рд╕рдордп, 7 рд╣реИрдВ рдЯреБрдХрдбрд╝реЗ)ред рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП, рд░реВрд╕реА рднрд╛рд╖реА рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рдЦреЛрдЬ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдереА, рдЬрдм рддрдХ рдХрд┐ рдореИрдВ
рд╣реИрдмреЗ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рд╕реЗ рдЖрдЧреЗ рдирд╣реАрдВ рдерд╛ред рдЕрдм рдореИрдВ
рдРрд╢ рдПрдВрдЯрд┐рдЯреА рд╕рд┐рд╕реНрдЯрдо рдврд╛рдВрдЪреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рдЕрдкреВрд░рдгреАрдп
рдкрд░рд┐рдорд┐рдд рд╕реНрдЯреЗрдЯ рдорд╢реАрди рдкреИрдЯрд░реНрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдиреЛрдЯ: рдореИрдВ
рдЗрдХрд╛рдИ рдкреНрд░рдгрд╛рд▓реА рдврд╛рдВрдЪреЗ (ES рдврд╛рдВрдЪреЗ) рд╕реЗ рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдмрдбрд╝рд╛ рдХрд░реВрдВрдЧрд╛ - рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╕реНрдкрд╖реНрдЯрддрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП:
рд╕рд┐рд╕реНрдЯрдо , рдШрдЯрдХ,
рдиреЛрдб ,
рдЗрдХрд╛рдИрдРрд╢ рдПрдВрдЯрд┐рдЯреА рд╕рд┐рд╕реНрдЯрдо рдврд╛рдВрдЪреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдорд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрди рдкреИрдЯрд░реНрди
рдкрд░рд┐рдорд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрдиреЗрдВ (рдПрдлрдПрд╕рдПрдо) рдЦреЗрд▓ рджреЗрд╡ рдореЗрдВ рдореБрдЦреНрдп рдирд┐рд░реНрдорд╛рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЧреЗрдо рдХреЗ рджреМрд░рд╛рди, рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ рдмрд╛рд░-рдмрд╛рд░ рдЕрдкрдиреЗ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрди рд░рд╛рдЬреНрдпреЛрдВ рдХрд╛ рдкреНрд░рднрд╛рд╡реА рдкреНрд░рдмрдВрдзрди рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
ES рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ FSM рдХреЗ рд╕рд╛рде рдХрдард┐рдирд╛рдИ рдХреЛ рдПрдХ рд╡рд╛рдХреНрдп рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - FSM ES рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреЛрдИ рднреА ES рдлреНрд░реЗрдорд╡рд░реНрдХ рдПрдХ рдбреЗрдЯрд╛-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░рддрд┐рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЧреЗрдо рдЗрдХрд╛рдЗрдпрд╛рдВ OOP рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдПрдирдХреЛрдб рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рдПрдлрдПрд╕рдПрдо рдпрд╛ рдЗрд╕рдХреЗ рд╡реЗрд░рд┐рдПрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред рд╕рднреА рдбреЗрдЯрд╛ рдЕрд╡рдпрд╡реЛрдВ рдореЗрдВ рд╣реИ, рд╕рднреА рддрд░реНрдХ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╣реИрдВред
рдпрджрд┐ рдХреБрдЫ рд░рд╛рдЬреНрдп рд╣реИрдВ рдпрд╛ рд╡реЗ рд╕рд░рд▓ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрдВрджрд░ рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ
рд╕реНрд╡рд┐рдЪ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдЗрд╕ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдЦреЗрд▓ рдЗрдХрд╛рдИ (рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕рдВрд▓рдЧреНрди) рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред
рд╕реНрдЯрд┐рдХ рдЯреЗрдирд┐рд╕ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп
, рдореБрдЭреЗ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдЗрди рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд╛ рдХреНрд░рдо рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдерд╛ ...
- рдкрд░реЛрд╕рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░реЗрдВ
- рджрд╛рдЦрд┐рд▓ рд╢реБрд░реВ
- рдЧреЗрдВрдж рдлреЗрдВрдХ рджреЛ
- рд╕реНрд╡рд┐рдВрдЧ рд░реИрдХреЗрдЯ
- рдЧреЗрдВрдж рдорд╛рд░реЛ
- рд╣рдбрд╝рддрд╛рд▓ рдкреВрд░реНрдг рдХрд░рдирд╛
- рдЕрдЪреНрдЫреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╛рдирд╛
- рдЧреЗрдВрдж рдкрд░ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
- рдЕрд╡рд░реЛрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЗрдВрдж рдЪрд▓рддреА
- рд╕реНрд╡рд┐рдВрдЧ рд░реИрдХреЗрдЯ
- рдЧреЗрдВрдж рдорд╛рд░реЛ
- рд╣рдбрд╝рддрд╛рд▓ рдкреВрд░реНрдг рдХрд░рдирд╛
- рдЕрдЪреНрдЫреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╛рдирд╛
- рдЧреЗрдВрдж рдкрд░ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
- рдЖрджрд┐
рд╕реНрдЯрд┐рдХ рдЯреЗрдирд┐рд╕ рдПрдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдФрд░ рдореИрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдирд╣реАрдВ рджрд┐рдЦрд╛ рд╕рдХрддрд╛, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдореИрдВ рдХреБрдЫ рд╕рд░рд▓ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдгрдЖрдЗрдП рдПрдХ рдЦреЗрд▓ рдЪрд░рд┐рддреНрд░ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ - рдПрдХ рдЧрд╛рд░реНрдбред рдЧрд╛рд░реНрдб рдХреБрдЫ рдорд╛рд░реНрдЧ рдкрд░ рдЧрд╢реНрдд рдХрд░рддрд╛ рд╣реИ, рдзреНрдпрд╛рди рд╕реЗ рдЪрд╛рд░реЛрдВ рдУрд░ рджреЗрдЦ рд░рд╣рд╛ рд╣реИред рдЬрдм рдХрд┐рд╕реА рджреБрд╢реНрдорди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЙрд╕ рдкрд░ рд╣рдорд▓рд╛ рдХрд░рддрд╛ рд╣реИред
рдкрд╛рд░рдВрдкрд░рд┐рдХ рдУрдУрдкреА-рдЙрдиреНрдореБрдЦ рдПрдлрдПрд╕рдПрдо рдореЗрдВ, рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред
public class PatrolState { private var guard : Character; private var path : Vector.<Point>; public function PatrolState( guard : Character, path : Vector.<Point> ) { this.guard = guard; this.path = path; } public function update( time : Number ) : void { moveAlongPath( time ); var enemy : Character = lookForEnemies(); if( enemy ) { guard.changeState( new AttackState( guard, enemy ) ); } } }
public class AttackState { private var guard : Character; private var enemy : Character; public function AttackState( guard : Character, enemy : Character ) { this.guard = guard; this.enemy = enemy; } public function update( time : Number ) : void { guard.attack( enemy ); if( enemy.isDead ) { guard.changeState( new PatrolState( guard, PatrolPathFactory.getPath( guard.id ) ); } } }
рдПрдВрдЯрд┐рдЯреА рд╕рд┐рд╕реНрдЯрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ, рд╣рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдкрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕реА рд╕рдордп, рдПрдлрдПрд╕рдПрдо рдХрд╛ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрдд, рдЬрд╣рд╛рдВ рдХрдИ рд╕рдорд╛рди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЬрдм рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░рд╛рдЬреНрдп рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддрдм рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдИрдПрд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдПрдлрдПрд╕рдПрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
public class PatrolSystem extends ListIteratingSystem { public function PatrolSystem() { super( PatrolNode, updateNode ); } private function updateNode( node : PatrolNode, time : Number ) : void { moveAlongPath( node ); var enemy : Enemy = lookForEnemies( node ); if( enemy ) { node.entity.remove( Patrol ); var attack : Attack = new Attack(); attack.enemy = enemy; node.entity.add( attack ); } } }
public class AttackSystem extends ListIteratingSystem { public function AttackSystem() { super( AttackNode, updateNode ); } private function updateNode( node : PatrolNode, time : Number ) : void { attack( node.entity, node.attack.enemy ); if( node.attack.enemy.get( Health ).energy == 0 ) { node.entity.remove( Attack ); var patrol : Patrol = new Patrol(); patrol.path = PatrolPathFactory.getPath( node.entity.name ); node.entity.add( patrol ); } } }
PatrolSystem рд╕рдВрд░рдХреНрд╖рдХ рдЪрд░рд┐рддреНрд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ рдпрджрд┐
PatrolComponent Component рдХреЛ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░
AttakSystem рд╣рдорд▓рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ рдпрджрд┐
AttackComponent Component рдХреЛ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрди рдЕрд╡рдпрд╡реЛрдВ рдХреЛ рдмрджрд▓рдХрд░, рд╣рдо рдЧрд╛рд░реНрдб рдЪрд░рд┐рддреНрд░ рдХреЗ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпреЗ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдФрд░ рдиреЛрдбреНрд╕ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдВрдЧреЗ ...
public class Patrol { public var path : Vector.<Point>; } public class Attack { public var enemy : Entity; } public class Position { public var point : Point; } public class Health { public var energy : Number; } public class PatrolNode extends Node { public var patrol : Patrol; public var position : Position; } public class AttackNode extends Node { public var attack : Attack; }
рдЗрд╕рд▓рд┐рдП, рд╕рд╛рд░ рдХреЗ рдЕрд╡рдпрд╡реЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП, рд╣рдо рд╕рд╛рд░ рдФрд░ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдзреНрдпрд╛рди рднрдВрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдгрдпрд╣рд╛рдВ рдореИрдВ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд░реВрдВрдЧрд╛, рдЦреЗрд▓
рдХреНрд╖реБрджреНрд░рдЧреНрд░рд╣ рдЙрджрд╛рд╣рд░рдг рдЦреЗрд▓ рд╕реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐
рдРрд╢ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд░рд╛рдЬреНрдп рдЬреЛрдбрд╝рдирд╛ рдерд╛ - рдЬрд╣рд╛рдЬ рдХреА рдореГрддреНрдпреБред рдореГрддреНрдпреБ рдХреЗ рд╕рдордп рдХреЗрд╡рд▓ рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдЗрд╕рдХреЗ рд╡рд┐рдирд╛рд╢ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдПрдиреАрдореЗрд╢рди рджрд┐рдЦрд╛рддрд╛ рд╣реВрдВред рдЬрдм рдореИрдВ рдЗрд╕ рдПрдиреАрдореЗрд╢рди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдЦрд┐рд▓рд╛рдбрд╝реА рдЬрд╣рд╛рдЬ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реИ, рдФрд░ рдЬрд╣рд╛рдЬ рд╕реНрд╡рдпрдВ рдЕрдиреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдЯрдХрд░рд╛рд╡ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИред
рдЗрд╕рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдЬрд╣рд╛рдЬ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА:
- рдЬрд╣рд╛рдЬ рдЬрд┐рдВрджрд╛ рд╣реИ
- рдПрдХ рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ
- рдЦрд┐рд▓рд╛рдбрд╝реА рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
- рдЦрд┐рд▓рд╛рдбрд╝реА рдЕрдкрдиреА рдмрдВрджреВрдХреЛрдВ рдХреЛ рдЧреЛрд▓реА рдорд╛рд░ рд╕рдХрддрд╛ рд╣реИ
- рдЬрд╣рд╛рдЬ рдХреНрд╖реБрджреНрд░рдЧреНрд░рд╣реЛрдВ рд╕реЗ рдЯрдХрд░рд╛ рд╕рдХрддрд╛ рд╣реИ
- рдЬрд╣рд╛рдЬ рдорд░ рдЪреБрдХрд╛ рд╣реИ
- рдЕрдВрддрд░рд┐рдХреНрд╖ рдореЗрдВ рдмрд╣рддрд╛ рдорд▓рдмреЗ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ
- рдЦрд┐рд▓рд╛рдбрд╝реА рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛
- рдЦрд┐рд▓рд╛рдбрд╝реА рдЕрдкрдиреА рдмрдВрджреВрдХреЗрдВ рдирд╣реАрдВ рдорд╛рд░ рд╕рдХрддрд╛
- рдЬрд╣рд╛рдЬ рдХреНрд╖реБрджреНрд░рдЧреНрд░рд╣реЛрдВ рд╕реЗ рдирд╣реАрдВ рдЯрдХрд░рд╛ рд╕рдХрддрд╛
- рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдХреЗ рдмрд╛рдж рдЬрд╣рд╛рдЬ рдХреЛ рдЦреЗрд▓ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рд╕рдВрдмрдВрдзрд┐рдд рдХреЛрдб рдЬрд╣рд╛рдВ рдЬрд╣рд╛рдЬ рдорд░ рдЬрд╛рддрд╛ рд╣реИ рд╡рд╣
CollisionSystem рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рджреВрд╕рд░реЗ рд░рд╛рдЬреНрдп рдХреЗ рдмрд┐рдирд╛, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
for ( spaceship = spaceships.head; spaceship; spaceship = spaceship.next ) { for ( asteroid = asteroids.head; asteroid; asteroid = asteroid.next ) { if ( Point.distance( asteroid.position.position, spaceship.position.position ) <= asteroid.position.collisionRadius + spaceship.position.collisionRadius ) { creator.destroyEntity( spaceship.entity ); break; } } }
рдХреЛрдб рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЬрд╣рд╛рдЬ рдПрдХ рдХреНрд╖реБрджреНрд░рдЧреНрд░рд╣ рд╕реЗ рдЯрдХрд░рд╛рдпрд╛ рдерд╛, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЬрд╣рд╛рдЬ рдХреЛ рдЦреЗрд▓ рд╕реЗ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░,
GameManager рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ рдЬрдм рдЦреЗрд▓ рдореЗрдВ рдХреЛрдИ рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рд╕рднреА "рдЬреАрд╡рди" рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ - рдЦреЗрд▓ рдХрд╛ рдЕрдВрддред рддреЛ - рдмрд╕ рдЬрд╣рд╛рдЬ рдХреЛ рдЦреЗрд▓ рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рд░рд╛рдЬреНрдп рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ - рдЙрдбрд╝рд╛рди рдорд▓рдмреЗ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдЖрдЗрдП рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ ...
рд╣рдо
рд╕реНрдкреЗрд╕рд╢рд┐рдк рдЗрдХрд╛рдИ рд╕реЗ рдХреЗрд╡рд▓
MotionControls рдФрд░
GunControls рдШрдЯрдХреЛрдВ рдХреЛ рд╣рдЯрд╛рдХрд░ рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рде рд╣реА, рд╣рдореЗрдВ
рдореЛрд╢рди рдФрд░
рдЧрди рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЛ рд╣рдЯрд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрднреА рднреА рдЙрдкрдпреБрдХреНрдд рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╛рдиреА рд╣рдо рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдмрджрд▓рддреЗ рд╣реИрдВ:
for ( spaceship = spaceships.head; spaceship; spaceship = spaceship.next ) { for ( asteroid = asteroids.head; asteroid; asteroid = asteroid.next ) { if ( Point.distance( asteroid.position.position, spaceship.position.position ) <= asteroid.position.collisionRadius + spaceship.position.collisionRadius ) { spaceship.entity.remove( MotionControls ); spaceship.entity.remove( Motion ); spaceship.entity.remove( GunControls ); spaceship.entity.remove( Gun ); break; } } }
рдлрд┐рд░ рд╣рдореЗрдВ рдЬрд╣рд╛рдЬ (рдорд▓рдмреЗ рдХреЗ рд▓рд┐рдП) рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рдЯрдХрд░рд╛рд╡ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
for ( spaceship = spaceships.head; spaceship; spaceship = spaceship.next ) { for ( asteroid = asteroids.head; asteroid; asteroid = asteroid.next ) { if ( Point.distance( asteroid.position.position, spaceship.position.position ) <= asteroid.position.collisionRadius + spaceship.position.collisionRadius ) { spaceship.entity.remove( MotionControls ); spaceship.entity.remove( Motion ); spaceship.entity.remove( GunControls ); spaceship.entity.remove( Gun ); spaceship.entity.remove( Collision ); spaceship.entity.remove( Display ); spaceship.entity.add( new Display( new SpaceshipDeathView() ) ); break; } } }
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдЕрд╡рдзрд┐ рдХреЗ рдмрд╛рдж рдЬрд╣рд╛рдЬ рдХреЗ рдорд▓рдмреЗ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдирдИ рдкреНрд░рдгрд╛рд▓реА рдФрд░ рдШрдЯрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
public class DeathThroes { public var countdown : Number; public function DeathThroes( duration : Number ) { countdown = duration; } } public class DeathThroesNode extends Node { public var death : DeathThroes; } public class DeathThroesSystem extends ListIteratingSystem { private var creator : EntityCreator; public function DeathThroesSystem( creator : EntityCreator ) { super( DeathThroesNode, updateNode ); this.creator = creator; } private function updateNode( node : DeathThroesNode, time : Number ) : void { node.death.countdown -= time; if ( node.death.countdown <= 0 ) { creator.destroyEntity( node.entity ); } } }
рд╣рдо рдЧреЗрдо рдореЗрдВ
рдбреЗрдердЯреНрд░реЙрд╕реЗрд╕ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рд╕рд╣реА рд╕рдордп рдкрд░ рдпрд╣ рдПрдВрдЯрд┐рдЯреА рдХреЗ "рдореМрдд" рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдЧрд╛ред рдпрд╣ рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рди рдХреЗ рд╕рд╛рд░ рдореЗрдВ
рдбреЗрдердЯреНрд░реЛрдЬрд╝ рдШрдЯрдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред
for ( spaceship = spaceships.head; spaceship; spaceship = spaceship.next ) { for ( asteroid = asteroids.head; asteroid; asteroid = asteroid.next ) { if ( Point.distance( asteroid.position.position, spaceship.position.position ) <= asteroid.position.collisionRadius + spaceship.position.collisionRadius ) { spaceship.entity.remove( MotionControls ); spaceship.entity.remove( Motion ); spaceship.entity.remove( GunControls ); spaceship.entity.remove( Gun ); spaceship.entity.remove( Collision ); spaceship.entity.remove( Display ); spaceship.entity.add( new Display( new SpaceshiopDeathView() ) ); spaceship.entity.add( new DeathThroes( 5 ) ); break; } } }
рдирддреАрдЬрддрди, рд╣рдореЗрдВ рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХ рд╕реНрдерд┐рддрд┐ рдорд┐рд▓рддреА рд╣реИред рдЕрдВрддрд░рд┐рдХреНрд╖ рдпрд╛рди рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ "рдлреЗрд░рдмрджрд▓" рджреНрд╡рд╛рд░рд╛ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдмрд╣реБрдд рд╕рдВрдХреНрд░рдордг рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдПрдХ рдШрдЯрдХ рд╕реЗрдЯ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯреЗрдб рд╣реИред
Entity System Architecture рдХрд╛ рдореБрдЦреНрдп рдирд┐рдпрдо рдпрд╣ рд╣реИ рдХрд┐
Entity State рдХреЛ рдЕрд╡рдпрд╡реЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдореЗрдВ рд╕рдордЭрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдЗрдХрд╛рдИ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрд╡рдпрд╡реЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдмрджрд▓реЗ рдореЗрдВ рдШрдЯрдХреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рдмрджрд▓рдиреЗ рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рд╕реЗрдЯ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ - рдФрд░ рд╕рд╛рд░ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред
FSM рдХреЗ рд▓рд┐рдП рдорд╛рдирдХреАрдХреГрдд рдХреЛрдб
рдПрдлрдПрд╕рдПрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдПрдХ рд╕рдорд╛рди рд╕реЗрдЯ рдХреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ -
рдорд╛рдирдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХрдХреНрд╖рд╛рдПрдВ ред рдЗрди рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдирдП рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
FSM
EntityStateMachine рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЬрдм рдЖрдк рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрд╕реЗ рдПрдВрдЯрд┐рдЯреА рдХрд╛ рдПрдХ рд▓рд┐рдВрдХ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдпрд╣ рдкреНрд░рдмрдВрдзрди рдХрд░реЗрдЧрд╛ред
EntityStateMachine рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЖрдорддреМрд░ рдкрд░ рдЗрдХрд╛рдИ рдореЗрдВ рдХреБрдЫ рдШрдЯрдХ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рд╕реА рднреА рд╕рд┐рд╕реНрдЯрдо рдХреА рдкрд╣реБрдВрдЪ рд╣реЛрддреА рд╣реИред
var stateMachine : EntityStateMachine = new EntityStateMachine( guard );
FSM рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрди рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ
EntityStateMachine.changeState () рд╡рд┐рдзрд┐ рд╕реЗ рдХреЙрд▓ рдХрд░рдХреЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдирд╛рдо) рджреНрд╡рд╛рд░рд╛ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд╕реНрдЯреЗрдЯ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЗрд╕реЗ
EntityStateMachine.changeState (StateName) рдХрд╣рддреЗ рд╕рдордп рдмрдирд╛рдпрд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
var patrolState : EntityState = stateMachine.createState( "patrol" ); var attackState : EntityState = stateMachine.createState( "attack" );
рдПрдлрдПрд╕рдПрдо рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд░рд╛рдЬреНрдп рдХреЛ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ- рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬрдм рдЗрдХрд╛рдИ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреА рд╣реИ;
- рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░ рдкрд╣рд▓реЗ рдЬреЛрдбрд╝реЗ рдЧрдП рдШрдЯрдХреЛрдВ рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИред
EntityStateMachine.add () рд╡рд┐рдзрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реЗрдЯ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕ рдШрдЯрдХ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреА рд╣реИред
var patrol : Patrol = new Patrol(); patrol.path = PatrolPathFactory.getPath( node.entity.name ); patrolState.add( Patrol ).withInstance( patrol ); attackState.add( Attack );
рдЪрд╛рд░ рдорд╛рдирдХ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ:
unitState.add (рдкреНрд░рдХрд╛рд░: рдХрдХреНрд╖рд╛);рдХрд┐рд╕реА рднреА рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдмрд┐рдирд╛ FSM рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдЧрд╛, рдЗрд╕рдХреЗ рдмрд╛рдж рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдПред рдФрд░ рдЬрдм рднреА рдЖрдк рдЗрд╕ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд▓реМрдЯреЗрдВрдЧреЗ, рдЗрд╕реЗ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
UnitState.add (рдкреНрд░рдХрд╛рд░: рд╡рд░реНрдЧ) .withType (рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░: рдХрдХреНрд╖рд╛);рдпрд╣ рд╕рдВрдХреЗрдд рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИред
рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдЯрд╛рдЗрдк
рдкреНрд░рдХрд╛рд░ рдпрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди
рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
UnitState.add (рдкреНрд░рдХрд╛рд░: рд╡рд░реНрдЧ) .withInstance (рдЙрджрд╛рд╣рд░рдг: *);рдпрд╣ рд╡рд┐рдзрд┐ рдШрдЯрдХ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ рдЬрдм рд╡рд╣ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдкрд░ рд▓реМрдЯрддрд╛ рд╣реИред
рдФрд░ рдЕрдВрдд рдореЗрдВ
UnitState.add (рдкреНрд░рдХрд╛рд░: рд╡рд░реНрдЧ) .withSingleton ();рдпрд╛
UnitState.add (рдкреНрд░рдХрд╛рд░: рд╡рд░реНрдЧ) .withSingleton (рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░: рдХрдХреНрд╖рд╛);рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдмрдирд╛рдПрдЧрд╛ рдФрд░ рд╣рд░ рдмрд╛рд░ рдЬрдм рд╡рд╣ рдЗрд╕ рд░рд╛рдЬреНрдп рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдПрдЧрд╛, рддреЛ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдпрд╣
withInstance рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ
рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди
withSingleton рд╡рд┐рдзрд┐ рдХрдХреНрд╖рд╛ рдХреЛ рддрдм рддрдХ рдирд╣реАрдВ
рд░реЛрдХ рд╕рдХрддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЬрд░реВрд░рдд рди рд╣реЛред рдпрджрд┐
рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЯрд╛рдЗрдк рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐
рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЯрд╛рдЗрдк
рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдВрдд рдореЗрдВ, рдЖрдк
IComponentProvider рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдШрдЯрдХ рдХреЛ рд╕реНрд╡рдпрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
UnitState.add (рдкреНрд░рдХрд╛рд░: рд╡рд░реНрдЧ) .withProvider (рдкреНрд░рджрд╛рддрд╛: IComponentProvider);IComponentProvider рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
public interface IComponentProvider { function getComponent() : *; function get identifier() : *; }
GetComponent рд╡рд┐рдзрд┐ рдШрдЯрдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИред
рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛ рдкреНрд░рджрд╛рддрд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗ рдХрд┐ рд╡реЗ рдПрдХ рд╣реА рдШрдЯрдХ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред рдШрдЯрдХ рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдпрджрд┐ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд╛рдЬреНрдп рдПрдХ рд╣реА рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ "рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ" рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рд▓рдЪреАрд▓реЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛ рд╕рдХреЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред
рд╡рд╛рдкрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПрдпрджрд┐ рд╣рдо рдЗрди рдирдП рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рдПрдХ рд╕реНрдкреЗрд╕рд╢рд┐рдк рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рдирд┐рдореНрди рд░реВрдк рд▓реЗрдЧрд╛
var fsm : EntityStateMachine = new EntityStateMachine( spaceshipEntity ); fsm.createState( "playing" ) .add( Motion ).withInstance( new Motion( 0, 0, 0, 15 ) ) .add( MotionControls ) .withInstance( new MotionControls( Keyboard.LEFT, Keyboard.RIGHT, Keyboard.UP, 100, 3 ) ) .add( Gun ).withInstance( new Gun( 8, 0, 0.3, 2 ) ) .add( GunControls ).withInstance( new GunControls( Keyboard.SPACE ) ) .add( Collision ).withInstance( new Collision( 9 ) ) .add( Display ).withInstance( new Display( new SpaceshipView() ) ); fsm.createState( "destroyed" ) .add( DeathThroes ).withInstance( new DeathThroes( 5 ) ) .add( Display ).withInstance( new Display( new SpaceshipDeathView() ) ); var spaceshipComponent : Spaceship = new Spaceship(); spaceshipComponent.fsm = fsm; spaceshipEntity.add( spaceshipComponent ); fsm.changeState( "playing" );
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╡рд░реНрддрдорд╛рди рд░рд╛рдЬреНрдп рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:
for ( spaceship = spaceships.head; spaceship; spaceship = spaceship.next ) { for ( asteroid = asteroids.head; asteroid; asteroid = asteroid.next ) { if ( Point.distance( asteroid.position.position, spaceship.position.position ) <= asteroid.position.collisionRadius + spaceship.position.collisionRadius ) { spaceship.spaceship.fsm.changeState( "destroyed" ); break; } } }