バンバン跳ね返る

ボールに色気を出してみた。

<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;
  }
}

ポイントは一つ。
ボールが端を超えてる時に、そのまま方向転換するだけだと、次のフレームイベントの時にまだ、超えてる状態かもしれない。なので、端を超えているときは、ぴったりくっついている位置に配置しなおしてあげる。


今回は数学なしです。