循环移动背景类

  /// <summary>
  /// 背景類
  /// </summary>
  TGameCycleBack = class(TLSGameAnimateSprite)
  private
    FSpeed, FPartX: TLSint;
    FTick: Cardinal;
  protected
    procedure DoDraw; override;
    procedure DoProcess(const MoveCount: TLSSingle); override;
  public
    constructor Create(const AParent: TLSGameSprite); override;
    /// <summary>
    /// 卷动速度
    /// </summary>
    property Speed: TLSint read FSpeed write FSpeed;
  end;


在声明中 声明了 

FSpeed 循环背景的移动速度 

FPartX   DoProcess中的移动距离

FTick     时间节点


procedure TGameCycleBack.DoDraw;
  /// <summary>
  /// 四舍五入
  /// </summary>
  function GameRound(AFloat: Single): TLSint;
  begin
    if AFloat - Trunc(AFloat) >= 0.5 then
      Result := Trunc(AFloat) + 1
    else
      Result := Trunc(AFloat);
  end;
var
  bk: TLSGameTexture;
  tick: Cardinal;
  actualx: TLSint;
begin
{ (1000 div GameTimer.FPS) 一个DoPorcess所用的时间 }

  tick := (GameTimer.GetTicks - FTick);   //移动一次的时间间隔
  actualx := FPartX + GameRound(FSpeed * Integer(tick) / (1000 div GameTimer.FPS)); //渲染时实际走的距离
  if actualx >= GameDevice.WindowSize.X then
    actualx := actualx - GameDevice.WindowSize.X;

  bk := GameImages.Items[Self.PatternIndex];
  if actualx > 0 then
  begin
    bk.BoundsRect := LSRect(GameDevice.WindowSize.X - actualx, 0, actualx, GameDevice.WindowSize.Y);
    GameCanvas.UseTexture(bk);
    GameCanvas.Draw2D(LSPoint(Self.X, Self.Y));
  end;

  bk.BoundsRect := LSRect(0, 0, GameDevice.WindowSize.X - actualx, GameDevice.WindowSize.Y);
  GameCanvas.UseTexture(bk);
  GameCanvas.Draw2D(LSPoint(actualx, Self.Y));
end;


这里面涉及到DoDraw和DoProcess的问题

因为DoDraw和DoProcess 的不同步所以 当DoDraw花费的时间长时。导致逻辑运算比绘画要多走, 这样就会出现画面卡。 为了让画面平滑滚动,在DoDraw中做时时的移动渲染, actualx 就是在时间渲染时真正走的距离。在每走一次DoDraw就计算一次,并绘画一次,比在DoProcess中处理移动在DoDraw处理渲染要显的更加平滑。


procedure TGameCycleBack.DoProcess(const MoveCount: TLSSingle);
begin
  inherited;
  FPartX := FPartX + FSpeed;
  if FPartX >= GameDevice.WindowSize.X then
    Dec(FPartX, GameDevice.WindowSize.X);

  FTick := GameTimer.GetTicks;
end;



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值