рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдореЗрдВ рдЦреЗрд▓ рдЪрдХреНрд░

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

рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд┐рддреНрд░ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред

рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдореЗрдВ рдЙрддреНрдХреГрд╖реНрдЯ рдПрдиреАрдореЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рд╣реИред рдЖрдк рдмреНрд▓реЗрдВрдб рдореЗрдВ рдЧреБрдг рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рдЖрдк рдЪрд╛рдмрд┐рдпрд╛рдБ рдбрд╛рд▓рддреЗ рд╣реИрдВред рдФрд░ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдирд┐рдпрдВрддреНрд░рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИред рдкреНрд░реЛрдЧреНрд░рд╛рдордмреЛрд░реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдП рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рд░рд╛рдЬреНрдп рдП рд╕реЗ рд░рд╛рдЬреНрдп рдмреА рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдПрдиреАрдореЗрд╢рди, рдмреАрдЪ рдореЗрдВ рдмрд┐рдирд╛ рдШрдЯрдирд╛ рдХреЗ рднреА рдЖрд╕рд╛рди рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдЬрдЯрд┐рд▓ рдПрдиреАрдореЗрд╢рди (рднреМрддрд┐рдХреА, рдЯрдХреНрдХрд░ рдХреА рдЧрдгрдирд╛, рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдПрдиреАрдореЗрд╢рди рд╡рдХреНрд░ рдХреЛ рдмрджрд▓рдирд╛) рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдиреАрдореЗрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб рдХреЛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрд▓рд╛рд╕рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рдЯрд╛рдЗрдорд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдФрд░ рд╣рд░ рдмрд╛рд░ рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдиреАрдореЗрд╢рди рддрд░реНрдХ рдХреЛ рдкреБрди: рд▓рд┐рдЦреЗрдВред

рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдореЗрдВ, рдпреЗ рдЯрд╛рдЗрдорд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
рд▓реЗрдХрд┐рди рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рдПрдиреАрдореЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╡реИрд╢реНрд╡рд┐рдХ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЗрд╡реЗрдВрдЯ, рд╕реНрдЯреЗрдЯрд┐рдХ рдХреНрд▓рд╛рд╕ рд╕рд┐рд╕реНрдЯрдо ред Windows.edia.CompositionTarget рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдирдореВрдирд╛ рдХреЛрдб, рдПрдХ рд╕рд░рд▓ рдЧреЗрдо рд▓реВрдк:

//   private int _lastTime; private void MainPage_Loaded(object sender, RoutedEventArgs e){ //  ,     CompositionTarget.Rendering += _gameLoopUpdate; _lastTime = Environment.TickCount; } private void _gameLoopUpdate(object sender, EventArgs e){ int currentTime = Environment.TickCount; int frameTime = currentTime - _lastTime; _lastTime = currentTime; //    } 


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

рдЬреАрд╡рд┐рдд рдЙрджрд╛рд╣рд░рдг


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмреЙрдХреНрд╕ рдореЗрдВ рдПрдХ "рдЧреЗрдо", рдПрдХ рдорд╢реАрди рдмрдирд╛рдПрдВред рдХреАрдмреЛрд░реНрдб рдкрд░ рд▓рдЧреЗ рддреАрд░ рдХрд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдлреНрдЯ, рд░рд╛рдЗрдЯ, рдЧреИрд╕, рд░рд┐рд╡рд░реНрд╕ / рдмреНрд░реЗрдХ, рд╕рдм рдХреБрдЫ рд╣рд░ рдЬрдЧрд╣ рдХреА рддрд░рд╣ рд╣реИред
рдПрдХ рдирдпрд╛ рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред "MainPage.xaml" рдЦреЛрд▓реЗрдВред рдореБрдЦреНрдп рдЧреНрд░рд┐рдб рдореЗрдВ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо "LayoutRoot" рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ:

 <Grid Margin="12" Background="#FF084E0F"/> <Viewbox IsHitTestVisible="False" Margin="12"> <TextBlock TextWrapping="Wrap" Text=" " Foreground="#FF00228D" RenderTransformOrigin="0.5,0.5" Margin="10,0" Width="129" Height="16"> <TextBlock.RenderTransform> <CompositeTransform Rotation="-35"/> </TextBlock.RenderTransform> </TextBlock> </Viewbox> <Canvas x:Name="ContentPanel" Margin="12"> <TextBlock x:Name="tbInfo" Text="TextBlock" Foreground="White" FontSize="16" /> <Image x:Name="car" Width="70" Source="car.png" Height="35" /> </Canvas> 


рдЖрдк рдЪрд┐рддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ "car.png" рддреБрдореНрд╣рд╛рд░рд╛ рдпрд╛ рдпрд╣:
car.png

рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХрд╛рд░ рдХреА рдирд╛рдХ рджрд╛рдИрдВ рдУрд░ рджрд┐рдЦрддреА рд╣реИред

рдПрдиреАрдореЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдЖрдХрд╛рд░ рджреЗрдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдБред

рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдПрдирд┐рдореЗрдЯреЗрдб рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдХрд╛рд░рдг рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВ:
  • рдСрдЯреЛ рдореЗрдВ рд╕реЗрдЯ рдЪреМрдбрд╝рд╛рдИ рдпрд╛ рдКрдВрдЪрд╛рдИ рдХреЗ рдЖрдпрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде, рд░реЛрдЯреЗрд╢рди рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрд░рдорд╢рдГ рд░реЛрдЯреЗрд╢рди рдХреЗ рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдирд┐рд░рдкреЗрдХреНрд╖ рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдЖрдпрд╛рдоред
  • рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдПрдХреНрдЪреБрдЕрд▓рд╡рд┐рджрде рдФрд░ рдПрдХреНрдЪреБрдЕрд▓рд╣рд╛рдЗрдЯ рд╢реВрдиреНрдп рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд╕реНрддреБ рдЕрднреА рддрдХ рдирд╣реАрдВ рдЦреАрдВрдЪреА рдЧрдИ рд╣реИред рдЕрдкрдиреА рдЧрдгрдирд╛ рдореЗрдВ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред


рдЦреЗрд▓ рдХреА рджреБрдирд┐рдпрд╛ рдмрдирд╛рдИред рддрд░реНрдХ рдЬреЛрдбрд╝реЗрдВред

рдХреАрд╕реНрдЯреНрд░реЛрдХ рд╣реИрдВрдбрд▓рд┐рдВрдЧ


рдЪрд╛рдмрд┐рдпрд╛рдБ рдЗрддрдиреА рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИрдВред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдПрдХ рд╕рд╛рде рджрдмрд╛рдП рдЧрдП рдХреБрдВрдЬреА рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рд╕рдВрд╢реЛрдзрдХ рдХреА рдЧрд┐рдирддреА: Ctrl, Shift, Altред рдХреАрдбрд╛рдЙрди рдЗрд╡реЗрдВрдЯ рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдХреБрдВрдЬреА рдХреЛ рджрдмрд╛рддрд╛ рд╣реИред рдпрд╛рдиреА рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рдХреБрдВрдЬреА рджрдмрд╛рдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЧреИрд╕ рдирд┐рдЪреЛрдбрд╝ рд▓реА, рдФрд░ рдЧреИрд╕ рдХрд░рддреЗ рд╕рдордп, рдмрд╛рдПрдВ рдореБрдбрд╝реЗрдВ рдирд╣реАрдВред рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ, Ctrl / Shift рдФрд░ рдЧреИрд╕ рдХреЛ рджреЛрдиреЛрдВ рд╣рд╛рдереЛрдВ рд╕реЗ рджрдмрд╛рдПрдВред рдпрд╣ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ ...

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

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдЬреЛрдбрд╝реЗрдВ:

  //  .    , //   ,  . //         public sealed class KeyHandler { private bool[] isPressed = new bool[256]; private UserControl targetCanvas = null; public void ClearKeyPresses(){ for (int i = 0; i < 256; i++){ isPressed[i] = false; } } public void ClearKey(Key k){ isPressed[(int) k] = false; } public void Attach(UserControl target){ ClearKeyPresses(); targetCanvas = target; target.KeyDown += new KeyEventHandler(target_KeyDown); target.KeyUp += new KeyEventHandler(target_KeyUp); target.LostFocus += new RoutedEventHandler(target_LostFocus); } public void Detach(UserControl target){ target.KeyDown -= new KeyEventHandler(target_KeyDown); target.KeyUp -= new KeyEventHandler(target_KeyUp); target.LostFocus -= new RoutedEventHandler(target_LostFocus); ClearKeyPresses(); } private void target_KeyDown(object sender, KeyEventArgs e){ isPressed[(int) e.Key] = true; } private void target_KeyUp(object sender, KeyEventArgs e){ isPressed[(int) e.Key] = false; } private void target_LostFocus(object sender, EventArgs e){ ClearKeyPresses(); } public bool IsKeyPressed(Key k){ int v = (int) k; if (v < 0 || v > 82) return false; return isPressed[v]; } public bool IsKeyPressed(Key[] keys){ foreach (Key k in keys){ if (this.IsKeyPressed(k)) return true; } return false; } } 


рдПрдиреАрдореЗрд╢рди


рдирд┐рдореНрди рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЛ MainPage.xaml.cs рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
 //   private KeyHandler _keyHandler = new KeyHandler(); //       private RotateTransform _rotateHelper = new RotateTransform(); //       private TranslateTransform _translateTransform = new TranslateTransform(); private RotateTransform _rotateTransform = new RotateTransform(); 


рд╣рдо RenderTransform рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░ рдХрд╛ рдПрдиреАрдореЗрд╢рди рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдШреВрдордиреЗ, рдШреВрдордиреЗ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред

рдХреНрдпреЛрдВрдХрд┐ рд░реВрдкрд╛рдВрддрд░ рд╡рд╕реНрддреБ рдХреЛ рдЙрд╕рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдирд┐рдореЗрдЯ рдХрд░рддрд╛ рд╣реИред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ Canvas.Top рдФрд░ Canvas.Left рдХрд╛рд░ рдСрдмреНрдЬреЗрдХреНрдЯ (рд╣рдорд╛рд░реА рдХрд╛рд░) рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИрдВ ред

рдореБрдЦреНрдп рд╡рд┐рдВрдбреЛ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рднрд░реЗрдВ:
 public MainPage(){ InitializeComponent(); this.Loaded += MainPage_Loaded; //     var tg = new TransformGroup(); tg.Children.Add(_rotateTransform); tg.Children.Add(_translateTransform); car.RenderTransform = tg; //    _translateTransform.X = 50; _translateTransform.Y = 50; car.MouseLeftButtonDown += car_MouseLeftButtonDown; //    _keyHandler.Attach(this); } 

рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдлрдВрдХреНрд╢рди, рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдорд╢реАрди рдорд╛рдЙрд╕ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкрдХрдбрд╝рддреА рд╣реИ:
  //       void car_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){ _speedPerSecond += 300; } 

рдЬрдм рд╡рд┐рдВрдбреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдкреНрд▓рдЧрдЗрди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдХреАрд╕реНрдЯреНрд░реЛрдХреНрд╕ рдХреЛ рдирд╣реАрдВ рдкрдХрдбрд╝реЗрдЧрд╛ред рдХреБрдЫ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ, рдпрд╣ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдлрд╝реЛрдХрд╕ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдмрд╕ рд╣рдорд╛рд░реЗ рдЦрд┐рд▓реМрдиреЗ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЦреЗрд▓ рдЪрдХреНрд░ рддреИрдпрд╛рд░ рдХрд░реЗрдВред
 private void MainPage_Loaded(object sender, RoutedEventArgs e){ //     ,        System.Windows.Browser.HtmlPage.Plugin.Focus(); //  ,     CompositionTarget.Rendering += _gameLoopUpdate; _lastTime = Environment.TickCount; } 

рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдиреАрдореЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
  //    private Point _direction = new Point(1, 0); //  private double _speedPerSecond ; // /   , >1 ,<1  private double _accelerationRatioPerSec = 0.60; //   private int _lastTime; 

рдХрд╛рд░ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рдПрдиреАрдореЗрд╢рди рдХреЗ рджреНрд╡рд╛рд░рд╛ред рд╣рдо рдореВрд▓ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рджрд┐рд╢рд╛ рд╡реЗрдХреНрдЯрд░ (рдпреВрдирд┐рдЯ рд╡реЗрдХреНрдЯрд░) рдХреЛ рдШреБрдорд╛рддреЗ рд╣реИрдВ, рдЧрддрд┐ рд╕реЗ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рд╕реНрдерд╛рди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХрд╛рд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЙрд╕реА рд╕рдордп, рдкрд░рд┐рдгрд╛рдореА рдХреЛрдг рдорд╢реАрди рдХреЗ рд░реЛрдЯреЗрд╢рди рдХрд╛ рдХреЛрдг рд╣реЛрдЧрд╛ред


рдЕрдкрдиреЗ рдХрдВрдЯреЗрдирд░ рдХреА рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рдХрд╛рд░ рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рд╣рдо рдХрд╛рд░ рдХреЛ рдореЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдЖрдпрдд рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдХрд╛рд░ рдХреЗ рдореЛрдбрд╝ рдХреЗ рдХреЛрдг рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред


рдпрд╣ рдЦреЗрд▓ рдХреЗ рджрд┐рд▓ рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдЦреЗрд▓ рдЪрдХреНрд░ рдХреЗ рдХрд╛рд░реНрдп:
  private void _gameLoopUpdate(object sender, EventArgs e){ int currentTime = Environment.TickCount; int frameTime = currentTime - _lastTime; _lastTime = currentTime; //       //          double delta = (double)frameTime / 1000; //       double xCurrentPos = _translateTransform.X; double yCurrentPos = _translateTransform.Y; double currentAngle = _rotateTransform.Angle; //   double addToSpeedPerSec = 300; if (_keyHandler.IsKeyPressed(Key.Up)){ _speedPerSecond += addToSpeedPerSec*delta; } if (_keyHandler.IsKeyPressed(Key.Down)){ _speedPerSecond -= addToSpeedPerSec * delta; } //       double targetAngle = currentAngle; double coefAngle = .5; if (_keyHandler.IsKeyPressed(Key.Right)){ targetAngle += _speedPerSecond * coefAngle*delta; } if (_keyHandler.IsKeyPressed(Key.Left)){ targetAngle -= _speedPerSecond * coefAngle * delta; } //    _rotateHelper.CenterX = car.ActualWidth / 2; _rotateHelper.CenterY = car.ActualHeight / 2; _rotateHelper.Angle = targetAngle; //    _rotateHelper.CenterX = 0; _rotateHelper.CenterY = 0; _direction = _rotateHelper.Transform(new Point(1, 0)); //   _speedPerSecond += (_speedPerSecond*_accelerationRatioPerSec - _speedPerSecond)*delta; // ,       double stepPerFrame = _speedPerSecond * delta; //   double xTargetPos = xCurrentPos + _direction.X * stepPerFrame; double yTargetPos = yCurrentPos + _direction.Y * stepPerFrame; //           Rect borderRect = _rotateHelper.TransformBounds(new Rect(0, 0, car.ActualWidth, car.ActualHeight)); borderRect.X = borderRect.X + xTargetPos; borderRect.Y = borderRect.Y + yTargetPos; //     if (isInContentPanel(borderRect)){ ////     _translateTransform.X = xTargetPos; _translateTransform.Y = yTargetPos; _rotateTransform.Angle = targetAngle; } else{ // ,     _speedPerSecond = 0; } //  tbInfo.Text = string.Format("Speed:{0:F1}", _speedPerSecond); } //    ,    private bool isInContentPanel(Rect shapeBorder){ if (0 <= shapeBorder.Left && shapeBorder.Right <= ContentPanel.ActualWidth) if (0 <= shapeBorder.Top && shapeBorder.Bottom <= ContentPanel.ActualHeight) return true; return false; } 

рд▓реВрдк рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдирд┐рдореНрди рдЪрд░рдг рд╣реЛрддреЗ рд╣реИрдВ:

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

рдкрд░рд┐рдгрд╛рдо


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

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

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

"рдПрдХ рдмреЙрдХреНрд╕ рдореЗрдВ рдХрд╛рд░реЛрдВ" рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдкреГрд╖реНрда рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрд╕рд╛рдзрди:
  1. рдлрд┐рдЬрд┐рдХреНрд╕ рд╣реЗрд▓реНрдкрд░ рдлреЙрд░ рдмреНрд▓реЗрдВрдб, рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ, рдбрдмреНрд▓реНрдпреВрдкреА 7 рдФрд░ рдлрд░рд╕реЗрд░ - рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рд░реИрдкрд░ рдлрд╛рд░рд╕реАрд░ рдлрд┐рдЬрд┐рдХреНрд╕ рдЗрдВрдЬрди рдлрд┐рдЬрд┐рдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА (http://farseerphysics.codeplex.com/) рдкрд░ред рдпрд╣ рдЙрд╕рдХреЗ рдХреЛрдб рдореЗрдВ рдерд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдХреИрд╕реЗ рдЬрдЯрд┐рд▓ рдПрдиреАрдореЗрд╢рди рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдореЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
  2. рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдореЗрдВ рдХрд╕реНрдЯрдо рдПрдирд┐рдореЗрд╢рди - рдПрдХ рдкреЗрдВрдбреБрд▓рдо рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЧреЗрдо рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рд▓реЗрдЦ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд╣реИред

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


All Articles