Algodoo技术交流群:668088467,等你来共同进步!
Marble 的形式
EN | CN |
---|---|
Marble Race | 小球竞赛 / 球球比赛 |
Marble Elimination | 小球淘汰赛 |
Survival Proliferation | 生存繁殖赛 |
Shutter Crush | 关闭挤压赛 |
Territory War | 领土战争 |
Castle Destruction | 城堡破坏 / 城堡毁灭 |
Sea Battle / Ship Battle | 海战 / 战船较量 |
Escape from ( ) | 跑路比赛 / 从( )逃离 |
Vocabulary
EN | CN |
---|---|
teleporter | n. 传送器;传送者;瞬移器; |
obstacle | n. 障碍物;干扰物;障碍;干扰; |
spinner | n. 纺纱机;旋转者; |
录屏比例
屏幕分辨率 | 参考的矩形 | Zoom |
---|---|---|
FHD (1920x1080) | size = [38.4, 21.6] | 0.1952 |
2K (2560x1440) - Full Screen | size = [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: 程序启动后的每一帧都在执行,与拟真运行按钮无关
设置速有拖尾的小球
- 用圆形工具画一个直径
0.4
m 的小球 - 右键 > Appearance > 取消 Draw Borders 和 Draw circle cake
- 右键 > Geometry actions > Attach tracer
- 右键 > Tracers > 设置 Fade time:
0.35
s 和 Diameter:0.4
m
设置圆环
初始装小球的圆形容器
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 (旋转的转动矩形长条):
- 用矩形工具画一个 8*1m 的矩形长条
- 右键长条 > Geometry actions > Add center axle
- 右键轴承 > Axles > 勾Motor > Motor torque:
+inf
Nm (如果要反着转勾Reverse) - 右键轴承 > Appearance > 设置透明度A为
0
定义一个晋级名额的变量
- 按
F10
打开控制台 - 输入
scene.my.spot1 = 17
(这一关共有18个球,需要淘汰一个,所以晋级的球是17个) - 按 Enter
- 按 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时,让障碍物、红色回家区、和绿色过关区等消失
-
选中想要让消失的物件
-
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
-
画两个关卡区
-
设置绿色过关条:
oncollide = (e)=>{scene.my.g2.timetolive = 0; e.other.pos = [0, 1]}
设置“摄像机”:Material > Friction:
0.60
, Restitution:0
; adhesion =+inf
-
设置两个挡板:
onSpawn = (e)=>{scene.my.g2 = e.this}
(让挡板随着过关进度而消失);
-
Material > Density
+inf
, Mass:+inf
进阶版的关卡切换
MMor6_java. (January 4, 2024). Algodoo教程,草履虫都能学会的关卡切换 [Video]. Bilibili. https://www.bilibili.com/video/BV1UW4y1P7Gd/?t=189
-
在上下两个关卡的中心各画一个正方形
-
设置上面那个关卡中心的正方形:
onSpawn = (e)=>{scene.my.pos1 = pos}
-
设置下面那个关卡中心的正方形:
onSpawn = (e)=>{scene.my.pos2 = pos}
-
设置绿色过关条:
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的物体在移动,摄像机跟随这个物体在移动,通过这种方式达到摄像机在移动的效果
-
画一个物体,设置宽高
size = [38.4, 21.6]
-
通过 postStep 设置这个物体匀速向右移动
postStep = (e)=>{ pos = pos + [0.05, 0]}
-
右键此物体 >
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 如何制作可控制的摄像机
如何制作可控制的摄像机 - 用设置上下左右按键作为快捷键的方法来实现- 画一个正方形
- Material > Density
0.0100
kg/m² - Collision layers > 取消选所有 A-J 的勾
- Selection > 勾上
Follow
- Appearance > A
0
%, 取消Draw borders
的勾 - 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个物体:小球、过关绿条、装小球的框、显示名字的矩形;
步骤:
-
在 Console 定义一个排名的变量和一个小球名字的变量
scene.my.place = 0; scene.my.marbleName = "";
-
设置每个小球素材名字
materialName = "Red";
-
设置过关绿条,以下方法有点笨拙
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]}:{}; }
-
装小球的框:画四个长条形成一个框,透明度设置为0
-
设置显示名字的每个矩形
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 }