【问题标题】:Reloading circle Component重新加载循环组件
【发布时间】:2019-06-28 10:40:28
【问题描述】:

我正在尝试使用 Blazor 为圆形 svg 制作动画。我已经看到俄罗斯方块游戏做到了这一点,所以我应该可能只是不知道如何让它工作。

<svg width="600" height="400">
    <Ball Height="@Ball.Height" Width="@Ball.Width" CurrentPosition="@Ball.CurrentPosition"></Ball>
</svg>

<button class="btn btn-primary" @onclick="@Bounce">bounce</button>

组件

@inherits BallModel;
@using Blong.Client.Model

<circle cx="@CurrentPosition.X" cy="@CurrentPosition.Y" r="@Radius" style="@Style" />

退回代码

 void Bounce()
    {
        for (int i = 0; i < 1000; i++)
        {
            Task.Run(() => SetPosition(Ball.CurrentPosition.X, Ball.CurrentPosition.Y++, GameHeight));
        }
    }

    public async Task<bool> SetPosition(int x, int y, int LastRow)
    {

        if (y <= LastRow)
        {
            Ball.CurrentPosition.Y++;
            Thread.Sleep(500);
            return true;
        }

        return false;

    }

这确实有效。每次我按下按钮,我的球都会跳到新的位置。有没有办法让它在循环中重新加载?我试图看到我的球在屏幕上移动。

【问题讨论】:

标签: c# .net-core blazor


【解决方案1】:

基本上通知Blazor在循环内更新UI就足够了:

StateHasChanged();

但有几件事。首先,SetPosition 方法不包含任何等待,并且会同步运行。

然后Bounce 可以设为异步,而不是自己创建新任务,以防您不想阻塞主线程。

此外,GameHeight 在当前视图的状态中似乎是一个常量或静态,因此我会在被调用的方法中直接引用它,而不是将其作为参数传递,但这只是个人意见。

另一件事是,确保在已经“弹跳”时不会多次调用 Bounce。

而且我认为逻辑线圈要简化一点。

这是我的建议:

public async Task Bounce()
{
  if(Bouncing) return;

  Bouncing = true;

  while(Ball.CurrentPosition.Y <= GameHeight)
  {
    Ball.CurrentPosition.Y++;
    StateHasChanged();
    await Task.Delay(500);
  }
// in case View has been resized, make sure Ball is not out of boundaries
  Ball.CurrentPosition.Y = GameHeight;
  StateHasChanged();
  Bouncing = false;
}

【讨论】:

  • 我实际上只是使用完全相同的东西让它工作 :) 我要去解决一些边缘碰撞检测
  • 很高兴听到我们有相同的想法。我也认为最好先让它工作,然后写下来重构它
  • 我一直在研究 Testris 代码,但它已经过时,大部分都无法正常工作。
猜你喜欢
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 2023-02-17
  • 2014-07-20
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多