最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

自制小球淘汰賽教程(二)傳送門、閃隊(duì)小球以及它們背后的原理

2023-07-26 16:56 作者:灰安教主  | 我要投稿

一、傳送門和碰撞代碼基礎(chǔ)格式

小球淘汰賽里面的傳送門是怎么實(shí)現(xiàn)的呢?

首先,畫(huà)一個(gè)你想用來(lái)當(dāng)傳送門的東西,比如我隨便畫(huà)個(gè)紅色長(zhǎng)方形。

右鍵傳送門,打開(kāi)script腳本選單,找到onCollide.

oncollide的意思是:這個(gè)東西每被碰撞一次,就執(zhí)行一次右邊的代碼。

右邊的代碼默認(rèn)是(e)=>{ },你可以把它理解成代碼格式,這是空代碼,什么效果都沒(méi)有。

今后所有這類(e)=>{ },要書(shū)寫(xiě)代碼時(shí),千萬(wàn)別把(e)=>{ }刪掉!自己的代碼寫(xiě)在大括號(hào)里面。

那么,先看一個(gè)傳送門代碼的實(shí)例:

一個(gè)傳送門代碼


如果你會(huì)英文,知道英文單詞的意思,應(yīng)該一眼就能看明白。

英文字母大小寫(xiě)無(wú)所謂,不影響實(shí)際效果。你可以全部大寫(xiě),全部小寫(xiě),或者大小寫(xiě)混雜都沒(méi)問(wèn)題。

(e)=>{}和e.是代碼格式,先忽略掉。

onCollide(在碰撞時(shí))other(別的)pos(位置)=(等號(hào),是賦值符號(hào))[60,100](一個(gè)具體的位置坐標(biāo))

意思就是,當(dāng)它被碰撞時(shí),撞到它的東西,位置坐標(biāo)就變成[60,100]。

是不是很好理解?

所有onCollide代碼都可以套用這個(gè)格式。

other可以改成this,this表示這個(gè)東西本身,other表示撞到它的東西。

比如,你寫(xiě)e.this.pos = [60,100],意思就是當(dāng)它被碰撞時(shí),這個(gè)東西本身的位置坐標(biāo)變成[60,100]。

e.this.可以省略,直接寫(xiě)pos=[60,100]默認(rèn)就是e.this.。e.other.不能省略。

那么,總結(jié)一下oncollide代碼的基本格式:

等號(hào)左邊:寫(xiě)想要變的屬性的名字,至于名字是啥,去看教程第一章講的,script腳本選單里面那些英文單詞就是屬性名字。

等號(hào)右邊:寫(xiě)你想要的數(shù)值??梢圆粚?xiě)具體數(shù)值,但要注意,不管寫(xiě)什么,格式都保持一致!比如,坐標(biāo)pos是二項(xiàng)數(shù)組,等號(hào)右邊就必須全部是二項(xiàng)數(shù)組,不能寫(xiě)成單個(gè)整數(shù)。

下面看幾個(gè)淘汰賽常用的onCollide代碼實(shí)例:

(這里做展示,我把所有的(e)= > { ?}格式省略掉了,你自己在algodoo里面寫(xiě)代碼時(shí)千萬(wàn)別把(e)= > { ?}刪掉)

①e.other.vel = [5,5]

②e.this.color = e.other.color

③angle = angle + 1

④text = e.other.materialname

⑤color = color -[0,0,0,0.25]


只要看得懂這些英文單詞,你應(yīng)該就大概知道這些代碼會(huì)是什么效果了。

①other(別的)vel(瞬時(shí)速度)=(等號(hào),是賦值符號(hào))[5,5](一個(gè)具體的瞬時(shí)速度)

就是會(huì)給小球特定速度的障礙物,用來(lái)當(dāng)做通關(guān)路徑比較固定的關(guān)卡地板。

②this(這個(gè))color(顏色)=(等號(hào),是賦值符號(hào))other(別的)color(顏色)

被撞之后,它的顏色變成撞它的東西的顏色,這就是能被染色的障礙物。

③(沒(méi)有e.xxxx.前綴,默認(rèn)是e.this)angle(角度)=(等號(hào),是賦值符號(hào))(沒(méi)有e.xxxx.前綴,默認(rèn)是e.this)angle(角度)+1

意思就是,被撞一次,這個(gè)東西的角度值就加一。

④(沒(méi)有e.xxxx.前綴,默認(rèn)是e.this)text(文字)=(等號(hào),是賦值符號(hào)other(別的)materialname(物體名字)

意思就是,被撞一次,它顯示的文字就變成對(duì)方的名字。這就是過(guò)關(guān)區(qū)上方顯示名字的文本框。

⑤color(顏色)=(等號(hào),是賦值符號(hào))color(顏色)-[0,0,0,0.25]

color是個(gè)四項(xiàng)數(shù)組,意思就是,每被撞一次,它的color值的第四項(xiàng)就減少0.25。color第四項(xiàng)是透明度,也就是被撞一次就變得更透明一些。

.

.

.

如果你要使每次碰撞執(zhí)行多個(gè)效果,比如既傳送又改變速度,就用分號(hào)隔開(kāi),像這樣寫(xiě):

(e)=>{

??e.other.pos = [60,100];

??e.other.vel = [5,5]

}

以上就是oncollide代碼的最基本的格式。


二、其他(e)=>{? }



我們可以看到,除了oncollide,其他還有好些地方默認(rèn)寫(xiě)的(e)=>{},代碼書(shū)寫(xiě)方法跟oncollide是一樣的,只是觸發(fā)條件不同。

e.other是oncollide專有的,其他地方?jīng)]有e.other.,但是都有e.this.(當(dāng)然e.this.可以省略不寫(xiě))。

oncollide是碰撞時(shí)才執(zhí)行代碼,那么說(shuō)下其他地方代碼的觸發(fā)條件。

【poststep】當(dāng)場(chǎng)景在運(yùn)行時(shí),這里的代碼就會(huì)一直執(zhí)行。

【update】只要你打開(kāi)了algodoo,不管你有沒(méi)有按空格開(kāi)始運(yùn)行,這里的代碼始終在執(zhí)行。

【onClick】這個(gè)東西被鼠標(biāo)左鍵點(diǎn)擊了,才執(zhí)行代碼。

【onDie】這個(gè)東西以任何方式死了(消失了),就執(zhí)行代碼。

【onHitByLaser】這個(gè)東西被激光照到了,就執(zhí)行代碼。這里可以寫(xiě)e.laser.,讓照到它的激光筆來(lái)執(zhí)行代碼,跟oncollide的e.other.原理相同。

【onKey】我沒(méi)用過(guò),不做介紹。

【onSpawn】這個(gè)東西出現(xiàn)在場(chǎng)景的一瞬間,執(zhí)行代碼。(剛打開(kāi)場(chǎng)景也算onspawn,可用來(lái)記錄自定義函數(shù)。)


三、條件判斷和邏輯判斷

在做傳送門時(shí),有時(shí)候可能會(huì)有這樣的困擾,直接寫(xiě)e.other.pos = [x,y]的話,只要碰到它的東西就都會(huì)傳送。但是,如果我只想讓小球傳送,其他東西碰到不傳送,該怎么辦呢?

這時(shí)候就要用到條件判斷了。

條件判斷和邏輯判斷符號(hào):

> 大于

< 小于

== 等于(條件判斷中的等于是兩個(gè)等號(hào),只有一個(gè)等號(hào)表示賦值)

>= 大于等于

<= 小于等于

!= 不等于

&& 與

|| 或

!非

條件判斷的格式:

條件 ? {符合條件執(zhí)行的代碼}:{不符合條件執(zhí)行的代碼}

當(dāng)然,還是得寫(xiě)在(e)=>{ ?}的大括號(hào)里面,這個(gè)格式始終不能省略。

我們看個(gè)例子,寫(xiě)在oncollide里面的:

e.other.radius == 0.25 ? {

??e.other.pos= [60,100]

}:{}

對(duì)照上面的條件判斷符號(hào),就知道它的意思了

這是傳送門的碰撞代碼,但是加了個(gè)判斷條件:

對(duì)方的半徑是不是等于0.25?如果符號(hào)這個(gè)條件,就執(zhí)行e.other.pos= [60,100],也就是傳送;如果不符合條件,不符合條件代碼是空的,也就是無(wú)事發(fā)生。

這樣,這個(gè)傳送門就“只傳送半徑為0.25的東西”,只要不符合這個(gè)條件,都不會(huì)被傳送門傳走。什么方塊障礙物啊,亂七八糟的多邊形啊,你都沒(méi)有半徑這項(xiàng)屬性,別想著碰我傳送。

。

其他條件判斷和邏輯判斷符號(hào)使用示例:

①在poststep里寫(xiě)

(e)=>{

e.this.colorHSVA(3)<=0? {

????e.this.timetolive = 0

}:{}

}

ColorHSVA(3)是什么意思呢?這種格式表示取數(shù)組中的一個(gè)數(shù)字。我們知道colorHSVA是四項(xiàng)數(shù)組,假設(shè)某個(gè)東西的colorHSVA是[180,0.5,1,0.25],那么colorHSVA(0)表示第一個(gè)數(shù)180,colorHSVA(1)是第二個(gè)數(shù)0.5,colorHSVA(2)是第三個(gè)數(shù)1,colorHSVA(3)是第四個(gè)數(shù)0.25。

對(duì),數(shù)組的編號(hào)是0,1,2,3……的順序,也就是說(shuō),你要取數(shù)組中的第x個(gè)數(shù)字,就得寫(xiě)數(shù)組(x-1)。

回到這個(gè)判斷語(yǔ)句,poststep是運(yùn)行后時(shí)刻執(zhí)行代碼,這東西的colorHSVA第四項(xiàng)是不是小于等于0?如果是,那這東西的存活倒計(jì)時(shí)就變成0;如果不是,就無(wú)事發(fā)生。

配合oncollide里寫(xiě)colorHSVA = colorHSVA - [0,0,0,0.2],就做出了“撞一次就變透明一點(diǎn)的方塊,完全透明就消失”的障礙物,也就是淘汰賽中的“集體打工關(guān)卡”。

②在oncollide里寫(xiě):

e.other.colorHSVA(0) >=165 && e.other.colorHSVA(0)<=195 ? {

??e.other.pos = [60,100]

}:{e.other.pos = [60,90]}

對(duì)照上面的符號(hào)表,意思就是,碰到它的東西colorHSV第一項(xiàng)(也就是色相)是否大于等于165,并且同時(shí)滿足色相小于等于195?(這個(gè)條件就是篩選出色相在165~195的東西,也就是青隊(duì))如果滿足條件(是青隊(duì)的),就傳送到坐標(biāo)[60,100];如果不滿足條件(不是青隊(duì)的),就傳送到坐標(biāo) [60,90]。

總結(jié)一下,條件判斷作用就是分類篩選,只讓符合條件的對(duì)象執(zhí)行代碼。


四、常用數(shù)學(xué)表達(dá)式

前面我們可以看到,oncollide代碼里面,等號(hào)右邊不一定要寫(xiě)具體的數(shù)值,比如angle = angle + 1。

那么,既然能寫(xiě)加號(hào),其他數(shù)學(xué)符號(hào)能不能用呢?

當(dāng)然可以用。

如果你數(shù)學(xué)成績(jī)很差,就用最簡(jiǎn)單的加減乘除吧;如果數(shù)學(xué)還不錯(cuò),可以用取余、三角函數(shù)、對(duì)數(shù)、根號(hào)、勾股定理等更多數(shù)學(xué)表達(dá)。


①基礎(chǔ)運(yùn)算:

+ 加號(hào)

- 減號(hào)

* 乘號(hào)

/ 除號(hào)

()括號(hào) ?四則運(yùn)算當(dāng)然是先乘除后加減,如果想要先加減,請(qǐng)使用括號(hào)提高優(yōu)先級(jí)。

% 取余(也可以寫(xiě)成mod) ?示例:angle % 2 ?就是角度值除以2的余數(shù)。

^?冪運(yùn)算 ?示例:vel ^ 2 ?就是速度的平方

(多項(xiàng)數(shù)組每項(xiàng)都會(huì)執(zhí)行運(yùn)算,比如速度是[3,6],那么vel ^ 2就相當(dāng)于[3 ^ 2 ,6^2]也就是[9,36])

! 用于布爾變量轉(zhuǎn)換,也就是true和false互換。比如我在oncollide里寫(xiě)e.other.heterocollide = ! e.other.heterocollide,heterocollide是無(wú)自身碰撞,意思就是被撞一次,無(wú)自身碰撞如果是true就變成false,如果是false就變成true。


②特殊數(shù)和隨機(jī)數(shù)

math.pi 圓周率,algodoo取的值是3.1415927

math.e 自然常數(shù),algodoo取的值是2.7182817

rand.uniform01 取一個(gè)0~1之間的隨機(jī)數(shù)(每個(gè)數(shù)概率相同)

Rand.direction2D 在[0,0]為圓心、半徑1的圓上,隨機(jī)取一個(gè)坐標(biāo)點(diǎn)(每個(gè)坐標(biāo)概率相同)

Rand.boolean 隨機(jī)生成布爾值,即隨機(jī)選true或false

Rand.normal 取一個(gè)-6~6之間的隨機(jī)數(shù)(一維正態(tài)分布形式)

Rand.normal2D 取一個(gè)每項(xiàng)都在-6~6之間的隨機(jī)二項(xiàng)數(shù)組(二維正態(tài)分布形式)

比如,我想讓碰到的小球隨機(jī)傳送到四個(gè)頂點(diǎn)分別為[0,0],[0,8],[8,0],[8,8]的正方形區(qū)域內(nèi)隨機(jī)坐標(biāo),那就可以在oncollide里寫(xiě)e.other.pos= [8*rand.uniform01 ,8*rand.uniform01].


③實(shí)用進(jìn)階數(shù)學(xué)運(yùn)算

有math.前綴不能省略!正弦和余弦雖然去掉math.也有效,但加上math.可以略微減輕卡頓。

math.sin (x) 正弦

math.cos (x) 余弦

math.tan (x) 正切

math.toInt (x) 取整(去尾法)


④更多數(shù)學(xué)運(yùn)算(淘汰賽中很少用,想整花活的可以看一看)

math.sum ( ?) 求和(括號(hào)里必須是一個(gè)數(shù)組)

math.sqrt (x) 開(kāi)方

math.vec.len ([a,b]) 求一個(gè)二項(xiàng)數(shù)組對(duì)應(yīng)的坐標(biāo)點(diǎn)到[0,0]的長(zhǎng)度,類似勾股定理,比如math.vec.len([3,4])等于5

math.log10 (x) 以10為底的對(duì)數(shù)

math.asin (x) 反正弦

math.acos (x) 反余弦

math.atan (x) 反正切

math.toFloat (x) 轉(zhuǎn)換成浮點(diǎn)值(即有小數(shù)形式)

math.toString (x) 轉(zhuǎn)換成純文本

math.comp.eq(a,b) 比較兩個(gè)值是否相同,如果相同,輸出true;如果不同,輸出false

其他比較函數(shù)同理:

math.comp.g(a,b) a是否大于b

math.comp.ge(a,b) a是否大于等于b

math.comp.l(a,b) a是否小于b

math.comp.le(a,b)a是否小于等于b

math.comp.ne(a,b)a是否不等于b

還有些函數(shù)我都沒(méi)怎么用過(guò),就不列出來(lái)了。


五、閃隊(duì)代碼,以及利用sim.time、system.time或sim.tick實(shí)現(xiàn)動(dòng)態(tài)函數(shù)

sim.time和system.time都是自帶的計(jì)時(shí)代碼。

sim.time:表示這個(gè)場(chǎng)景啟動(dòng)后累計(jì)運(yùn)行的秒數(shù),初始為0,當(dāng)你按下空格開(kāi)始運(yùn)行的時(shí)候,sim.time就持續(xù)計(jì)時(shí);暫停運(yùn)行時(shí),sim.time也暫停增加.

system.time:類似于sim.time,但它是打開(kāi)algodoo的時(shí)候就開(kāi)始計(jì)時(shí)了,你暫停模擬的時(shí)候它照樣在持續(xù)計(jì)時(shí)。

sim.tick:跟sim.time原理一樣,只不過(guò)sim.tick始終是sim.time的60倍。

所有在持續(xù)變化的數(shù)值,都可以利用這三個(gè)動(dòng)態(tài)數(shù)字實(shí)現(xiàn)。

個(gè)人習(xí)慣用sim.time,后面都用sim.time做例子,有時(shí)候用sim.tick。

你應(yīng)該知道基礎(chǔ)的函數(shù)吧,比如y=2x這種。



把x換成sim.time,y換成你想要?jiǎng)討B(tài)變化的值,再把這段代碼放在poststep或update里,就形成了動(dòng)態(tài)函數(shù)。

比如在poststep里寫(xiě):

(e)=>{density = 2 * sim.time}

這個(gè)東西的密度就按照y=2x函數(shù)的圖像變化(從x=0開(kāi)始),也就是運(yùn)行1秒的時(shí)候密度是2,運(yùn)行2秒的時(shí)候密度是4,運(yùn)行114.514秒的時(shí)候密度是229.028.


這樣一來(lái),閃隊(duì)顏色代碼就可以實(shí)現(xiàn)了。

首先搞清楚這個(gè)顏色是怎么閃的。

比如黑白閃就是黑-暗影-灰-銀-白-銀-灰-暗影-黑-……無(wú)色循環(huán)往復(fù)變化,用colorHSVA表示的話,就是H等于0不變,S等于0不變,V在0和1之間循環(huán)往復(fù),A等于1不變。

彩虹則是紅-橙-黃-黃綠-酸橙-……色相0-360循環(huán)變化,用colorHSVA表示的話,就是H從0逐漸增加到360,然后又變回0再逐漸增加到360,如此循環(huán),SVA都是1不變。

那么再找到按照這個(gè)規(guī)律變化的函數(shù),于是我們找到,在0和1之間循環(huán)往復(fù)的正弦函數(shù)y=sin(x)/2 + 0.5,以及符合彩虹變化規(guī)律的取余函數(shù)y = x mod 360.

這樣,把x換成sim.time,y換成algodoo里面對(duì)應(yīng)的屬性,然后個(gè)別數(shù)學(xué)符號(hào)換成algodoo的書(shū)寫(xiě)形式,就得到閃隊(duì)代碼了。

黑白閃:

colorHSVA = [0, 0, math.sin(sim.time ) / 2 + 0.5, 1]

彩虹:

colorHSVA = [sim.time % 360, 1, 1, 1]

寫(xiě)好之后測(cè)試一下,感覺(jué)閃得太快了或太慢了?給sim.time做個(gè)乘法或除法就行。

比如:

黑白閃colorHSVA = [0, 0, math.sin(sim.time * 6 ) / 2 + 0.5, 1]

彩虹colorHSVA = [270*sim.time % 360, 1, 1, 1]

至于乘多少或除以多少,自己看情況調(diào)整頻率即可。

下面列出我自己使用的一些閃隊(duì)代碼,都可以寫(xiě)在poststep里或者update里。始終記住(e)=>{}的格式必須要有!

彩虹: colorHSVA = [270 * sim.time % 360, 1, 1, 1]

暗彩虹:colorHSVA = [270 * sim.time % 360, 1, 0.5, 1]

淺彩虹: colorHSVA = [270 * sim.time % 360, 0.5, 1, 1]

黑白閃: colorHSVA = [0, 0, math.sin(sim.time * 6) / 2 + 0.5, 1]

彩虹閃:colorHSVA = [270 * sim.time % 360, math.sin(sim.time * 6) * 0.5 + 0.5, math.cos(sim.time * 6) * 0.5 + 0.5, 1]

紅黑閃:colorHSVA = [0, 1, math.sin(sim.time * 6) / 2 + 0.5, 1](其他黑閃,把色相的0改成對(duì)應(yīng)數(shù)字就行)

青白閃: colorHSVA = [180, math.sin(sim.time * 6) / 2 + 0.5, 1, 1](其他白閃,把色相的180改成對(duì)應(yīng)數(shù)字就行)

灰暗閃:colorHSVA = [0, 0, math.sin(sim.time * 8) / 5 + 0.4, 1]

隨機(jī)色:

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]

????????}

} : {}

漸變紅:

math.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]

}

(其他漸變單色,自己改色相就行)

更多閃色,知道它閃的規(guī)律,找到對(duì)應(yīng)的函數(shù)就行了。


其他有規(guī)律變化的東西,都可以利用sim.time,system.time,sim.tick加上函數(shù)表達(dá)式來(lái)實(shí)現(xiàn),發(fā)散思維,別被定式限制了。

自制小球淘汰賽教程(二)傳送門、閃隊(duì)小球以及它們背后的原理的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
桐庐县| 外汇| 邳州市| 阿坝县| 云林县| 临潭县| 芷江| 吉林省| 右玉县| 志丹县| 丰顺县| 建昌县| 滕州市| 晋城| 四平市| 信阳市| 宜章县| 和龙市| 紫金县| 平谷区| 富裕县| 当阳市| 宁波市| 江油市| 枞阳县| 湘潭市| 台前县| 怀柔区| 民和| 武陟县| 蒙阴县| 济阳县| 定兴县| 红原县| 册亨县| 正定县| 孝昌县| 辽中县| 阜宁县| 陆河县| 营口市|