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

рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ?
- рд╕реА ++ рдПрдХ рд╕рднреНрдп рд╕реНрддрд░ рдкрд░ (рдкрд╛рда рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реЛрдВрдЧреЗ - рдЯреЗрдореНрдкрд▓реЗрдЯ)
- рд▓реБрдЖ, рдПрдХ рдмрд╣реБрдд рд╣реА рд╣рд▓реНрдХреА рдкрдЯрдХрдерд╛ рд╡рд╛рд▓реА рднрд╛рд╖рд╛ред рдореИрдВ рдЗрд╕ рдкрд╛рда рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рдХреНрдпреЛрдВ рдПрдХ .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*) {
рдЬрд╣рд╛рдБ 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"
рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, 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
рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрд╕
- рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рд╕ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рд╣реИ, рдпрд╣рд╛рдБ рддрдХ рдХрд┐ .txt, рдпрд╣рд╛рдБ рддрдХ рдХрд┐ .lua, рдпрд╣рд╛рдБ рддрдХ рдХрд┐ .bmp рдореЗрдВ рднреА, .lua, YaP LP рдХреЗ рдХрдИ рд╕рдВрдкрд╛рджрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЦреЛрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
- Lua рдХреЛрдб рд╕рдВрдкрд╛рджрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЖрдк рдЕрдВрдд, рдХрд░рдирд╛, рдпрд╛ рдХреБрдЫ рдФрд░ рд▓рд┐рдЦрдирд╛ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд▓реБрдЖ рд▓рд┐рдкрд┐ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╕ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛
- рдЬрд┐рддрдирд╛ рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ 100 рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ C ++ рдореЗрдВ рдкрд╣рд▓реЗ 2 рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдРрд╕реА рдФрд░ рднреА рдХрдИ рдзрд╛рд░рдгрд╛рдПрдБ рд╣реИрдВред
рдХреНрдпреВ рдПрдВрдб рдП
- рдкреНрд░рд╢реНрди: рд╣рдо рд▓реБрдЖ рд╕реНрдЯреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╣реИ - int foo (lua_State * L)?
рдЙрддреНрддрд░: рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд░рд╛рдЬреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреНрдп рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдмрд╕ рдПрдХ рдкреВрд░реА рдХрдХреНрд╖рд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рднрд╣реАрди рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ рд╕реЗ lua_State рдХреЛ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ lua_pushboolean рдФрд░ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдЧрд╛ред
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 рдкрд░