バンバン跳ね返る
ボールに色気を出してみた。
<UserControl x:Class="Bounce.Page" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Loaded="UserControl_Loaded"> <Border BorderBrush="Black" BorderThickness="2" Background="White" Width="400" Height="300"> <Canvas Width="396" Height="296" x:Name="area"> <Path x:Name="target" Width="20" Height="20" Canvas.Left="198" Canvas.Top="148"> <Path.Fill> <RadialGradientBrush RadiusX="12" RadiusY="8"> <RadialGradientBrush.RelativeTransform> <TranslateTransform X="0.15" Y="-0.15"/> </RadialGradientBrush.RelativeTransform> <RadialGradientBrush.GradientStops> <GradientStop Offset="0" Color="White" /> <GradientStop Offset="0.058" Color="Blue" /> </RadialGradientBrush.GradientStops> </RadialGradientBrush> </Path.Fill> <Path.Data> <EllipseGeometry RadiusX="20" RadiusY="20" /> </Path.Data> </Path> </Canvas> </Border> </UserControl>
private double speedX = 0; private double speedY = 0; private void UserControl_Loaded(object sender, RoutedEventArgs e) { var random = new Random(); speedX = random.NextDouble() * 10d; speedY = random.NextDouble() * 10d; (new Loop()).Fire += Loop_Fire; } private void Loop_Fire(object sender, EventArgs e) { target.SetValue(Canvas.LeftProperty,(double)target.GetValue(Canvas.LeftProperty) + speedX); target.SetValue(Canvas.TopProperty, (double)target.GetValue(Canvas.TopProperty) + speedY); if((double)target.GetValue(Canvas.LeftProperty) + target.Width > area.Width) { target.SetValue(Canvas.LeftProperty, area.Width - target.Width); speedX *= -1; } if ((double)target.GetValue(Canvas.LeftProperty) - target.Width < 0) { target.SetValue(Canvas.LeftProperty, 0 + target.Width); speedX *= -1; } if ((double)target.GetValue(Canvas.TopProperty) + (target.Height) > area.Height) { target.SetValue(Canvas.TopProperty, area.Height - target.Height); speedY *= -1; } if ((double)target.GetValue(Canvas.TopProperty) - (target.Height) < 0) { target.SetValue(Canvas.TopProperty, 0 + target.Height); speedY *= -1; } }
ポイントは一つ。
ボールが端を超えてる時に、そのまま方向転換するだけだと、次のフレームイベントの時にまだ、超えてる状態かもしれない。なので、端を超えているときは、ぴったりくっついている位置に配置しなおしてあげる。
今回は数学なしです。