同人小技巧
玩壞圓型範圍
其實這主要是回應 有辦法用 [圓形範圍] 做出一直線嗎?(人物特效) 此討論串 感謝樓主提供這個有趣的題目 不說那麼多,先給個效果圖 ![]() 沒錯,都是用圓型範圍這個特效弄的 原理: 直接cartesian coordinate(x,y)換成polar coordinate(r,theta)就好啦 ![]() 假如每點的座標是(x,y),而(0,0)就是你人的座標直接將這點換成polar就可: 1. 求半徑r: ![]() 2. 求偏角theta: ![]() (註atan2大致與atan一樣,但避免了除零的情況,同時能回傳完整的角度範圍) (atan 的range -pi<theta<pi, atan2 的range -2pi 至2pi) (由於atan2回傳的是radian而角度要用degree,先轉做deg) https://zh.wikipedia.org/wiki/Atan2 進階:自旋轉特效 |
路亞同人陣
引言 最近小哈開放了路亞模式的同人陣,換句話來說,我們現在可以用路亞來製作同人陣了這可以帶來很多好處: 1.運算可以快一點點(但系統不能長期連續運算路亞,你要隔一段時間讓它運算同人陣和光暈系統) 2.可以用lua的函式庫(這就不需要用我們提供的VAR函式庫) 3.省容量(路亞好像沒有容量限制) 4.用真正的程式路言寫同人 當然,也有限制: 1.其中一名玩家不能手動遊玩,希望假醬的建議被通過 2.路亞程式跟同人程式的溝通只能靠人物說話或人物血量,API欠奉(API要自己寫哦,期待小哈加強同人陣和LUA的溝通) 本中心的路亞同人陣: 路亞闖關BETA:270136 路亞闖關2:270532 基本步驟 1.同人作者要求其中一名玩家用路亞模式來闖關 2.該玩家要用作者提供的程式碼作為他的路亞程式 3.最基本的路亞同人陣就可以玩了 給個例子吧,用下面這條路亞便能0容量玩猜數字了,讚吧 require "sys.game"game.logState("player id = ", me.info.id )--state nil : game init , state 0 : start game, state 1 : enter number, compare and print, state 2 : bingo back to state 1if state == nil then state = 0elseif state == 0 then math.randomseed(os.time()) math.random(); math.random(); math.random() a = 0 b = 100 ans = math.random(a,b) game.log("answer : ".. ans) state = 1elseif state == 1 then me.triggerKeyboard("Enter") for i,e in ipairs(game.events) do if e.type == "talk" then x = tonumber(string.match(e.text,"%d+")) game.log("ans, a, b, x".. ans .. a .. b .. x) if x > ans and x < b then b = x elseif x < ans and x > a then a = x elseif x == ans then state = 2 end end end me.talk("between "..a.." and "..b)elseif state ==2 then me.talk("bingo") state = 3 timedelay = game.now + 1000endif timedelay and state == 3 then if timedelay < game.now then state = 0 end end 不過,這條路亞在路亞修行仍能玩,還未能展現出用路亞寫同人的關鍵技術(玩的時間不多QAQ) 晚些再補充路亞可以怎樣跟同人陣溝通(目前只有人物說話比較易用,其他的不方便用),去真正實現路亞同人陣的真正威力 進階 - LUA同人溝通方法 LUA至同人: me.talk(command) 同人陣中需用「檢查玩家說話內容」的方式,自製API接收來自LUA的指令,並進行動作 同人至LUA: (LUA偵測不到同人AI在說話,不能用人物說話的方式來傳,不知小哈會不會改) 1.設定人物血量(註意:只能傳1至9999的數字) 2.人物名字(註意:名字是靜態資料,你只能讀到人物生成時所用的人物名字,後面無論怎改LUA也讀不了 --下面程式碼示範如何讀取,從同人陣以人物血量的方式傳來的變數資料--用無陣營人物傳資料吧,無陣營都是朋友,取得的朋友列表存至friendsfriends = game.findVisibleFriends()--逐一檢視朋友列表中的朋友,存至friend中for _,friend in pairs(friends) do --如果朋友的id是level,他的生命值資訊存至變數level if friend.info.id == "level" then level = friend.hp --如果朋友的id是input1,他的生命值資訊存至變數a elseif friend.info.id == "input1" then a = friend.hp --如果朋友的id是input2,他的生命值資訊存至變數b elseif friend.info.id == "input2" then b = friend.hp endend 如果大家有更好的方法,歡迎提出~ |
同人陣熱門的計算方法
每週第一次遊玩該任 +1 熱門數,(即重玩不計) 之後一星期內重複遊玩並不計算, 每逢星期五、星期一熱門數除2,並重置上述設定(即是重玩也可以計算一次熱門數) |
儲存玩家說話內容為字串
這東西卡了足足三個月,看到有人發bug回報我才修好(哀 現在小哈已經推出相關功能(打FK臉),本頁可以用教學和相關用途 不須要再求小哈!輕鬆儲存玩家說話內容為字串~ 只不過中文字跟各種符號實在太多,太耗容量 (其實重點是太耗時間,字元都可以存在VAR檔) 目前版本只能存數字、英文字、部分符號 運作原理: 當玩家說話時,系統就將字元0至9、a至z遂個跟玩家的說話內容作比對 若發現比對的內容跟玩家說話內容一致,便存至陣列(用作讀取資料)和字串(用作讀取存檔碼),下次比對之前會將字元附在這個字串上,以繼承之前的比對結果 整個過程就好像DNA的複製過程(由組合TAC開始比對,A對T,C對G;但此處由不知何處開始比對,0對0,1對1,如此類推)。例: 為方便解說,設玩家只會說數字 玩家說:314159265359 系統比對出來的字串(下稱系統串):null(空值) 系統從0-9遂個比對: =>沒有在玩家說話內容中找到0 =>在玩家說話內容中找到1 儲存至字串:say="1" 玩家說:314159265359 系統串: 1 再遂個比: 玩家說:314159265359 系統串:01 =>不對 系統串: 10 =>不對 玩家說:314159265359 系統串:11 =>不對 系統串: 11 =>不對 玩家說:314159265359 系統串:21 =>不對 系統串: 12 =>不對 玩家說:314159265359 系統串:31 =>對上了 儲存至字串:say="31" 之後的比對會在31前或後再加數字 繼續找: 玩家說: 314159265359 系統串:031 =>不對 系統串: 310 =>不對 玩家說: 314159265359 系統串:131 =>不對 系統串: 311 =>不對 玩家說: 314159265359 系統串:231 =>不對 系統串: 312 =>不對 玩家說: 314159265359 系統串:331 =>不對 系統串: 313 =>不對 玩家說: 314159265359 系統串:431 =>不對 系統串: 314 =>對上了 儲存至字串:say="314" 之後的比對會在314前或後再加數字 如此類推 再比對不出數字就表示所有數字已讀取完畢 那麼「變數/say」所儲存的就是玩家說話內容 只要做小小加工,其實這招的運算速度可以快一倍(用特定字串組合作起點),甚至可以做字串運算 不過每個字元需要1容量,或者弄一個VAR檔作資料庫,某FK就懶得弄啦,就請各位自行斟酌考慮要不要加中文或其他符號了 |
光暈人物重量速度轉換
用「重量」來量度人物移動速度真的太抽象 所以某FK在閒來無事下(其實是懶得温DSE),弄了這個兩個表和公式給大家參考 ![]() (圖一) ![]() (圖二) 純粹參考~ 圖一的公式比較可靠 圖二的公式應為 y = 1/(0.0031x+0.0695 希望能幫到大家 |
詳解同人更新 - 執行事件
基本認識 此動作的主要功能就是加速運算和自訂函式 温馨提示 1.不要開著導演面版玩無限loop這招,運算會變慢,而且會很LAG 2.如果你同時開著導演面版又連續使用「執行事件」,恭喜你,你的flash當死了 3.所有動作未執行完,系統是不會觸發另一個事件 運作原理 這動作就是把事件0002的動作都搬來0001來運行,甚至0002未開始檢查也沒問題,亦不會損0002的重覆次數,但0002不能是「已結束並不在檢查狀態」 即是怎樣呢? 同人程式碼以「事件」作單位,以某個次序排列一起,然後系統會逐一且盲目地檢查各個事件,通過的話則執行,否則檢查下一個事件。就是因為這個原因,越多事件,運算就越慢。而這動作則可以透過減少盲目檢查,加速運算。 { 設有事件A、B、C: 運作次序:A->B->C 不使用執行事件:盲目找出A然後執行->盲目找出B然後執行->盲目找出C然後執行 使用執行事件:盲目找出A然後執行->直接執行B->直接執行C } 回到最上文的例子,再解釋一下各個選項: 選項1:不看檢查,直接執行事件0002的動作 選項2:被指定的事件 (事件0002) 的檢查、動作都無條件執行一次 (即是方便某FK玩null變數宣告法(X),見圖一) 選項3:要檢查都通過了才執行事件0002的動作 (迷聲:如果都通過了,不用通過這個動作也會自行觸發事件0002啦) 不過要注意一下每項檢查和動作執行的順序(見圖一) 進階槪念 - for迴圈 然後某FK做了一個測試,用這招來玩for-loop,效果非常好~ 運算目標:a不斷遞增,直至a=10 結果0.1秒就運算完畢,舊招是要用上1秒才搞定 ![]() 上圖:使用新招的for loop^ 圖三:使用舊招的for loop 這還可以在事件運行中for 迴圈,見下圖 ![]() 1.s被設為1 2.執行0002 3.a遞增1 4.若a<10,重複2. 5.s被設為2 輸出: >任務變數: s=>1 >任務變數: a=>1 >任務變數: a=>2 >任務變數: a=>3 >任務變數: a=>4 >任務變數: a=>5 >任務變數: a=>6 >任務變數: a=>7 >任務變數: a=>8 >任務變數: a=>9 >任務變數: a=>10 >任務變數: s=>2 [00:00:18] 事件觸發:0001 進階槪念 - 擺脫連續執行上限 某FK又做了一次調試,就是自己指定執行自己,即在事件0001執行事件0001的動作(圖四) 本來以為flash會crash,結果沒有... 這是應該小哈猜到有人會這樣玩,所以當累積指定次數後(不管是在哪個事件指定),都會跳過那個事件。 例如圖四的例子 運算目標:a不斷遞增,直至a=20000,然後說出a的值 結果(圖五): 系統把那個事件直接刪掉 裡面的動作碰也沒碰過 經過測試,執行事件動作只能連續使用1000次 如果要運算到a會大於1000,會讓事件進入「已結束並不在檢查狀態」,即使剩餘重覆999999次數也一樣, 例如事件0001進入了「已結束並不在檢查狀態」,剩餘重覆999999次數, 如果事件0002包含"執行事件動作-0001",事件0002會處於"即使檢查通過,0002也不被執行"的狀態, 即是事件0002會卡在"檢查通過"的檢查狀態 | ![]() (圖一) ![]() (圖二) ![]() (圖三) ![]() (圖四) ![]() (圖五) |
快速將兩個同人陣合體
各位一定有試過把一個同人的內容不斷地複製到另一個同人上吧。 過程是不是很沉悶乏味、肌肉疲憊、浪費時間呢? 現在某FK弄了一個外掛教大家如何自動化以上工序~ 不說廢話了,去片~ |
用中文命名變數
今日與一名朋友討論一些難題,小編便跑去做實驗,發現是可以用中文命名變數OAO 這招到底有尛用呢? 這招可以拿來用一些系統不容許作為變數名稱的一些字元,如「,」、「小哈片刻」,來命名一個變數 如果你想好像殭屍來襲那般,不讓玩家在同一點放置士兵,就這樣弄: 事件-call.放兵 玩家召喚士兵 玩家儲存為p 地圖位置變數 location=p 事件-check.放兵 {location}.put==0 tp 士兵 至 location {location}.put=1 當然這只是一個簡化版,尚有漏洞需要你去補 這招還可以拿來弄反向變數存取 |
鼠標存取
引言 同人世界中有多種不可能的東西,存取鼠標座標是其中之一。(正因為是比較不可能的任務,會比較難理解)光暈同人陣與鼠標的惟一關係大槪就只有玩家的面向角度吧。沒錯,某FK就是用「人物屬性-面向角色」這個檢查做到的! 基本 - 環狀AI陣:取得人物面向 如要以變數形態儲存人物的面向角度(包括玩家),必須要在地圖的四條邊建立環狀AI陣,再以「人物屬性-面向角色」這個檢查存取。 例: 令玩家p走向鼠標方向 解: 事件{ 設環狀AI於四周,AI代號「RAI*」 } 事件一 重覆99999次 檢查間隔0秒 [檢查] 人物屬性-面向角色 檢查對象:任務/p 面向對象:RAI* 儲存為事件/q [動作] 趨使走至定點 任務/p 走至 事件/q 應用例子: 1.全方位光印 2.放屁鱷毒劍(比較tricky,連用了兩次檢查面向角色):https://youtu.be/3nE6yrAaLZc 進階 - 偽.居合斬:取得人物面前的第N格 如要取得人物面前的第N格,以做出弄出居合斬之類的效果,就要先建立環狀AI陣,得出一條貫穿「人物(P)」、「鼠標」、「人物面向目標(Q)」的線,再配合section formula,便能得出人物面前的第N格(L),如下圖 在此之前,請確保你已掌握這些技巧:地圖變數、格網座標、section formula Apply section formula, L = (xL,yL) = ((r*xq+s*xp)/(r+s),(r*yq+s*yp)/(r+s)) 因為是衝3格,r=3。但要計到L,我們還要知道s。但s是多少呢? '.'PL/LQ=r/s .'.3/LQ=3/s .'.s=LQ=PQ-PL=sqrt((xp+xq)^2+(yp+yq)^2)-3 所以我們這兒還需要sqrt()開方函式 誰會猜到開方會在此派上用場OAO 不用怕,你只需要在同人中用URL讀檔讀https://sites.google.com/site/twftechnique/file/library/sqrt%28%29_40000.var?attredirects=0&d=1 中心已經為大家準備好開方0至40000的答案~ 只需要sqrt{number}便能回傳正確答案的放大100倍,如sqrt2回傳141、sqrt4回傳200 現在便可以計到L的座標了~任務完成~ 應用例子 - 鼠標控制玩家跳躍 (261576) 檔案可在下載區找到 進階 - 鼠標座標化 有了基本槪念,現在來看看如何取得鼠標在地圖上的實際座標吧 在此之前,請確保你已掌握這些技巧:地圖變數、格網座標、二元一次方程( linear equation in 2 unknowns) 整個存取過程需要三個事件,主要是觸發並製作公式,以及解二元一次方程和動作 設鼠標座標為R(x,y);下面的每個座標全部都要分開兩個變數存 事件一: 儲存玩家目前位置為(xP,yP) /*為了避免製作出平行的公式造成無解,不以玩家目前的位置開始。 **如要使用玩家目前位置同時避免平行公式,請分case*/ 移動玩家(下稱P)至位置A(xA,yA) 事件二: 儲存目前P所面向的RAI*為q1、其位置為B(xB,yB) .'.ARB連成一直線,得出公式一 L1:(yB-yA)/(xB-xA)=(y-yA)/(x-xA) //two point form (中四程度的東西) (yB-yA)(x-xA)=(xB-xA)(y-yA) (yB-yA)x-(xB-xA)y=(yB-yA)xA-(xB-xA)yA...................(1) 移動P至位置C(xC,yC) 事件三: 儲存目前P所面向的RAI*為q2、其位置為D(xD,yD) .'.CRD連成另一直線得出公式二 L2:(yD-yC)/(xD-xC)=(y-yC)/(x-xC) (yD-yC)(x-xC)=(xD-xC)(y-yC) (yD-yC)x-(xD-xC)y= (yD-yC)xC-(xD-xC)yC.................(2) 只要解了(1)和(2),你便會得出鼠標的座標了~ 解方程(1)(2) : //中六程度,去wiki Cramer's rule
最後把玩家放回(xP,yP)
高階 - 線性回歸鼠標存取 (Linear Regression) 用上面的方法,多拿幾條函式,然後做線性回歸。越多條函式會有越準確的座標 設你得到的第i條公式(用人物位置Pi、面向角色的位置Qi、鼠標位置R(x,y))為 (Qi.y-Pi.y)/(Qi.x-Pi.x)=(y-Pi.y)/(x-Pi.x) 在得出N條公式後,建立矩陣 A= ((a_1,b_1),(a_2,b_2),(a_3,b_3),...,(a_n,b_n)) 然後進行線性回歸,找出最少誤差的點,那個點就是你的鼠標位置 AR = C Apply 上面提過的Grammer's Rule,你便可以找到R 參考影片:https://youtu.be/wJmzt2oRUpg 應用例子 - 真.冰凝彈:https://youtu.be/-J9n59A3McM |

















