难度:入门
类别:编程
基本范式
事件驱动和主循环是程序结构的两大主要范式。它们都广泛应用于各类应用程序中。BASIC8程序的最外层结构基于主循环,其中一段代码应每秒运行多次;每个循环称为一帧。代码运行速度为30 FPS,而渲染速度为60 FPS。
程序的最小设置可简化为:
def update(delta)
enddef
update_with(driver())
BASIC8程序自上而下执行。DRIVER()函数始终返回当前程序的唯一活动驱动程序;UPDATE_WITH(drv [, r])函数告诉驱动程序如何运行此程序,在这种情况下,它会查找名为“UPDATE”的例程。或者,如果你希望显式使用不同的例程名称,例如“BLAH”,可以使用以下代码:
def blah(delta)
enddef
update_with(driver(), call(blah))
或者使用字符串指定符来实现相同目的:
update_with(driver(), "blah")
还可以使用LAMBDA创建匿名的更新例程:
update_with
(
driver(),
lambda (delta)
(
)
)
“delta”参数表示自上次更新以来经过的时间(以秒为单位),这对于计算与时间相关的变化非常有用。例如:通过匀速直线运动移动圆形:
x = 0
def update(delta)
x = x + delta * 10
circ x, 63, 5, rgba(0, 0, 255)
enddef
update_with(driver(), call(update))
【delta】存在的原因是,在实际情况中,每帧的运行时间可能会比预期稍短或稍长,因此需要一种方法来表示实际的时间间隔。
也可以手动创建无限循环,而不是使用例程作为主循环:
x = 0
while true
delta = sync
x = x + delta * 10
circ x, 63, 5, rgba(0, 0, 255)
wend
你必须每帧手动调用【SYNC】函数,向驱动程序提交一个周期,该函数会返回【delta】时间。
主循环模式在包括游戏在内的多个领域中都有应用,这是更新和渲染内容的基础部分。这并不是说不能用事件驱动范式来组织程序的其他部分,不过那就是另一个话题了。
加载资源
LOAD_RESOURCE(path)函数用于从磁盘内容中加载资源,它可以加载精灵、地图或量化图像,详情请查阅手册。
与上述函数类似,LOAD_BLANK(y, w, h, n = 1)同样会返回一个已加载的资源,但它加载的是空白资源,而非从磁盘加载。
通过上述任一函数加载的资源没有区别,你都可以使用*GET、*SET函数访问像素,或者以相同方式渲染它们。这将在其他指南中进行说明。
有时我们需要从一个资源模板实例化多个实例,例如生成大量敌人。CLONE(g)用于从现有资源创建一个副本实例,可将精灵、地图(单层或多层)以及量化图像中的任意一种传递给"g"。
RGBA(r, g, b, a = 255)函数通过红、绿、蓝、透明度分量创建颜色,它是值类型而非引用类型,其用法将在其他指南中说明。
UNPACK(c, r, g, b [, a])函数用于从颜色值中解包出各个分量。