Khi cố gắng tạo hiệu ứng thời gian/khung hình dựa trên Silverlight (trái ngược với việc sử dụng thứ gì đó như DoubleAnimation hoặc Storyboard, không phù hợp với trò chơi tốc độ nhanh), ví dụ như di chuyển tàu vũ trụ theo một hướng cụ thể khung hình, sự chuyển động rất nhanh và không thực sự mượt mà. Màn hình thậm chí có vẻ rách.Hoạt ảnh Silverlight không trơn tru
Dường như không có sự khác biệt giữa CompositionTarget và DistpatcherTimer. Tôi sử dụng phương pháp sau (trong mã giả):
Register Handler to Tick-Event of a DispatcherTimer
In each Tick:
Compute the elapsed time from the last frame in milliseconds
Object.X += movementSpeed * ellapsedMilliseconds
Điều này sẽ dẫn đến chuyển động trơn tru, phải không? Nhưng nó không. Đây là một ví dụ (Điều khiển: WASD và Chuột): Silverlight Game. Mặc dù hiệu ứng tôi mô tả không quá phổ biến trong mẫu này, tôi có thể đảm bảo với bạn rằng thậm chí di chuyển một hình chữ nhật đơn trên một khung hình sẽ tạo ra một hình ảnh động chuyển động.
Có ai đó có ý tưởng cách giảm thiểu điều này không. Có cách tiếp cận khác để khung hình hoạt hình dựa trên exept bằng cách sử dụng Storyboards/DoubleAnimations mà có thể giải quyết này?
Edit: Đây là một cách tiếp cận nhanh chóng và dơ bẩn, tạo hiệu ứng động một hình chữ nhật với mã tối thiểu (Controls: A và D) Animation Sample
XAML:
<Grid x:Name="LayoutRoot" Background="Black">
<Canvas Width="1000" Height="400" Background="Blue">
<Rectangle x:Name="rect" Width="48" Height="48"
Fill="White"
Canvas.Top="200"
Canvas.Left="0"/>
</Canvas>
</Grid>
C#:
private bool isLeft = false;
private bool isRight = false;
private DispatcherTimer timer = new DispatcherTimer();
private double lastUpdate;
public Page()
{
InitializeComponent();
timer.Interval = TimeSpan.FromMilliseconds(1);
timer.Tick += OnTick;
lastUpdate = Environment.TickCount;
timer.Start();
}
private void OnTick(object sender, EventArgs e)
{
double diff = Environment.TickCount - lastUpdate;
double x = Canvas.GetLeft(rect);
if (isRight)
x += 1 * diff;
else if (isLeft)
x -= 1 * diff;
Canvas.SetLeft(rect, x);
lastUpdate = Environment.TickCount;
}
private void UserControl_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.D)
isRight = true;
if (e.Key == Key.A)
isLeft = true;
}
private void UserControl_KeyUp(object sender, KeyEventArgs e)
{
if (e.Key == Key.D)
isRight = false;
if (e.Key == Key.A)
isLeft = false;
}
Cảm ơn ! Andrej
+1 Tôi đặt bất kỳ nỗ lực nào trong việc tạo trò chơi trong Silverlight 3 để nghỉ ngơi vì nói lắp, rách và nhấp nháy ... tự hỏi liệu họ có giải quyết vấn đề này trong 4 hoặc nếu nó vẫn vô dụng như Powerpoint cho hoạt ảnh mượt mà không? Amiga trên 20 tuổi của tôi với AMOS là một người biểu diễn tốt hơn và nền tảng phát triển dễ dàng hơn trong bộ phận này;) –
Tôi đã hỏi một câu hỏi tương tự gần đây. Tôi nghĩ rằng nó có một cái gì đó để làm với phần cứng của tôi: MacBook Dual-Boot (Boot Camp), mặc dù tôi đã có cùng một vấn đề trong tất cả các máy tính Windows khác mà tôi có. Lưu ý rằng câu trả lời tôi đánh dấu đúng không thực sự giải quyết vấn đề ... Tôi quan sát vấn đề ngay cả đối với một bảng phân cảnh di chuyển một hình chữ nhật đơn giản. Tôi hy vọng điều này sẽ sớm được khắc phục. http://stackoverflow.com/questions/5319562/silverlight-fast-moving-bitmap-does-not-update-smoothly –