编程C,C ++,Java,PHP,Ruby,图灵,VB
计算机科学加拿大 
编程C,C ++,Java,PHP,Ruby,图灵,VB  

用户名:   Password: 
 登记登记   
 延迟动画
指数 -> 编程,图灵 -> 图灵教程
查看上一个主题 可打印的版本下载主题利率主题订阅本主题私人信息刷新页面 查看下一个主题
作者 信息
虫子




邮政发布: 2013年6月12日星期三晚10:57  帖子主题:无延迟动画

这里发布的大多数项目至少有一个延迟,以试图调节游戏速度。这可能会在您的计算机上工作,但在您尝试分享它时,由于时钟速度不同,您的时序将完全搞砸。这可以有点随时间减轻.delaysincelast,但为什么不允许您的计算机 在那个业余时间而不是等待的东西?为什么当您可以让它尽可能快地运行时,为什么要在静态帧周围设计您的程序?而不是等待绘制下一个框架,为什么不只是画画 更多框架?

这相对容易,虽然它确实需要一点额外的工作。大多数学生将分配它们的对象静态速度 - 每帧10个像素。除了我们将衡量我们的速度,我们将要做同样的事情 第二。在我们的游戏循环中,我们将计算自我们的最后一个帧以来通过了多少时间,然后决定在此时间应该多远。

让我们从夫妇变量开始:
图灵:
var. x : 真实的 := 50
var. y : 真实的 := 50
var. 速度 : := 100 %速度为每秒像素


我相信你识别x和y,虽然通常它们是整数。在此示例中,我们将使用Reals,因为我们的对象实际上可以少于每帧的像素。我们的速度为每秒以像素为单位是一百个。它应该需要4秒钟从标准输出窗口的底部移动到顶部,而不管您的计算机的速度有多快。

现在我们需要一种方法来决定框架之间经过的时间。图灵有一段时间。显示了该程序运行多长时间的函数。如果我们录制时间。在一帧中,然后再次记录下一帧,我们可以再次从第二个中减去第一个并获得介于之间的时间。

图灵:
var. timeatlastframe. : := 0 %此全局变量记录前一帧中经过的时间
功能 TimesIncelast. : %此函数返回自上次调用此函数以来经过的时间。
    var. t : := 时间流逝 在这里,我们得到了程序开始以来的时间
    var. 出去 : := t - timeatlastframe. %从当前时间中减去最后一个帧的时间
    timeSinceAtFrame := t %记录当前时间,以便我们为下一个帧提供它
    结果 out
结尾 timeSinceLast


现在我们可以计算框架之间的时间,我们可以开始移动的东西。在您的沼泽标准动画中,您只需将速度添加到x或y变量:x:= x +速度。我们在这里做同样的事情,但首先,我们必须将速度乘以自上次帧以来的秒数。此外,由于我们的速度为每秒像素,我们的时间以毫秒为单位,因此我们需要将其划分为一千。因此,向上移动,我们的等式看起来像'y:= y + speed * time_since_last_frame / 1000.0'。
图灵:
如果 钥匙 (key_up_arrow.) 然后
        y += 速度 * T / 1000.0 %t是自上次框架以来的时间
    埃莉丝 钥匙 (key_down_arrow.) 然后
        y -= 速度 * T / 1000.0
    结尾 如果


现在所做的一切都是把它整合在一起。我添加了一个变量延迟,所以你可以看到较慢的计算机上它看起来像什么。按“W”将延迟增加10ms和“s”以减少它。使用箭头键移动。目前有一个计时器,所以你可以看到在屏幕上移动的时间不会改变,无论延迟。
图灵:
%延迟动画
view.set. ('offscreenonly')

var. x : 真实的 := 50
var. y : 真实的 := 50
var. 速度 : := 100 %速度为每秒像素

var. _延迟 : := 0
var._timesincelast. : := 0
var. t :

var. 钥匙 : 大批 char 布尔基

功能 TimesIncelast. :
    var. t : := 时间流逝
    var. 出去 : := t - _timeSinceLast
    _timeSinceLast := t
    结果 out
结尾 timeSinceLast

环形
    t := timeSinceLast
    Input.keydown. (钥匙)
   
    如果 钥匙 (key_up_arrow.) 然后
        y += 速度 * T / 1000.0
    埃莉丝 钥匙 (key_down_arrow.) 然后
        y -= 速度 * T / 1000.0
    结尾 如果
   
    如果 钥匙 (key_left_arrow.) 然后
        x -= 速度 * T / 1000.0
    埃莉丝 钥匙 (key_right_arrow.) 然后
        x += 速度 * T / 1000.0
    结尾 如果
    如果 钥匙 ('W') 然后
        _delay += 10
    埃莉丝 钥匙 (') _延迟 > 0 然后
        _delay -= 10
    结尾 如果
    延迟 (_延迟)
    CLS.
    定位 (1, 1)
    时间流逝/1000.0
    绘制 (圆形的 (x), 圆形的 (y), 10, 10, 红色的)
    view.update.
结尾 环形
赞助
赞助
赞助
赞助
虫子




邮政发布: 2013年6月12日星期三11:32  发布主题:RE:无延迟动画

您还可以将其应用于可变速度移动模型,其中对象加速而不是以恒定速度移动。在这种情况下,我们将Swap出来,为每秒按像素以像素测量的加速度变量进行速度变量。我们还获得X和Y速度变量以每秒像素测量。这再次工作需要更多工作 - 我们需要考虑计算在计算本帧中加速多少时经过的时间以及我们移动的程度。在此示例中,您可以按空格键将球返回到起始位置,以防您丢失它。
图灵:
%延迟动画
view.set. ('offscreenonly')

var. x : 真实的 := 50
var. y : 真实的 := 50
var.velx. : 真实的 := 0 %速度为每秒像素
var.v : 真实的 := 0
var. 加速 : := 400 %加速每秒以像素为单位
var. 减速 : := 200 每秒百分比数量减速,因为没有按下键。

var. _延迟 : := 0
var._timesincelast. : := 0
var. t :

var. 钥匙 : 大批 char 布尔基

功能 TimesIncelast. : %这没有改变
    var. t : := 时间流逝
    var. 出去 : := t - _timeSinceLast
    _timeSinceLast := t
    结果 out
结尾 timeSinceLast

环形
    t := timeSinceLast
    Input.keydown. (钥匙)
   
    如果 钥匙 (key_up_arrow.) 然后
        velY += 加速 * T / 1000.0 在这里,我们增加了我们的加速度纠正了我们的速度
    埃莉丝 钥匙 (key_down_arrow.) 然后
        velY -= 加速 * T / 1000.0
    别的 %如果没有按下键,我们会慢下来
        如果v > 0 然后
            velY -= 减速 * T / 1000.0 如果它是积极的,%会降低速度,再次纠正时间
        埃莉丝v < 0 然后
            velY += 减速 * T / 1000.0 如果它是负数,%增加速度
        结尾 如果
    结尾 如果
   
    如果 钥匙 (key_left_arrow.) 然后 X轴相同的东西
        velX -= 加速 * T / 1000.0
    埃莉丝 钥匙 (key_right_arrow.) 然后
        velX += 加速 * T / 1000.0
    别的
        如果velx. > 0 然后
            velX -= 减速 * T / 1000.0
        埃莉丝velx. < 0 然后
            velX += 减速 * T / 1000.0
        结尾 如果
    结尾 如果
   
    如果 钥匙 ('W') 然后
        _delay += 10
    埃莉丝 钥匙 (') _延迟 > 0 然后
        _delay -= 10
    结尾 如果
   
    如果 钥匙 ('') 然后 按下空格键时,%这会将球返回到起始位置。
        x := 50
        y := 50
        velX := 0
        velY := 0
    结尾 如果
   
    当纠正减速时间时%,我们经常最终在非常小的正面和负速度之间弹跳,因此球永远不会停止。
    %这会纠正它。当速度小于时间的最小可能的减速度时,我们将其设置为0.使用一些运动
    %方程式,我们也可以将x和y值设置为在此时应在球的位置,但这对这一演示并不重要。
    如果velx. < deceleration*t/1000 velx. > -deceleration*t/1000 然后
        velX := 0
    结尾 如果
    如果v < deceleration*t/1000  v > -deceleration*t/1000 然后
        velY := 0
    结尾 如果
   
    y +=v * T / 1000.0 %最终,我们将速度校正为时间校正到x和y值。
    x +=velx. * T / 1000.0
    延迟 (_延迟)
    CLS.
    定位 (1, 1)
    时间流逝/1000.0
    绘制 (圆形的 (x), 圆形的 (y), 10, 10, 红色的)
    view.update.
结尾 环形
托尼




邮政发布: 2013年6月12日星期三11:44  发布主题:RE:无延迟动画

好的。

警告是这假设恒定速度。当一个人想要动画说...跳跃时,事情会变得有些更复杂。 (编辑:已经上面解决的)

基本思想仍然是相同的 - 沿着预期轨迹的位置,物体应该在时间t,并在那里画出。所有相关公式都可以从标准高中物理教科书中获得。

然而,虽然然后步骤平均/循环中间计算,必须小心。当整个跳转的轨迹可以提前计算时,这不应该是一个问题,但如果它一步一步完成(因为可能存在空中运动/碰撞),那么一个人最终有帧率如Quake3影响跳跃的高度 - http://www.psycco.de/125fps/UpsetChaps%20Quake3%20Guide%20-%20Why%20Your%20Framerate%20Affects%20Jumping.htm
最新来自compsci.ca/blog: Tony's 编程博客。 DWite - A. 编程竞赛.
虫子




邮政发布: 2013年6月12日星期三11:55  发布主题:RE:无延迟动画

当实际绘制对象时,我肯定会圆。所有计算都在原始浮点上完成,尽管可能涉及浮点数误差。

实际上,我在减速时将其舍入,这在代码中提到的评论中提到的我提到的_delay的高值时造成了一个问题。我已经在我自己的代码中修复了它,以便在将速度设置为0之前调整X&Y值。
从上一个显示帖子:   
   指数 -> 编程,图灵 -> 图灵教程
查看上一个主题 告诉一个朋友可打印的版本下载主题利率主题订阅本主题私人信息刷新页面 查看下一个主题

11  [ 4 Posts ]
跳到:   


Style:  
搜索: