рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реИ - рд▓реБрдЖ рдФрд░ рд╕реА ++

рд╢реБрдн рджреЛрдкрд╣рд░, рд╣рдмреНрдмрд░!
рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛

рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ?



рдХреНрдпреЛрдВ рдПрдХ .cpp рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЧреЗрдо рдбрд╛рдпрд▓реЙрдЧ рд▓рд┐рдЦрдирд╛ рдПрдХ рдмрдбрд╝реА рдЧрд▓рддреА рдереА


рдпрджрд┐ рдЖрдкрдиреЗ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдБ рд╡рд┐рдХрд╕рд┐рдд рдХреА рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЦреЗрд▓), рддреЛ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рди рдХреЛрдб рдХреА рдкреНрд░рддреНрдпреЗрдХ рдирдИ рд╕реМ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рдзреАрдорд╛ рд╣реИ?
рдЦреЗрд▓ рдЕрдзрд┐рдХ рд╣рдерд┐рдпрд╛рд░, рдЕрдзрд┐рдХ рд╕рдВрд╡рд╛рдж, рдЕрдзрд┐рдХ рдореЗрдиреВ, рдЕрдзрд┐рдХ рдЖрджрд┐ рдмрдирд╛рддрд╛ рд╣реИред
рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЕрд╕рдВрдЦреНрдп рд╣рдерд┐рдпрд╛рд░реЛрдВ рдФрд░ рдмреИрдЬ рдХреЗ рдмрдЬрд╛рдп рдХрдард┐рди рдХрд╛рд░реНрдп рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реИред
рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╣рд╛рдВ рджреЛрд╕реНрдд / рдмреЙрд╕ / рдкрд╛рд░реНрдЯрдирд░ рд╕реЗ рд╕рдВрд╡рд╛рдж рдХреЛ рдмрджрд▓рдиреЗ рдпрд╛ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рдерд┐рдпрд╛рд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдХреБрдЫ рдЙрдкрд╛рдпреЛрдВ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдм рдХрдЪрд░рд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд╛рда рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдирд╛ред
рд▓рдЧрднрдЧ рд╣рд░ рдЧреЗрдо рдбреЗрд╡рд▓рдкрд░ рдиреЗ рдХрднреА рдПрдХ рдЕрд▓рдЧ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рд╕реНрддрд░ рдХрд╛ рдирдХреНрд╢рд╛ рдпрд╛ рд╕рдВрд╡рд╛рдж рдмрдирд╛рдпрд╛ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рд╛ред рдХрдо рд╕реЗ рдХрдо рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рд▓реЗрдВ - рдПрдХ рдЗрдирдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдореЗрдВ рдУрд▓рдВрдкрд┐рдпрд╛рдб рдХрд╛рд░реНрдп

рд▓реЗрдХрд┐рди рдПрдХ рд░рд╛рд╕реНрддрд╛ рд╣реИ, рдКрдкрд░ рдПрдХ рдХрдЯ - рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред

рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдХрд░рдирд╛


тАЬрдареАрдХ рд╣реИ, рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдпрдорд┐рдд рдлрд╝рд╛рдЗрд▓ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рддреЗрдЬреА рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд▓рдЧрднрдЧ рд╣рд░ рджрд┐рди рдЖрдкрдХреЛ рдореБрдЦреНрдп рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рддрд░реНрдХ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдирд╛ рдкрдбрд╝реЗ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХрдИ рдмрд╛рд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ? "
рдЕрдЪреНрдЫрд╛ рд╕рд╡рд╛рд▓ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдпрд╛ рдЦреЗрд▓ рдХреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рдЧ рдХреЗ рд╕рд╛рде рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рддрд░реНрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрддреА рд╣реИрдВред
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдХреБрдЫ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рддрд░реНрдХ рдХреЛ рд░рдЦрдирд╛ рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреА рдЕрдкрдиреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдХреБрдЫ рд╣реА рд╕реЗрдХрдВрдб рдореЗрдВ рдорд╕реНрддрд┐рд╖реНрдХ рд╕реЗ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рдПред рдЦрд┐рд▓рд╛рдбрд╝реА рдХрд╛ рддрд░реНрдХ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрддрдиреА рднрдпрд╛рдирдХ рд▓рд╛рдЧрдд рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, C ++ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рднрд╛рд╖рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ рдЬреЛ рдПрдХ рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдРрд╕реА рд╣реА рдПрдХ рдкрдЯрдХрдерд╛ рднрд╛рд╖рд╛ рд▓реБрдЖ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?


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

рд╣рдо рд╕реА ++ рдореЗрдВ - рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреБрдЫ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрд┐рд╕реА рдирд╛рдо рдХреЗ рддрд╣рдд "рд░рдЬрд┐рд╕реНрдЯрд░" рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХрд╣рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рд╣рдордиреЗ C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрдкреЛрд╕ (x, y) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рд╣реИ, рддреЛ, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднрд╛рд╖рд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ "рджреБрднрд╛рд╖рд┐рдпрд╛" рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдмреЗрд╢рдХ; рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рдеред
рдХрдорд╛рд▓ рд╣реИ рдирд╛? :)

UPD: рд╕рд╛рд╡рдзрд╛рди! рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдореБрдЭреЗ рдИрдореЗрд▓ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛ рдХрд┐ рдЬрдм рдореИрдВрдиреЗ рдХреЛрдб рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдерд╛, рддреЛ рдореИрдВрдиреЗ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ - habrahabr.ru/post/196272/#comment_6850016
рдХреАрдбрд╝реЗ рдиреЗ рд╣рдмрд░ рдХреА рдЕрдиреБрдорддрд┐ рд╕реЗ рдХреЛрдб рдореЗрдВ рдШреБрд╕рдкреИрда рдХреА
рдХреЛрдб рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдмрджрд▓реЗрдВ
template<class t> T MethodName(); 

рдкрд░
  template<class T> T MethodName(); 

рдФрд░ lua_CFunction рдХреЗ рдмрдЬрд╛рдп, lua_cfunction рд╕реНрдХреАрдк
рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВ рддреИрдпрд╛рд░ рд╣реВрдБ!


рдЬрдм рдЖрдк рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ!
рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ Lua рдХреЛ github (рд╡рд┐рд╖рдп рдХреЗ рдиреАрдЪреЗ) рдкрд░ рднрдВрдбрд╛рд░ рд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ, рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рд▓реЗ рдЬрд╛рдПрдВред

рд╣рдо рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдПрдХ рдХрдВрд╕реЛрд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдпрд╛ Win32 (рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ) рдмрдирд╛рддреЗ рд╣реИрдВ (рдореЗрд░реЗ рдкрд╛рд╕ рд╕рдВрд╕реНрдХрд░рдг 2012 рд╣реИ)

рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ-> рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ-> рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░реЙрдкрд░реНрдЯреАрдЬ-> рд╡реАрд╕реА ++ рдбрд┐рдЯреЗрд▓реНрд╕ рдФрд░ "рдЗрдирдХреНрд▓реВрдЬрди рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реАрдЬ" рдФрд░ "рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбрд╛рдпрд░реЗрдХреНрдЯреНрд░реАрдЬ" рдореЗрдВ рдХреНрд░рдорд╢рдГ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рд▓рд┐рдм рдФрд░ рд▓рд┐рдм рдлреЛрд▓реНрдбрд░ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рдЕрдм main.cpp рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ, рдЗрд╕рдореЗрдВ рд▓рд┐рдЦреЗрдВ:
 int main() { return 0; } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реИред

рдЕрдм рдХреЛрдбрд┐рдВрдЧ рдкрд░ рдЬрд╛рдПрдВ

рдореИрдВ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рд╣рд░ рдкрд▓ рдзреНрдпрд╛рди рд╕реЗ рд╕рдордЭрд╛рдКрдВрдЧрд╛

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреНрд▓рд╛рд╕ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧреАред рдореИрдВ Script.h / .cpp рдореЗрдВ рдЙрд╕реА рд╕рдордп рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реВрдВрдЧрд╛
Script.cpp рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕рдореЗрдВ рд▓рд┐рдЦреЗрдВ
 #include "Script.h" 

Script.h рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕рдореЗрдВ рд▓рд┐рдЦреЗрдВ
 #ifndef _SCRIPT_H_ #define _SCRIPT_H_ #endif 

2 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж рдФрд░ #endif рд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рдпрд╣ рдХреЛрдб рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдЖрдкрд╕реА рд╕рдорд╛рд╡реЗрд╢ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ Game.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ Script.h, рдФрд░ Script.h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ Game.h рд╢рд╛рдорд┐рд▓ рд╣реИ - рдПрдХ рдЧрдбрд╝рдмрдбрд╝! рдФрд░ рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде, рд╕рдорд╛рд╡реЗрд╢рди рдХреЗрд╡рд▓ 1 рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдЕрдм рд╣рдо рдЗрд╕ рдХреЛрдб рдХреЗ рдЕрдВрджрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ
 #pragma comment(lib,"lua.lib") extern "C" { #include <lua.h> #include <lualib.h> #include <lauxlib.h> } 

рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдкреБрд░рд╛рд▓реЗрдЦ рд╕реЗ lua.lib рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИред
рдмрд╛рд╣рд░реА "C" рдХреНрдпрд╛ рд╣реИ? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд▓реБрдЖ рд╕реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХреЛрдб рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЕрдЧрд▓рд╛ рдХрдВрд╕реЛрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рд┐рджреНрдз рд╣реИ
 #include <stdio.h> #include <iostream> #include <sstream> using namespace std; 


рдЕрдм рдХрдХреНрд╖рд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдЖрддреЗ рд╣реИрдВ
 class Script { 

C ++ рдХреЗ рд▓рд┐рдП Lua рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд╕реНрддреБ рд╣реИ lua_State, рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ
 private: lua_State *lua_state; 

рдЗрд╕рдХреЗ рдмрд╛рдж рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд╛рд░реНрдп рдХрд░реЗрдВ
 public: void Create(); 

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди lua_State рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИ

рдмрдирд╛рдПрдВ ()
Script.cpp рдореЗрдВ рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛

 void Script::Create() { lua_state = luaL_newstate(); static const luaL_Reg lualibs[] = { {"base", luaopen_base}, {"io", luaopen_io}, {NULL, NULL} }; for(const luaL_Reg *lib = lualibs; lib->func != NULL; lib++) { luaL_requiref(lua_state, lib->name, lib->func, 1); lua_settop(lua_state, 0); } } 

рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рд╣рдо рдЕрдкрдиреЗ lua_State рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВред
рдлрд┐рд░ рд╣рдо "рдХрдиреЗрдХреНрдЯреЗрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА" рдХреА рдПрдХ рд╕реВрдЪреА рдШреЛрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд▓реБрдЖ рдореЗрдВ "рд╢реБрджреНрдз" рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ рдкреНрд░рд┐рдВрдЯ () рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдЧрдгрд┐рддреАрдп рдФрд░ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдЧрдгрд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд╝реВ, рдЖрдзрд╛рд░.рдлреВ, io.fooред рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, lualibs рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, {"рдЧрдгрд┐рдд", luaopen_math}ред рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╛рдо рд▓реБрдЖрдУрдкреЗрди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ _..., рд▓рд┐рд▓рд┐рдм рдХреЗ рдЕрдВрдд рдореЗрдВ {NULL, NULL тАЭрд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
  void Close(); 

рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд▓реБрдЖ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рддреА рд╣реИред
рдмрдВрдж рдХрд░реЗрдВ ()
рдЙрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛
 void Script::Close() { lua_close(lua_state); } 

рдмрд╕ lua_close () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
 int DoFile(char* ScriptFileName); 

рдФрд░ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрдирдкреБрдЯ рдкрд░, рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рд▓реЗрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "C: \\ script.lua"ред
рдпрд╣ рдЗрдВрдЯ рдХреНрдпреЛрдВ рд▓реМрдЯрддрд╛ рд╣реИ? рдмрд╕ рдХреБрдЫ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡рд╛рдкрд╕реА рд╣реЛ рд╕рдХрддреА рд╣реИ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡реНрдпрд╡рдзрд╛рди рдЖ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреЗ рд╣реИрдВред

DoFile ()
рдЙрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛
 int Script::DoFile(char* ScriptFileName) { luaL_dofile(lua_state,ScriptFileName); return lua_tointeger(lua_state, lua_gettop(lua_state)); } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдПрдХ рдЗрдВрдЯ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рди рдХреЗрд╡рд▓ рдЗрдВрдЯ, рдмрд▓реНрдХрд┐ рдмреВрд▓ рдФрд░ рдЪрд╛рд░ * рднреА рд▓реМрдЯрд╛ рд╕рдХрддрд╛ рд╣реИ, рдореИрдВ рд╣рдореЗрд╢рд╛ рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛ (lua_toboolean, lua_tostring) рд▓реМрдЯрд╛рддрд╛ рд╣реВрдВ


рдЕрдм рд╣рдо рдПрдХ рдРрд╕рд╛ рдлрдВрдХреНрд╢рди рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рд╕реНрдерд┐рд░рд╛рдВрдХ (рд╕рдВрдЦреНрдпрд╛рдУрдВ, рддрд╛рд░реЛрдВ, рдХрд╛рд░реНрдпреЛрдВ) рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ
  template<class t> void RegisterConstant(T value, char* constantname); 
рд░рдЬрд┐рд╕реНрдЯрд░рдХреЙрдиреНрд╕реНрдЯреИрдВрдЯ ()
рд╣рдо рдкреИрдЯрд░реНрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдЙрджрд╛рд╣рд░рдг:
 RegisterConstant<int>(13,"goodvalue"); 

рдЙрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛
 template<> void Script::RegisterConstant<int>(int value, char* constantname) { lua_pushinteger(lua_state, value); lua_setglobal(lua_state,constantname); } template<> void Script::RegisterConstant<double>(double value, char* constantname) { lua_pushnumber(lua_state, value); lua_setglobal(lua_state,constantname); } template<> void Script::RegisterConstant<char>(char* value, char* constantname) { lua_pushstring(lua_state, value); lua_setglobal(lua_state,constantname); } template<> void Script::RegisterConstant<bool>(bool value, char* constantname) { lua_pushboolean(lua_state, value); lua_setglobal(lua_state,constantname); } template<> void Script::RegisterConstant<lua_cfunction>(lua_CFunction value, char* constantname) { lua_pushcfunction(lua_state, value); lua_setglobal(lua_state,constantname); } 

рдХрдХреНрд╖рд╛ рдЯреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
* рдХрдкреНрддрд╛рди * рдЕрдВрддрд┐рдо рдкрд░рд┐рднрд╛рд╖рд╛ - рдлрд╝рдВрдХреНрд╢рди рдкрдВрдЬреАрдХрд░рдг
рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдХрд╛рд░реНрдп рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИрдВ:
 int Foo(lua_State*) { // ... return n; } 

рдЬрд╣рд╛рдБ n рд▓реМрдЯрд╛рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдпрджрд┐ n = 2, рддреЛ рд▓реВрдЖ рдореЗрдВ рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 a, b = Foo() 

Lua рдкрд░ рдореИрдиреБрдЕрд▓ рдкрдврд╝реЗрдВ рдпрджрд┐ рдЖрдк рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдереЗ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрдИ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ :)


рдирд┐рдореНрди рдлрд╝рдВрдХреНрд╢рди рд▓реБрдЖ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рддреЛ рд╡рд╣рд╛рдВ рддрд╛рд▓рд┐рдХрд╛ рдПрдХ рд╕рд░рдгреА рдХреА рддрд░рд╣ рд╣реИ
  void Array(); 
рдРрд░реЗ ()
рдЙрд╕рдХрд╛ рд╡рд░реНрдгрди
 void Script::Array() { lua_createtable(lua_state, 2, 0); } 


рдирд┐рдореНрди рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдЖрдЗрдЯрдо рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред
  template<class t> void RegisterConstantArray(T value, int index); 
RegisterConstantArray ()
рдЙрд╕рдХрд╛ рд╡рд░реНрдгрди
 template void Script::RegisterConstantArray<int>(int value, int index) { lua_pushnumber(lua_state, index); lua_pushinteger(lua_state, value); lua_settable(lua_state, -3); } template void Script::RegisterConstantArray<double>(double value, int index) { lua_pushnumber(lua_state, index); lua_pushnumber(lua_state, value); lua_settable(lua_state, -3); } template void Script::RegisterConstantArray<char>(char* value, int index) { lua_pushnumber(lua_state, index); lua_pushstring(lua_state, value); lua_settable(lua_state, -3); } template void Script::RegisterConstantArray<bool>(bool value, int index) { lua_pushnumber(lua_state, index); lua_pushboolean(lua_state, value); lua_settable(lua_state, -3); } template void Script::RegisterConstantArray<lua_cfunction>(lua_CFunction value, int index) { lua_pushnumber(lua_state, index); lua_pushcfunction(lua_state, value); lua_settable(lua_state, -3); } 

рдпрджрд┐ рдЖрдк рд▓реБрдЖ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рд╣реИрдВ рдХрд┐ рдЗрддрдиреЗ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВ? :)
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рддрддреНрд╡ рдореЗрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдореИрдВ рдРрд╕рд╛ рдХрднреА рдирд╣реАрдВ рдХрд░рддрд╛ред


рдЕрдВрдд рдореЗрдВ, рдкреВрд░реА рдХреА рдЧрдИ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
  void RegisterArray(char* arrayname); 
рд░рдЬрд┐рд╕реНрдЯрд░рдЕрд░реЗ ()
рдЙрд╕рдХрд╛ рд╡рд░реНрдгрди
 void Script::RegisterArray(char* arrayname) { lua_setglobal(lua_state, arrayname); } 

рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВ


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ int foo (lua_State *) рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ Lua рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ - рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ
  int GetArgumentCount(); 
рдмрдирд╛рдПрдВ ()
рдЙрд╕рдХрд╛ рд╡рд░реНрдгрди
 int Script::GetArgumentCount() { return lua_gettop(lua_state); } 

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


рдирд┐рдореНрди рдлрд╝рдВрдХреНрд╢рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд┐рдП рдЧрдП рддрд░реНрдХ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ
  template<class t> T GetArgument(int index); 
GetArgument ()
рдЙрд╕рдХрд╛ рд╡рд░реНрдгрди
 template int Script::GetArgument<int>(int index) { return lua_tointeger(lua_state,index); } template double Script::GetArgument<double>(int index) { return lua_tonumber(lua_state,index); } template char* Script::GetArgument<char>(int index) { return (char*)lua_tostring(lua_state,index); } template bool Script::GetArgument<bool>(int index) { return lua_toboolean(lua_state,index); } 

рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╕рднреА рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЯреЗрдмрд▓ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░
рд╕реВрдЪрдХрд╛рдВрдХ рддрд░реНрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдФрд░ рдкрд╣рд▓рд╛ рддрд░реНрдХ 1 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред


рдЕрдВрдд рдореЗрдВ, рдЕрдВрддрд┐рдо рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ
  template<class t> void Return(T value); 
рд╡рд╛рдкрд╕реА ()
рдЙрд╕рдХрд╛ рд╡рд░реНрдгрди
 template<> void Script::Return<int>(int value) { lua_pushinteger(lua_state,value); } template<> void Script::Return<double>(double value) { lua_pushnumber(lua_state,value); } template<> void Script::Return<char>(char* value) { lua_pushstring(lua_state,value); } template<> void Script::Return<bool>(bool value) { lua_pushboolean(lua_state,value); } 


рд▓рдбрд╝рд╛рдИ рдХреЛрдб



рдпрд╣ рдХреБрдЫ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ!
рдореБрдЦреНрдп рдмрджрд▓реЗрдВ

 #include "Script.h" int main() { return 0; } 

рд╣рдо рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╣реИрдВред рдЕрдм рдЖрдк рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдпрд╛рдж рд░рдЦреЗрдВ, рдореИрдВрдиреЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛? :)
Main.cpp рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ
 #include "Script.h" //   _getch() #include <conio.h> //   Script script; //  Write   int Write(lua_State*) { //          for(int i = 1; i < script.GetArgumentCount()+1; i++) cout << script.GetArgument<char*>(i); //       _getch(); return 0; } int main() { script.Create(); //      ,    script.RegisterConstant<lua_cfunction>(Write,"Write"); script.DoFile("script.lua"); script.Close(); } 

рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, script.lua рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВ
 Write(1,2,3,4) 


рдЫрд╡рд┐

рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдФрд░ рдЪрд▓рд╛рддреЗ рд╣реИрдВред

рдЫрд╡рд┐

рдЕрдм рд╣рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрджрд▓рддреЗ рд╣реИрдВ
 for i = 1, 4 do Write(i, "\n", "Hier kommt die Sonne", "\n") end 

рдЕрдм рдкреНрд░реЛрдЧреНрд░рд╛рдо 2 рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ ("\ n" - рдПрдХ рдирдИ рд▓рд╛рдЗрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛), рдПрдВрдЯрд░ рдХреЗ рджрдмрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд▓рд╛рдЗрдиреЗрдВ рдлрд┐рд░ рд╕реЗред

рдЫрд╡рд┐

рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ!

рдпрд╣рд╛рдБ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг main.cpp рд╣реИ рдФрд░ рдПрдХ script.lua рд╣реИ

 #include "Script.h" #include <conio.h> #include <Windows.h> #include <time.h> Script script; int Write(lua_State*) { //          for(int i = 1; i < script.GetArgumentCount()+1; i++) cout << script.GetArgument<char*>(i); cout << "\n"; return 0; } int GetString(lua_State*) { //     cin   ,   Script char* str = ""; cin >> str; script.Return<char*>(str); //  !    1  -> return 1 return 1; } int Message(lua_State*) { //    MessageBox  Windows.h // ,    -        :) char* msg = script.GetArgument<char*>(1); MessageBox(0,msg,"",MB_OK); return 0; } int GetTwoRandomNumbers(lua_State*) { //      1000 srand(time(NULL)); for(int i = 0; i < 2; i++) script.Return<int>(rand()%1000); //  2  return 2; } int GetLotOfRandomNumbers(lua_State*) { //      1000 srand(time(NULL)); for(int i = 0; i < script.GetArgument<int>(1); i++) script.Return<int>(rand()%1000); //   ,     return script.GetArgument<int>(1); } int main() { script.Create(); script.RegisterConstant<lua_CFunction>(Write,"Write"); script.RegisterConstant<lua_CFunction>(GetString,"GetString"); script.RegisterConstant<lua_CFunction>(Message,"Message"); script.RegisterConstant<lua_CFunction>(GetTwoRandomNumbers,"Rand1"); script.RegisterConstant<lua_CFunction>(GetLotOfRandomNumbers,"Rand2"); script.Array(); script.RegisterConstantArray<int>(1,1); script.RegisterConstantArray<int>(2,2); script.RegisterConstantArray<int>(3,3); script.RegisterConstantArray<int>(4,4); script.RegisterArray("mass"); script.DoFile("script.lua"); script.Close(); //    _getch(); } 

 for i = 1, 4 do Write(i, "\n", "Hier kommt die Sonne", "\n") end Write(2*100-1) Message("!") a, b = Rand1() Write(a, "\n", b, "\n") Write(Rand1(), "\n") a, b, c, d = Rand2(4) Write(a, "\n", b, "\n", c, "\n", d, "\n") return 1 


рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрд╕


рдХреНрдпреВ рдПрдВрдб рдП



Script.h рдФрд░ Script.cpp рдХреА рдкреВрд░реА рд╕реВрдЪреА
Script.h
 #ifndef _SCRIPT_H_ #define _SCRIPT_H_ #pragma comment(lib,"lua.lib") extern "C" { #include <lua.h> #include <lualib.h> #include <lauxlib.h> } class Script { private: lua_State *lua_state; public: void Create(); void Close(); int DoFile(char* ScriptFileName); template<class t> void RegisterConstant(T value, char* constantname); void Array(); template<class t> void RegisterConstantArray(T value, int index); void RegisterArray(char* arrayname); int GetArgumentCount(); template<class t> T GetArgument(int index); template<class t> void Return(T value); }; #endif 

рдореИрдВрдиреЗ рдХрдВрд╕реЛрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдЯрд╛ рджрд┐рдпрд╛
Script.cpp
 #include "Script.h" void Script::Create() { lua_state = luaL_newstate(); static const luaL_Reg lualibs[] = { {"base", luaopen_base}, {"io", luaopen_io}, {NULL, NULL} }; for(const luaL_Reg *lib = lualibs; lib->func != NULL; lib++) { luaL_requiref(lua_state, lib->name, lib->func, 1); lua_settop(lua_state, 0); } } void Script::Close() { lua_close(lua_state); } int Script::DoFile(char* ScriptFileName) { luaL_dofile(lua_state,ScriptFileName); return lua_tointeger(lua_state, lua_gettop(lua_state)); } template<> void Script::RegisterConstant<int>(int value, char* constantname) { lua_pushinteger(lua_state, value); lua_setglobal(lua_state,constantname); } template<> void Script::RegisterConstant<double>(double value, char* constantname) { lua_pushnumber(lua_state, value); lua_setglobal(lua_state,constantname); } template<> void Script::RegisterConstant<char>(char* value, char* constantname) { lua_pushstring(lua_state, value); lua_setglobal(lua_state,constantname); } template<> void Script::RegisterConstant<bool>(bool value, char* constantname) { lua_pushboolean(lua_state, value); lua_setglobal(lua_state,constantname); } template<> void Script::RegisterConstant<lua_cfunction>(int(*value)(lua_State*), char* constantname) { lua_pushcfunction(lua_state, value); lua_setglobal(lua_state,constantname); } void Script::Array() { lua_createtable(lua_state, 2, 0); } template<> void Script::RegisterConstantArray<int>(int value, int index) { lua_pushnumber(lua_state, index); lua_pushinteger(lua_state, value); lua_settable(lua_state, -3); } template<> void Script::RegisterConstantArray<double>(double value, int index) { lua_pushnumber(lua_state, index); lua_pushnumber(lua_state, value); lua_settable(lua_state, -3); } template<> void Script::RegisterConstantArray<char>(char* value, int index) { lua_pushnumber(lua_state, index); lua_pushstring(lua_state, value); lua_settable(lua_state, -3); } template<> void Script::RegisterConstantArray<bool>(bool value, int index) { lua_pushnumber(lua_state, index); lua_pushboolean(lua_state, value); lua_settable(lua_state, -3); } template<> void Script::RegisterConstantArray<lua_cfunction>(lua_CFunction value, int index) { lua_pushnumber(lua_state, index); lua_pushcfunction(lua_state, value); lua_settable(lua_state, -3); } void Script::RegisterArray(char* arrayname) { lua_setglobal(lua_state, arrayname); } int Script::GetArgumentCount() { return lua_gettop(lua_state); } template<> int Script::GetArgument<int>(int index) { return lua_tointeger(lua_state,index); } template<> double Script::GetArgument<double>(int index) { return lua_tonumber(lua_state,index); } template<> char* Script::GetArgument<char>(int index) { return (char*)lua_tostring(lua_state,index); } template<> bool Script::GetArgument<bool>(int index) { return lua_toboolean(lua_state,index); } template<> void Script::Return<int>(int value) { lua_pushinteger(lua_state,value); } template<> void Script::Return<double>(double value) { lua_pushnumber(lua_state,value); } template<> void Script::Return<char>(char* value) { lua_pushstring(lua_state,value); } template<> void Script::Return<bool>(bool value) { lua_pushboolean(lua_state,value); } 


Lib рдХреЗ рд╕рд╛рде рднрдВрдбрд╛рд░ рдФрд░ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: https://github.com/Izaron/LuaForHabr

рдореБрдЭреЗ рд╕рднреА рдкреНрд░рд╢реНрди рдкреАрдПрдо рдХреЛ рднреЗрдЬреЗрдВ, рдпрд╛ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░, рдпрд╛ рдпрджрд┐ рдЖрдк рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рдирд╣реАрдВ рд╣реИрдВ рдХрд┐ рд╣реЗрдмреЗрд░рд╛ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдИрдореЗрд▓ izarizar@mail.ru рдкрд░

Source: https://habr.com/ru/post/In196272/


All Articles