Algodoo 学习笔记 - Marble Race in Algodoo with Thyme Script

Algodoo技术交流群

Algodoo技术交流群:668088467,等你来共同进步!


Marble 的形式
ENCN
Marble Race小球竞赛 / 球球比赛
Marble Elimination小球淘汰赛
Survival Proliferation生存繁殖赛
Shutter Crush关闭挤压赛
Territory War领土战争
Castle Destruction城堡破坏 / 城堡毁灭
Sea Battle / Ship Battle海战 / 战船较量
Escape from ( )跑路比赛 / 从( )逃离
Vocabulary
ENCN
teleportern. 传送器;传送者;瞬移器;
obstaclen. 障碍物;干扰物;障碍;干扰;
spinnern. 纺纱机;旋转者;
录屏比例
屏幕分辨率参考的矩形Zoom
FHD (1920x1080)size = [38.4, 21.6]0.1952
2K (2560x1440) - Full Screensize = [38.4, 21.6]0.2465

jmd丶. (July 17, 2023). 【Algodoo教程】从0开始制作小球淘汰赛#1-基本代码和关卡设计 [Video]. Bilibili. https://www.bilibili.com/video/BV17h4y117Fy

postStep 和 update

postStep: 接下运行按钮后的每一帧都在执行,与拟真运行按钮的状态有关
update: 程序启动后的每一帧都在执行,与拟真运行按钮无关

设置速有拖尾的小球
  1. 用圆形工具画一个直径 0.4m 的小球
  2. 右键 > Appearance > 取消 Draw Borders 和 Draw circle cake
  3. 右键 > Geometry actions > Attach tracer
  4. 右键 > Tracers > 设置 Fade time: 0.35s 和 Diameter: 0.4m
设置圆环

初始装小球的圆形容器

OnCollide = (e)=>{e.other.pos = pos} 

当两个物体(自己和其它)碰撞发生时,自己的位置赋值给其它物体的位置(改变其它物体的位置为自己的位置)

设置模糊红球

当球碰到红色条块的回家区失败时,被传送到模糊红球的重新开始位置

update = (e)=>{scene.my.p1 = pos}

update 用于在每次场景更新时执行指定的操作。scene.my.p1其实就是模糊红球的中心,它是一个变量,scene是指当前场景,my是自定义属性的命名空间,p1是一个自定义位置的变量。这行代码的意思是在每次场景更新时,将pos的值赋给场景中的自定义p1。

设置模糊绿球

当球碰到绿色条块的过关区成功时,被传送到模糊绿球的过关等待区域

update = (e)=>{scene.my.p1f = pos}

scene.my.p1f其实就是模糊绿球的中心。

设置 Spinner (旋转的转动矩形长条):
  1. 用矩形工具画一个 8*1m 的矩形长条
  2. 右键长条 > Geometry actions > Add center axle
  3. 右键轴承 > Axles > 勾Motor > Motor torque: +inf Nm (如果要反着转勾Reverse)
  4. 右键轴承 > Appearance > 设置透明度A为0
定义一个晋级名额的变量
  1. F10打开控制台
  2. 输入 scene.my.spot1 = 17 (这一关共有18个球,需要淘汰一个,所以晋级的球是17个)
  3. 按 Enter
  4. 按 Esc 退出控制台
设置红色条块的回家区
onCollide = (e)=>{e.other.pos = scene.my.p1}

碰撞到回家区的小球被传送到重新开始位置(模糊红球中心)

设置绿色条块的过关区
onCollide = (e)=>{e.other.pos = scene.my.p1f; scene.my.spot1 = scene.my.spot1-1}
  • 碰撞到过关区的小球被传送到等待开始的区域(模糊绿球中心);
  • 每当一个球碰到绿色条块而过关,就将晋级名额减1
设置晋级名额

弄个框打上文字固定住在背景上,然后:

update = (e)=>{text = "" + scene.my.spot1}
设置圆环的快捷控制键

右键圆环 > Controller > Destroy key: 1 (按1键删除圆环)

设置让一些物体消失

当晋级名额为0时,让障碍物、红色回家区、和绿色过关区等消失

  1. 选中想要让消失的物件

  2. Scripting Menu:

    postStep = (e)=>{scene.my.spot1<=0?{timetolive = 0}:{}}
    

    晋级名额是否小于或等于0,如果成立,物体存在的时间(timetolive)等于0;如果不成立,留空什么也不做{}


制作 Teleporter

Dutchboi Marble. (July 6, 2023). Algodoo marble race tutorial (Bonus video) [Video]. YouTube. https://youtu.be/qsppn_3BuPs?si=jkDSn5exGfXwvqsP&t=138

一个转动的红色圆形,如果有小球碰到它,小球就回家,相当于回家区

设置 Obstacle (让小球有动力的物体)

Dutchboi Marble. (July 6, 2023). Algodoo marble race tutorial (Bonus video) [Video]. YouTube. https://youtu.be/qsppn_3BuPs?si=jkDSn5exGfXwvqsP&t=311

在视频中,它叫做 obstacle, 当小球碰到这个物体时,给小球一个x轴和y轴的加速度,使小球能继续运动。这会使人产生小球自身有动力的错觉,而实际上是这个物体给了小球动力。

  • 小球向右上方向加速度

    onCollide = (e) =>{e.other.vel = [1, 2]}
    

    小球向左上方向加速度

  • onCollide = (e) =>{e.other.vel = [-1, 2]}
    

Script 菜单功能介绍

AssryGG. (January 22, 2024). 【Algodoo教程#2】移动物件?黑白闪颜色?math函数? [Video]. Bilibili. https://www.bilibili.com/video/BV1864y1P7Ja/?t=94

Script菜单每栏都是不同的变量,它们分为执行变量非执行变量,而且部分非执行变量是不可直接修改的。

  • Script 菜单左上的输入框 可以创建变量(例1:输入 _a = 0,创建了一个_a的变量并赋值为0;例2:输入scene.my.abc = 0 ,创建一个全局变量abc并赋值为0)

  • adhesion = 0 附着力

  • airFrictionMult = 1 空气摩擦指数

  • angle = 0 物体倾斜角度

  • angvel = 0 物体转速

  • area = 0 物体面积

  • attraction = 0 引力

  • attractionType = 2 引力衰减(默认为平方,把 材质 > 引力 拉大一点,它就会出现引力衰减的线性和平方的两种形式)

  • body = 233 类似物件ID,无法修改,无法确定它的值

  • collideSet = 1 (对就右键 > Collision layers 里面的层:Collision layer A=1, B=2, AB=3, C=4, AC=5, BC=6, ABC=7, D=8, AD=9, BD=10, ABD=11, CD=12…)

  • collideWater = true 可否与液体作用

  • color = [0.5, 0.0, 0.0, 1.0] RGB种颜色

  • colorHSVA = [0.0, 1.0, 0.5, 1.0] 采用色调、饱和度、亮度和透明度来表示种颜色

  • density = 2 密度(对应 Material > Density)

  • drawBorder = true 物体边框(对应 Appearance > Draw borders)

  • edgeBlur = 0 羽化边缘(对应 Appearance > Edge blur)

  • entityID = 239 实体ID(理解为物体ID,无法修改)

  • friction = 0.5 摩擦力(对应 Material > Friction)

  • geomID = 150 几何ID(类似物体ID,无法修改)

  • glued = false 黏附到背景(对应 > Geometry actions > Glue to background / Loosen)

  • heteroCollide = false 是否无自身碰撞(hetero /'het(ə)rəʊ/ adj. 异性恋的。对应 Collision layers > No self collision,它的作用是:如果两个物体是在同一碰撞层A,这两个物体会弹开,如果等于 true 或勾选了 No self collision,那么这两个物体就不会弹开)

  • immortal = false 设为不灭(对应 Material > Immortal)

  • inertiaMultiplier = 1.0 惯性乘倍 (inertia /ɪˈnɜːʃə/ n. 〈物〉惯性)

  • killer = false 杀手(对应 Material > Killer)

  • materialName = “redSquare” 物件名称

  • materialVelocity = 0 物体速度(正左负右:如果一个设置为正数,这个物体碰到地面后向左运动,反之,如果设置为负数,这个物体碰到地面后向右运动;或者可以理解为物体碰到地面后瞬间产生一个动量)

  • onClick = (e)=>{} 当此物体被点击后……(这是执行变量)

    • 例1:

      onClick = (e)=>{angle = angle + 1}
      

      点模拟后,每点击一次这个物体后,物体都会在角度上旋转加1

    • 例2:

      onClick = (e)=>{timetolive = 0}
      

      当点击这个物体后,这个物体就死亡

  • onCollide = (e)=>{} 当此物体被碰撞后……例:

    onCollide = (e)=>{e.other.timetolive = 0}
    

    当别的物体碰撞到此物体,别的物体立即消失

  • onDie= (e)=>{} 当此物体死亡后……(很重要,详细讲解:https://www.bilibili.com/video/BV1864y1P7Ja/?t=1068 )

  • onKey= (e)=>{} 当按下键盘时,此物体……(不是很常用)例:

    onKey = (e)=>{timetolive = 0}
    

    当按下任意键时,此物体消失

  • onSpawn= (e)=>{} 当物体被生成时……

  • onHitByLaser = (e)=>{} 当物体被激光击中时…… 例:

    (e)=>{colorHSVA = [120, 1, 1, 1] 
    
  • opaqueBorders = true 是否强制绘出物件边框(opaque /əʊˈpeɪk/ adj. 不透明的。当物体的A是有透明度的时候,对应 Appearance > 勾上 Draw borders 后,就会出现 Opaque borders)

  • pos = [-1, 2] 物体的坐标 ()

  • postStep = (e)=>{} 拟真时,时刻都在执行…… 例:

    postStep = (e)=>{pos = [pos(0) + 0.1, pos(1) - 0.1]} 
    

    此物体的坐标时刻都在向右下运动,因为pos是一个数组,所以pos(0)其实就是X坐标值,pos(1)是Y坐标值;此例子或者也可以写成:

    postStep = (e)=>{pos = pos + [0.1, -0.1]}
    
  • protractor = true 量角器(圆形物体才有)

  • radius = 4 半径

  • reflectiveness = 1 液体反射率

  • refractiveIndex = 1 折射指数(相当于将物体当成一面镜子,将物体的折射指数设置为10,然后放一个激光斜的射上去就可以看到效果)

  • resources = [] 资料包&资源

  • restitution = 0.5 弹性 (对应 Material > Restitution。例如此物体碰到地面后,可以回弹多高)

  • ruler = true 标尺(画个矩形,设置为 true,矩形上就有标尺)

  • showForceArrows = false 可视化力 (对应 Appearance > Forces)

  • showMomentum = false 可视化动量(对应 Appearance > Monentum)

  • showVelocity = false 可视化速度 (对应 Appearance > Velocity)

  • size = [3, 3] 物体的尺寸(仅限矩形或正方形,圆形没有size这个变量)

  • text = “” 物体上的文本 (以下text前缘的所有值的调整在 右键 > Text 里面)

  • textColor = [1, 1, 1, 1] 文本颜色

  • textConstrained = true 限制文本框 (将文件限制在这个矩形的范围内)

  • textFont = “Verdana” 字体

  • textFontSize = 32 字体解析度(f越大越清晰,最大可以设置 4096)

  • textScale = 0.5 字体大小

  • texture = “” 材质&纹理 (对应 Appearance > Texture )

  • textureClamped = [false, false] 固定材质

  • textureMatrix = [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0] 材质纹理

  • timeToLive = ∞ 物体剩余存活时间

  • update = (e)=>{} 重复执行……(只要打开软件,update就在执行)

  • vel = [0, 0] 物体动量(给物体一个方向的力。例1,设置[20, 0],当物体碰到地面时向右边运动,并且会衰减;例2:设置[20, 20],就可以让物体成一个抛物线运动并衰减)

  • velocityDamping = [0, 0, 0] 动量阻尼 (damp v. 阻尼)

  • zDepth = 5 物体的三维层级

Math 函数

AssryGG. (January 22, 2024). 【Algodoo教程#2】移动物件?黑白闪颜色?math函数? [Video]. Bilibili. https://www.bilibili.com/video/BV1864y1P7Ja/?t=3011

Thyme 中的函数,分不同的类,一级类为最高类,例如:e.other.pos 中的 e 就是一级类,other 是二级类。

acos 反余弦 / asin 反正弦 / atan 反正切 / cos 余弦 / devide 除 / e 自然数 / log 对数 / max 最大值 / min 最小值 / mod 求余数 / multiply 乘 / negate 相反数 / pi 圆周率 / pow 幂运算 / sin 正弦 / sqrt 开二次根 / subtract 求差 / sum 求和 / tan 正切 / vec.dist 距离 / vec.len 长度


变量解释
  • sim.time 是 Algodoo 模拟中的时间,它表示模拟从开始到当前的经过的时间。当你在模拟中按下播放按钮开始模拟时,sim.time 开始递增,表示模拟的进行。通常情况下,sim.time 是一个随着模拟进行而不断增加的数值,以秒为单位。
  • system.time 是指计算机系统的当前时间。它反映了现实世界中的时间流逝。与 sim.time 不同,system.time 是实时的,它随着现实时间的推移而变化。在编写 Thyme 脚本时,你可以使用 system.time 来执行基于系统时间的操作,比如在特定时间触发事件,或者计算某些时间间隔。

草履虫版的关卡切换

MMor6_java. (January 4, 2024). Algodoo教程,草履虫都能学会的关卡切换 [Video]. Bilibili. https://www.bilibili.com/video/BV1UW4y1P7Gd

  1. 画两个关卡区

  2. 设置绿色过关条:

    oncollide = (e)=>{scene.my.g2.timetolive = 0; e.other.pos = [0, 1]} 
    

    设置“摄像机”:Material > Friction: 0.60, Restitution: 0 ; adhesion = +inf

  3. 设置两个挡板:

    onSpawn = (e)=>{scene.my.g2 = e.this}
    

    (让挡板随着过关进度而消失);

  4. Material > Density +inf, Mass: +inf

进阶版的关卡切换

MMor6_java. (January 4, 2024). Algodoo教程,草履虫都能学会的关卡切换 [Video]. Bilibili. https://www.bilibili.com/video/BV1UW4y1P7Gd/?t=189

  1. 在上下两个关卡的中心各画一个正方形

  2. 设置上面那个关卡中心的正方形:

    onSpawn = (e)=>{scene.my.pos1 = pos} 
    
  3. 设置下面那个关卡中心的正方形:

    onSpawn = (e)=>{scene.my.pos2 = pos} 
    
  4. 设置绿色过关条:

    oncollide = (e)=>{poststep = (e)=>{scene.camera.pan = lerp(scene.camera.pan, scene.my.pos2, 0.05)}; e.other.pos = scene.my.pos2}
    

    0.05的值:调小切换速度变慢;调大切换速度变快


摄像机跟随某个物体移动

设置一个透明度为0的物体在移动,摄像机跟随这个物体在移动,通过这种方式达到摄像机在移动的效果

  1. 画一个物体,设置宽高

    size =  [38.4, 21.6]
    
  2. 通过 postStep 设置这个物体匀速向右移动

    postStep = (e)=>{ pos = pos + [0.05, 0]}
    
  3. 右键此物体 > Geometry actions > Glue to background, Selection > Follow, Appearance > A: 0

设置这个物体先水平运动,X坐标达到100后,再垂直向下移动

postStep = (e)=>{
    pos(0) < 100 ? {
        pos = pos + [0.05, 0]
    } : {
        pos = pos + [0, -0.05]
    }
}

Algodoo Tutorial [Play List]

Fredrik [Algodoo]. (February 17, 2022). Algodoo Tutorial [Video]. YouTube. https://www.youtube.com/watch?v=5dGrlHQBgVk&list=PLzv5qZecZ0xlFT4sxb8d08Px7MxeZDNlt

  • How To Make Rainbow and Monochrome Marble 如何制作彩虹和黑白小球
  • How To Make Starting Circle for Marble Race in Algodoo 如何为小球竞赛制作开始的圆圈
  • How To Make Controllable Camera 如何制作可控制的摄像机
    如何制作可控制的摄像机 - 用设置上下左右按键作为快捷键的方法来实现
    1. 画一个正方形
    2. Material > Density 0.0100 kg/m²
    3. Collision layers > 取消选所有 A-J 的勾
    4. Selection > 勾上 Follow
    5. Appearance > A 0%, 取消Draw borders的勾
    6. Controller > Geometry controller > 按任意一个方向键来将快捷键设计为上下左右方向键 (可以在 Controller acceleration 中调加速)
  • How To Make Teleporter 如何制作传送器
  • How To Make Bowl 如何制作在小球竞赛中像碗形漏斗一样的容器
  • How to Make Elimination System for Marble Race 如何为小球竞赛制作淘汰系统
  • How to Make Advanced Elimination System 如何为小球竞赛制作高级的淘汰系统
  • How To Make Marble Kart 如何制作小球车(实际上像一个运动的哑铃)
  • How To Make Anti-Gravitational Kart 如何用推进器制作反重力车
  • How To Make Name Shower in Algodoo 如何制作名字显示板(可应用于 Leaderboard 或 排行榜)

Marble Race Tutorials [Play List]

Algorox. (February 6, 2016). Marble Race Tutorials [Video]. YouTube. https://www.youtube.com/watch?v=Lzq1aDCPBDA&list=PLLg3NKj4Z9HdvgTgFUJRF0PJ-N-x-tFtX

  • Algodoo Basics 基础知识

  • Marble 小球制作

  • Track 制作轨道

  • Spinner 旋转器

  • Text 文字

  • Conveyor 传送带

  • Sprites 小精灵

  • Trampoline 蹦床

  • Controller 控制器(用方向键控制视图)

  • Pump 抽水机

  • Track+ 轨道+

  • Snake 蛇形轨道

  • Elevator 升降机 / 电梯

  • Teleporter 传送器 / 瞬移器 / 传送者 (实际上就是过关绿条和回家红条)

  • Gravity Pad 重力垫 (原理:设置当别的物体碰到下面的重力垫时 density 变小;碰到下面的重力垫时 density 变大;

    • 上浮:

      onCollide = (e)=>{e.other.density = 0.005}
      

      注意:不能写0,否则小球将会不见了

    • 恢复默认下降:

      onCollide = (e)=>{e.other.density = 2}
      
  • Velocity Pad 速度垫 (原理:当别的物体碰到速度垫时,给别的物体一个方向的力)

  • Alternator 交替者(当小球从上方落下时,会使这个装置左右摇摆)

  • Organizer / Sorter 组织者 (实际上就是放在圆形中的一个自己会转动的装置)


How to make an athlete in Algodoo 如何制作火柴人(没动画)

CXX425.(January 4, 2022). How to make an athlete in Algodoo | Algodoo Tutorials - Basic [Video]. YouTube. https://www.youtube.com/watch?v=sCqV2GUqm7I


How to make an algicosathlon 如何制作火柴人 (没动画)

Algodoo Blue. (August 9, 2021). How to make an algicosathlon [Video]. YouTube. https://www.youtube.com/watch?v=d32p81lhTsI


How to make podium 如何制作领奖台

小球比赛最终的排名位置
NMR. (October 4, 2021). How to make podium in Algodoo [Video]. YouTube. https://www.youtube.com/watch?v=Ea5qxfcVKeQ


Making a Walker 制作一个走路的人

necoyuri. (April 25, 2021). [Algodoo] Making a Walker [Video]. YouTube. https://www.youtube.com/watch?v=4N_kBcLazZ0


How to make Soft Objects 如何制作柔软的物体

necoyuri. (November 27, 2022). [Algodoo] How to make Soft Objects [Video]. YouTube. https://www.youtube.com/watch?v=e_WzS3BKAgo


How to Make a Zombie Marble 如何制作僵尸小球

实际上就是它碰到别的球时,别的球会变成和它一样的颜色
Foxrish. (May 30, 2022). How to Make a Zombie Marble in Algodoo! [Video]. YouTube. https://www.youtube.com/watch?v=EzX9-PAzShg


How to make an Alternating Spinner 如何制作一个来回旋转的十字旋转器

CXX425. (March 22, 2022). How to make an Alternating Spinner in Algodoo | Algodoo Tutorials - Medium [Video]. YouTube. https://www.youtube.com/watch?v=3Jl_ckNvm_c


How to Make a Leaderboard 如何制作排行榜

Algodoodle 2020. (November 16, 2020). How to Make a Leaderboard In Algodoo! [Video]. YouTube. https://www.youtube.com/watch?v=rSXVrOz4Djk


闪球制作教程!

不会玩的萌新a. (September 30, 2023). 闪球制作教程! [Video]. Bilibili. https://www.bilibili.com/video/BV1i34y1G7wy/

首先我们要清楚,闪烁的代码不能直接写在小球里,不然有些关卡会卡死。

  • 彩虹渐变:

    postStep = (e)=>{colorHSVA = [(system.time * 360) % 360, 1.0, 1.0, 1.0]} 
    
  • 彩虹闪1:

    postStep = (e)=>{scene.my.rainbow1 = color; colorHSVA = [270 * sim.time % 360, 1, 1, 1]}
    
  • 彩虹闪2:

    postStep = (e)=>{scene.my.rainbow2 = color; colorHSVA = [270 * sim.time % 360, 1, 0.5, 1]}
    
  • 彩虹闪3:

    postStep = (e)=>{scene.my.rainbow3 = color; colorHSVA = [270 * sim.time % 360, 0.5, 1, 1]}
    
  • 彩虹闪4:

    postStep = (e)=>{scene.my.rainbow4 = color; colorHSVA = [270 * sim.time % 360, math.sin(sim.time * 6) * 0.5 + 0.5, math.cos(sim.time * 6) * 0.5 + 0.5, 1]}
    
  • 黑白渐变:

    postStep = (e)=>{colorHSVA = [0.0, 0.0, math.sin(system.time * 5) * 0.5 + 0.5, 1.0]}
    
  • 黑白闪:

    postStep = (e)=>{scene.my.mono = color; colorHSVA = [0, 0, math.sin(sim.time * 6) / 2 + 0.5, 1]}
    
  • 红色渐变:

    postStep = (e)=>{scene.my.redGradient = color; sin(sim.time * 3) / 2 >= 0 ? {colorHSVA = [0, 1, 1 - math.sin(sim.time * 3) / 2, 1]} : {colorHSVA = [0, 1 + math.sin(sim.time * 3) / 2, 1, 1]}}
    
  • 橙色渐变:

    postStep = (e)=>{scene.my.orangeGradient = color; sin(sim.time * 3) / 2 >= 0 ? {colorHSVA = [30, 1, 1 - math.sin(sim.time * 3) / 2, 1]} : {colorHSVA = [30, 1 + math.sin(sim.time * 3) / 2, 1, 1]}}
    
  • 六段红闪:

    postStep = (e)=>{scene.my.sixSectionRed = color; sim.time % 1.5 < 0.3 ? {color = [0.5, 0, 0, 1]} : {sim.time % 1.5 < 0.6 ? {color = [1, 0, 0, 1]} : {sim.time % 1.5 < 0.9 ? {color = [1, 0.5, 0.5, 1]} : {sim.time % 1.5 < 1.2 ? {color = [0.67, 0.14740002, 0.14740002, 1.0]} : {color = [0.75, 0.14999999, 0.29999998, 1.0]}}}}}
    
  • 红黑闪:

    postStep = (e)=>{scene.my.flashingBetweenRedAndBlack = color; colorHSVA = [0, 1, math.sin(sim.time * 6) / 2 + 0.5, 1]}
    
  • 青白闪:

    postStep = (e)=>{scene.my.flashingBetweenCyanAndWhite = color; colorHSVA = [180, math.sin(sim.time * 6) / 2 + 0.5, 1, 1]}
    
  • 随机颜色:

    postStep = (e)=>{scene.my.randomColor = color; sim.tick % 24 == 0 ? {sim.tick % 96 == 0 ? {colorHSVA = [360 * rand.uniform01, 1, 1, 1]} : {colorHSVA = [360 * rand.uniform01, 0.7 * rand.uniform01 + 0.3, 0.7 * rand.uniform01 + 0.3, 1]}} : {}}
    
  • 暖色彩:

    postStep = (e)=>{scene.my.warmColors= color; sim.time % 1 < 0.7 ? {colorHSVA = [(sim.time % 1) * 128.57 - 30, 1, 1, 1]} : {colorHSVA = [270 - (sim.time % 1) * 300, 1, 1, 1]}}
    
  • 银灰:

    postStep = (e)=>{scene.my.silverGray = color; colorHSVA = [0, 0, math.sin(sim.time * 8) / 5 + 0.6, 1]}
    
  • 指定场景中已经定义的五种闪色 (注意:必须场景中已经定义了这些颜色的变量,否则不起作用) :

    postStep = (e)=>{scene.my.fiveDefinedColor= color; sim.time % 1.5 < 0.3 ? {color = scene.my.mono} : {sim.time % 1.5 < 0.6 ? {color = scene.my.rainbow1} : {sim.time(1.5) < 0.9 ? {color = scene.my.rainbow2} : {sim.time(1.5) < 1.2 ? {color = scene.my.rainbow3} : {color = scene.my.rainbow4}}}}} 
    

小球死亡特效

卜苹果. (January 26, 2023). Algodoo教程:死亡特效 [Video]. Bilibili. https://www.bilibili.com/video/BV1MT411y7xX/

小球碰到杀手后触发死亡特效(小球变大并且透明度降低,直到消失)

onDie = (e)=>{
  scene.addcircle({
    pos := pos;
    update := update;
    radius := radius;
    color := color;
    body := 0;
    drawborder := false;
    drawcake := false;
    collideset := 0;
    poststep := (e)=>{
      radius = radius + 0.01;
      color = color - [0, 0, 0, 0.025];
      if(color(3) <= 0, {
      	timetolive = 0
      })
    }
  })
}

制作排行榜

有4个物体:小球、过关绿条、装小球的框、显示名字的矩形;

步骤:

  1. 在 Console 定义一个排名的变量和一个小球名字的变量

    scene.my.place = 0;
    scene.my.marbleName = "";
    
  2. 设置每个小球素材名字

    materialName = "Red";
    
  3. 设置过关绿条,以下方法有点笨拙

    onCollide = (e)=>{      
          e.other.vel = [0, 0];      
          scene.my.marbleName = e.other.materialName;
          scene.my.place = scene.my.place + 1;
          scene.my.place == 1?{e.other.pos = [-2.6875002, 8.6875]}:{};
          scene.my.place == 2?{e.other.pos = [-2.6874995, 7.937499]}:{};
          scene.my.place == 3?{e.other.pos = [-2.6875, 7.1874981]}:{};  
          scene.my.place == 4?{e.other.pos = [-17.199577, 3.2989619]}:{};  
          scene.my.place == 5?{e.other.pos = [-17.199577, 2.5489626]}:{};  
          scene.my.place == 6?{e.other.pos = [-17.199577, 1.7989632]}:{};  
          scene.my.place == 7?{e.other.pos = [-17.199577, 1.0489612]}:{};  
          scene.my.place == 8?{e.other.pos = [-17.199577, 0.29896256]}:{};  
          scene.my.place == 9?{e.other.pos = [-17.199575, -0.45103908]}:{};  
          scene.my.place == 10?{e.other.pos = [-17.199577, -1.2010362]}:{};  
      }
    
  4. 装小球的框:画四个长条形成一个框,透明度设置为0

  5. 设置显示名字的每个矩形

    postStep = (e)=>{
        scene.my.place == 1 ? {
        	text = scene.my.place + ". " + scene.my.marbleName;
        } : {}
    }
    

生成一个随机数

rand.uniform01: Returns a random float value with range [0, 1] (返回一个0-1之间的浮点数)

  • rand.uniform01 * (max - min) + min 随机生成一个 min 到 max 之间的浮点数,例:

    rand.uniform01 * (5 - 3) + 3
    

    以上是随机生成一个 3-5 之间的浮点数

  • math.toInt(rand.uniform01 * (max - min) + min) 随机生成一个 min 到 max 之间的整数(实际上是通过函数改成整数),例:

    math.toInt(rand.uniform01 * (5 - 3) + 3) 
    

    以上是随机生成一个 3-5 之间的整数


绘制图形

Algodoo Wiki. (n.d.). Thyme Script – Draw a Triangle. Fandom. https://algodoo.fandom.com/wiki/Thyme_Script_%E2%80%93_Draw_a_Triangle

通过 Console 绘制图形,原理只是将多边形的各个顶点相连接,例如绘制一个三角形

Scene.addPolygon {
  surfaces := [[
  	[0.4,0], [1.5,0], [1,1]
  ]];
  color := [0, 0.5, 1, 1];
  drawBorder := false;
};

小球分裂/小球繁殖

玩单机的WBS. (August 20, 2012). [algodoo教程]小球分裂是如何制作的 [Video]. Bilibili. https://www.bilibili.com/video/BV1pb4y1S7H1/

  • 设置分裂的小球

    红色小球初始直径 0.125

    onDie = 
    (e)=>{
        scene.my.redMarbleNumber = scene.my.redMarbleNumber - 1
    }
    
    postStep =
    (e)=>{
        radius > 0.25 ? {
            marble = scene.addCircle({
                pos := pos;
                colorHSVA := colorHSVA;
                radius := 0.125;
                collideSet := collideSet;
                ondie := ondie;
                poststep := poststep;
                update := update;
                onCollide := onCollide;
                drawcake := false
            });
            tracer = scene.addPen({
                pos := pos;
                geom := geomID;
                colorHSVA := colorHSVA;
                size := 0.2;
                zDepth := marble.zDepth - 1;
                fadetime := 0.12
            });
            radius = 0.125;
            scene.my.redMarbleNumber = scene.my.redMarbleNumber + 1
        } : {};
        radius = radius + 0.0003
    }
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值