Kinra
好想寫個大富翁自己玩喔
阿雅
好啊
KB
寫呀
Kinra
Kinra on Twitter
照理說應該先做個超簡易介面趕快開始寫規則進去試試看好不好玩的,結果我還是忍不住先做成isometric view了……
Kinra
目標是做成由玩家決定地圖長怎樣的大富翁
- 擲完骰子之後可以一邊走一邊在空格上鋪出道路(或者走已經鋪好的路)
- 走完後可在路旁的空格上開發一塊地
- 後續玩家不能在已開發的地上開路
- 因為地圖總尺寸是有限的,所以開發到一定程度之後就不得不開始踩別人的地

光是寫出規則就能預料到的問題
- 如果玩家從中央出發,很容易演變成老死不相往來
- 就算玩家從四角出發而且禁止倒退走,路開成一圈還是可以老死不相往來(跟PacMan的鬼一樣)
Kinra
有個解決方法就是跟桃太郎電鐵一樣,設定一個目的地誘因讓所有玩家聚集過去,這樣動線就比較容易交錯
Kinra
返鄉完回來電腦前面了可是還沒想好接下來要怎麼寫
暫時先跟一般大富翁一樣擲骰子一次走1~6格的話,在這個沒有現成道路的地圖上要怎麼設計UI讓玩家前進咧
如果讓玩家一次走一格,然後已經走過的格子這回合暫時禁止再走,設計上會比較簡單,但是操作效率就很差
相對的如果讓玩家可以直接用滑鼠拉一條預定路線出來再實行就方便多了
最方便的是滑鼠移到一個大概的方向,遊戲直接生一個預定路線的預覽給玩家用,所以我最想做的是這個設計,但是難度比上面兩個高很多……
Kinra
比方說玩家擲出6,把游標移到北4東2的地方,那麼遊戲要建議的路線是先北4再東2,還是先東2再北四,甚至是蛇行呢?
對玩家來說最直觀的是看玩家移過去的時候游標經過哪裡,如果玩家不滿意的話可以把游標移回來近處想要經過的地方再重新拉到遠處一次(例如先移到北4,遊戲就知道玩家想經過北4)
換言之如果要走6步,遊戲就記錄游標最近經過的所有格子裡最接近1步、2步……5步、6步距離的格子是哪些,然後試圖把這些格子串成一條路
但這還沒考慮到游標經過不能走的格子的情況……
Kinra
而且這樣好像玩家微調也是很累吼 算了還是叫玩家用拉的好了……………(放棄
Kinra
其實之前還有想到一種模式:總之游標指哪個方向就把往那個方向走N格的路線通通算出來,然後根據某種標準(例如轉彎次數最少者優先)排序之後列第一名給玩家,玩家再用滑鼠滾輪之類的方式瀏覽其他可能的路線
但總覺得這樣子除了第一名之外的路線對玩家來說反而變難選了,特別是我這種只想用直覺想一個答案就馬上實行的腦弱玩家來說
Kinra
「用拉的」也不見得真的要用拉的,可以是游標移到哪個方向的N步遠處就限定直線往那個方向拉出N步,按一下之後定錨&消耗N步,再從那個錨點反覆操作,直到擲出的步數耗盡為止
Kinra
寫了個class來處理上面這串之後覺得……一定是我太笨了沒有想到簡單的方法……為什麼這麼多行code……
Kinra
我還沒把實際跟游標互動的部分寫上去咧 只是準備好class來裝路線資料跟準備一些可能會用到的操作而已……
Kinra
Kinra on Twitter
錨點制的移動UI做出來像這樣,感覺還OK
如果有辦法繞一圈的話(會消耗4步)同一格想走兩次也行,但禁止直接折返
折返倒也不見得會對遊戲進行有害,只是我覺得這麼做很無聊XD
Kinra
剛剛才想到一個必經的問題:如果道路是自己開的,就有可能一格道路的兩邊(甚至三邊)都被開發成地產,所以是要:
1. 想個規則讓每個道路格只有一個相鄰格可以開發?
2. 允許同一個道路格跟所有相鄰的地產互動(被收過路費等等)?
Kinra
1的簡單做法是在開發時就把玩家所在道路格的其他相鄰格標成禁止開發(以後只能開闢成道路)。不過如果多次在同一條直線道上的不同格子停留,每次都選擇在道路不同側開發,感覺地圖最後會變得很醜。
2也不難,反正用個loop逐一處理所有地產觸發的事件就好了,不過處理的順序會有公平性問題。比方說如果是把路過的人拐進去關的旅館類地產,拐完當然其他格的處理就不用做了,那麼同時停在兩間旅館之間的玩家要被哪一間拐咧?(隨機決定不就好了)(是這樣嗎?)
Kinra
兩個擺在一起之後還是2看起來比較好玩
Kinra
本日進度:超不想動所以只加了個捲動畫面的功能
我要繼續玩シレン5~~
Kinra
不過也做了點前置準備方便之後畫角色棋子就是了,只是真的很懶得動所以連棋子的class都還沒建立
Kinra
Kinra on Twitter
我忍住了畫角色的衝動

不過遲早也得畫就是了,我還不知道我會不會畫斜角站姿
Kinra
Kinra on Twitter
角色動畫用的程式碼上次就已經寫過了所以不急著實際測試,繼續用這個placeholder棋子
Kinra
Kinra on Twitter
鋪路鋪路鋪路鋪路鋪路鋪路~!(CV:本多知恵子)
Kinra
下一步是做佔地動畫
理論上測試階段也是可以直接格子塗個顏色就先算了
不過這樣code得特別寫成跟實際需要的不一樣,反而白忙,所以還是先畫一些placeholder的圖好了
Kinra
雖然實作是能做啥先做啥
不過我還沒想好到底整個遊戲的經濟要長怎樣
因為規則的大前提就是自己開闢地圖,所以很想把世界觀訂得比較像秘境大冒險一樣,但這樣的話一般大富翁的錢和地產就很難套進去。我想做成收集資源來蓋東西的感覺,問題則是這樣子踩到其他玩家的地時到底該發生什麼事才符合世界觀就很難說
Kinra
像桃鐵路線的話就不需要讓自己蓋的產業去騷擾其他玩家,產業為自己生資源就好了
但相對的就是要設計一大堆NPC事件來騷擾玩家
也不是不行,但都打算做成自由開路把地圖鬧得亂七八糟了,還是覺得地圖滿起來之後玩家被迫踩別人地的時候應該要發生一些不利的事才有趣……
Kinra
https://images.plurk.com/3bALg1jA9vi9DG7dDQrHgs.png
先把地圖格改成48px寬了,之前畫棋子的時候就覺得32px寬太難畫了
Kinra
Kinra on Twitter
蓋房子蓋房子蓋房子蓋房子蓋房子蓋房子~!(CV:本多知恵子)
(台詞都換了你還在本多知恵子)(因為我喜歡本多知恵子)
Kinra
Kinra on Twitter
補上剛剛忘記順便做的規則:蓋房子的同時相鄰空格就會變成建設用地,之後不能用來鋪路
這規則是為了讓地產比較有機會聚在一起,如此一來就能像大富翁一樣同一個人佔滿整排地產有加成之類的(雖然如前述,還沒想到踩到地產的時候要發生什麼事)
Kinra
我還想做個地名系統,凡是相鄰的地產通通會沿用同一個地名……不過現在就可以預想到原本不同地名的地段可能後來會銜接在一起,所以可能要幫地名設定一個prestige值(同一個地名內含的地數越多就越高),值不夠高就會互相併吞之類的
Kinra
不過那種會需要文字的東東很久以後再來做好了
Kinra
早上出門前試著把蓋房子的介面改成可以蓋2x2以上的房子,不過來不及改好
Kinra
https://images.plurk.com/7eUxUUnCnsjAXMAUNPHKs4.png
不過現在就已經長這樣了,如果有2x2建築物的話,可能要考慮讓擋到玩家的建築物半透明顯示
另一方面我還在想1x1建築物長得比玩家還小到底好不好。以大富翁標準來說這很普通就是了……
Kinra
Kinra on Twitter
終於把2x2以上建設用的選取UI寫好了(3x3以上也沒問題)
之後再加上把2x2建築物正確顯示在地圖上的程式就搞定了,選取都寫得出來了這部分應該不難
Kinra
對了我之前覺得鋪路的動畫改成讓路從下面浮上來比較好看結果忘記改了
Kinra
Kinra on Twitter
顯示建築物的程式搞定了,但是本來仿照古時候的大富翁直接把土地塗成玩家顏色的做法看起來超醜,難怪他們很快就不這樣設計了……之後看要怎麼改
Kinra
不過目前還缺一步沒有改好
>>蓋房子的同時相鄰空格就會變成建設用地
這個要補上才行,如果蓋的建築物是2x2,依照我目前的想法就是建築物周圍相鄰的格子通通改成建設用地(其中一格會是玩家站的地方,所以最多7格)
Kinra
不過2x2不會是預設尺寸,因為鋪路是以1x1為單位,要是大家都只能蓋2x2建築,最後一定會製造出一堆縫隙
Kinra
這就表示得來想想要在什麼情況下允許玩家蓋2x2建築了
Kinra
目前想到的可能性
1a. 自力把2x2範圍的地全部蓋滿就可以合體變成2x2(缺點:超難)
1b. 自力連蓋2格,如果後面還有2個空地就可以擴建成2x2(還是很難)
2. 花費更高的成本就能蓋2x2(要跟整體經濟機制一起想)
3. 花費一般成本就能蓋2x2,但有一定機率失敗或發生不利的結果(這樣某些性格的玩家可能會一整場不肯蓋2x2)
所以目前看起來是2比較有可能……
Kinra
https://images.plurk.com/6vm2VyZHFc5h9bAD5ks1bp.png
暫時想不到要幹嘛(明明到處都是to do)先來準備個訊息視窗
Kinra
訊息視窗是個很大的坑,因為要處理文字
其實這是去抄別人code比較快的東西,不過目前為止做的哪一樣不是了……
Kinra
總之我本來想把訊息內容存在資源檔裡放在Content資料夾,然後用ResXResourceSet抓出來用,但不知道為啥在初始化ResourceSet的時候一定會冒出"item has already been added"錯誤……
Kinra
所以目前把資源檔放在根目錄直接靠著Resources內建的功能把整個檔案當class來呼叫,唯一的缺點就是資源檔跟程式擺在同一個資料夾裡我覺得很醜……
Kinra
在繼續做文字處理(或補其他to do的洞)之前先來整理一下現在暫訂的流程構想,畢竟這才是最重要的
- 遊戲裡共有1種交易貨幣(黃金?)與一兩種物資貨幣(木材+石頭之類的),以及一種終盤決勝貨幣(像是瑪利歐派對的星星那種東西)
- 玩家每次將空格開闢成道路都可以順便撿到少量物資
- 玩家走到空格旁時,可以花費物資選擇蓋1x1建築或2x2建築
- 1x1建築可以幫玩家生物資,需要累積物資才能蓋的2x2建築則能做一些進階功能,例如給玩家各種buff
- 2x2建築更重要的功能是生傭兵給玩家
- 前面提到玩家建設時周圍的空格會自動變成建設用地,目前測試畫面只是打個叉代替,實際上這種地會隨機變成一種「野外」地形,例如森林或洞窟
- 路過野外地形的時候如果打算建設,就得跟當地的雜怪戰鬥,這時候就需要傭兵
Kinra
- 傭兵打雜怪可以變強;也可能駐留在2x2建築裡欺負路過的玩家
- 玩家自身的主要目標是前往遊戲敘事中指定的地點打倒BOSS,但為此必須累積戰力
- 所以玩家就得:開路撿物資=>蓋物資建築加速累積物資=>蓋傭兵建築=>累積傭兵=>練傭兵&蓋buff建築=>去打BOSS=>贏得決勝貨幣
Kinra
- 地圖範圍有限,所以沒地方蓋建築的玩家會陷入惡性循環,如果遊戲要提供一些逆轉的機會就需要:
1. 攻下別人建築的機制
2. 一些會害房子不見的隨機事件
這部分就像富甲天下那樣 只想得到古代的例子
Kinra
昨天邊寫邊改結果忘記了,目前這種流程中交易貨幣沒有存在意義。也可以有一種用來招傭兵的黃金,然後一樣用某種建築來生黃金,但這就跟物資定位一樣了(不太可能設計成只用收過路費的方式集黃金,因為在這套移動系統下要踩到別人的地沒那麼簡單)
Kinra
啊對了我要把捲動畫面改成用拖曳的比較方便……
Kinra
Kinra on Twitter
改完ler
週末來把訊息視窗系統改到一定程度就來做資源HUD
Kinra
之前用MonoGame都只懂得每個frame把畫面上所有東西更新一次,這次要記得用RenderTarget把一些不可能每個frame都變動的東西存起來省時間……
Kinra
Kinra on Twitter
訊息視窗先這樣好了
還想要置中功能以及在訊息途中擺動畫icon的功能,不過那個以後再說
Kinra
啊……我都忘了還要做按鈕(用來選要蓋1x1還是2x2)
Kinra
Kinra on Twitter
木材跟石頭
Kinra
Kinra on Twitter
1x1跟2x2建築的選擇介面
之後改成用按左鍵來選尺寸好了(目前是游標移上去就會自動選擇)
另外試跑幾次之後覺得捲畫面還是用滑鼠右鍵拖曳比較不會搞混……
Kinra
不過目前是偷懶code所以建築尺寸數值是直接從選項的序號抓來的,選第一項就是1x1,第二項就是2x2
依照規劃,1x1跟2x2都不會只有一種,所以之後還要再調整選擇介面
Kinra
另外我也想把預覽從地上畫格子改成實際顯示半透明的建築在地圖上
應該不難吧……畢竟跟實際蓋下去是同一套方法……
Kinra
改好ler(懶得一直錄影片)
https://images.plurk.com/7dAMoBYnmOjezGqzOIfblm.png
Kinra
目前選擇介面的缺點是沒辦法讓一行的文字自動跟另一行的兩張圖片對齊(所以沒辦法直接用同一個字串在建築圖片的下面列出建材cost),不過機能再擴充下去我不如直接裝個瀏覽器在裡面算了,所以先用土砲做法解決好了
Kinra
試寫下去發現土砲做法疑似解決不了
不過把建材列在圖片下面的排版好像反正都會讓訊息視窗變得太高,乾脆改成在右邊另擺一個視窗來放資訊好了(迴避問題)
Kinra
https://images.plurk.com/7BEUwxbEAw11NVFeQogprn.png
順便先把字體從12縮成9了
雖然一直借用系統字型也不是辦法
Kinra
https://images.plurk.com/zM2KX2gVmjipTvZ2P5Lmw.png
做副視窗的時候偶然發現了一個bug,所以圖片跟視窗邊緣之間的多餘空白現在消掉了
原本是在用Split切原始字串的時候,被切完的marker會殘留一個空字串,沒想到空字串拿去量尺寸還是會得出一點寬度,於是那個寬度就成了行首的多餘空白
解法當然就是叫Split不要留空字串
Kinra
接下來會想把建築功能先規劃好然後開始做遊戲資料檔案,不過在那之前我先把移動完之後檢查有沒有地方可以建築的判定處理裝進去好了
不然現在是只要在任何不能蓋建築的地方按左鍵就會直接結束回合了,這樣會造成操作失誤……
Kinra
啊對了我還要把畫面自動聚焦的處理從直接跳改成平滑捲動……
Kinra
一邊聽廣播一邊改好了平滑捲動和修了建築預覽的bug
Kinra
看著副視窗的截圖才想起來
副視窗不是只有要放成本而已,到時候還要放效果說明才行
本來還在想視窗好像太矮的(而且成本兩個字疑似不寫也沒關係)
Kinra
不過建築種類多的話反而好像會寬度不足……該不會要把視窗改成可以捲動或翻頁吧(就算把版面改成選項在右邊縱排、說明文在下面橫排,也只是從寬度改成高度不足)
一來很難做,二來也不方便操作,不如把建築選項改成小圖示還比較好……也不必分別做小圖示sprite,另外建筆rectangle資料從建築完整sprite中間截一塊下來當縮圖就好了
Kinra
不過這種事有沒有必要做還是等建築種類想好再說好了,小圖示終究不如完整圖片清楚
Kinra
況且我現在遊戲畫面設成1024x768而已不知道在小什麼
Kinra
https://images.plurk.com/7Gk6fpuStri0YsnaHoe3Xz.png
改成這樣
那個句點位置很怪是因為之前提過的,XNA的字型處理很蠢,中文標點符號這種周圍有空白的glyph在繪製時會被貼到靠左。我覺得以後應該要去找plugin來支援字型處理,不過日後再說。
走到不能蓋建築的地方會自動結束回合的判定也做好了
Kinra
這個排版會蓋住左下方的畫面,所以加個功能讓這個視窗顯示的時候鏡頭會往右上移一點好了
Kinra
嗯鏡頭移動做好了
Kinra
Kinra on Twitter
錄個影留念
Kinra
https://images.plurk.com/4O2lcX8OxHFqTf0QwKirLS.png
不想睡覺所以做了個字型問題的workaround,拎北可是從倚天中文系統時代就在寫程式的雖然我當年中文顯示程式都是直接抄書的
把kerning關掉,讓每個字的寬度都變成實際像素的寬度,然後把每個字置中放在固定寬度裡面(如果是英數字就把固定寬度設為一半)。缺點當然就是只能顯示成等距字體,不過這對pixel風遊戲來說反而是好事。
Kinra
幹 用MonoGame讀XML怎麼這麼難搞
Kinra
MonoGame.Extended | MonoGame.Extended
怒找Extended來用
雖然我目前為止用純MonoGame 3.8寫的很多東西導入這套之後疑似就都跟白寫的一樣了,不過這次就先不管那些了,下次要做別的遊戲再研究
Kinra
幹 json好好用……
Kinra
(完全不是這兩個格式的問題,是MonoGame提供的工具用來deserialize這兩種格式的麻煩度問題)
Kinra
Kinra on Twitter
基本的經濟迴圈做好了
如果先不管前面規劃的那套完整遊戲流程,現在就可以直接改成4個玩家輪流跑回合,看誰先把資源衝到指定上限值了
所以在繼續做2x2建築的相關要素之前我有點想先來畫sprite了……
Kinra
啊對了我還沒做擲骰子的UI
真的要擲骰子嗎……有沒有更有趣的演出……
Kinra
稍微加了個「走在已開的路上採集到資源的機率會減半」的設計來鼓勵玩家開路
Kinra
Kinra on Twitter
昨天半夜做的,根據道路形狀改變外觀的地圖格
雖然只是flavor但也算是不可或缺的東西所以還是先做了
Kinra
https://images.plurk.com/6q0lqT0SUW8vs6GmSXdZGw.png
一邊試畫角色一邊想到底角色要多大隻比較好
Kinra
https://images.plurk.com/7q1DW4DQQ1x45wMaTvS9I.png https://images.plurk.com/3FgaEyj4GYh6oVJ2hdjwuj.png
畫了兩種尺寸的半成品來慢慢想
Kinra
暫訂結論:頭大比較可愛!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Kinra
我每次看到別人的pixel art都想在自己遊戲裡加palette swap功能
可惜我還不會寫shader……
Kinra
Kinra
Kinra on Twitter
給自己挖了個大坑:閒置動畫
這個測試用角色閒置的時候會拿指南針出來瞄一眼。這本身看起來很單純,不過
- 目前這只是當成同一個動畫,兩個畫格依序播放而已,但如果在沒瞄指南針跟瞄指南針的兩個時段分別都要再有細部動畫的話,就得把這兩個時段拆成兩個動畫來處理,那麼閒置多久要切換動畫就得再多一個參數來管理
- 畫了這種有慣用手的動作就沒辦法單純水平鏡射來充當另一個方向的動畫了……
Kinra
也不是沒辦法啦,只是我不想要
Kinra
幸好這部分的基礎結構我上次寫這個的時候已經寫好了
Kinra on Twitter
Q:那你為啥不把這個繼續往下做
A:因為做到這個階段之後就覺得好像不夠好玩……
Kinra
岔題介紹一下當時的這個構想:
整體而言是半回合制RPG,只是所有的攻擊都是這種形式,每個角色發動攻擊時都可以連續出N招,被擋下就不會完整造成傷害,所以擋不擋得住攻擊這件事本身並沒有致命差別,但是累積下來就會造成優劣勢差異
也可以三個角色同時圍攻一個角色(比如一個衝上去打、一個放箭、一個放魔法彈),這種情況下三個角色的出招也是一樣會在各種時間點命中,看守方可以擋多少下來
這東西不確定好不好玩的點就在於它稍微犧牲掉一點RPG的戰術要素來換取反射神經要素,但這個兌換到底對遊戲性有沒有好處很難說……
Kinra
至於說它是「犧牲」而不是在戰術要素之外加上反射神經要素,是因為這個系統下每一次攻擊耗時都很長,如果不想讓整場戰鬥的總時間拖太長,那麼玩家剩下可以盤算戰術的機會自然就變少了。我唯一想到的出路是就讓戰鬥總時間變長,但讓整個遊戲裡需要戰鬥的次數比一般RPG少,不過這麼一來要驗證這個設計到底行不行得通所需的遊戲完成度就更高了,所以整個提不起勁繼續做下去
Kinra
== 岔題結束 ==
Kinra
Kinra on Twitter
拆成兩個動畫處理成功了
Json真的好好用喔……………
Kinra
Kinra on Twitter
不畫了不畫了(都還沒畫走路)
Kinra
Kinra on Twitter
走路不想太認真畫了
Kinra
還有建築要畫,不過sprite動畫的各種基礎架構都靠玩家sprite測試完了,所以建築就繼續擱置好了,先來做下一個環節
Kinra
https://images.plurk.com/7JRAhG5SUHwU64BcqkPUKl.png
半夜一邊聽廣播一邊做好了戰鬥子畫面的雛形
子畫面會根據一套參數隨機生成地板,預定之後還會加上背景跟一些裝飾
畫面是另外render在一張texture上的,到時候要加轉場特效也方便一點
目前子畫面是用按鍵直接叫出來以便debug的,所以移動階段的視窗還擋在那邊,先不管它了
Kinra
看到水晶轉的Loot River預告片害我也有點想把我這個遊戲的「虛空」改成「水面」,不過那個水面應該是用shader做的,我現在連shader的皮毛的皮毛的皮毛都不會寫
Kinra
我都忘了,畫子畫面的時候背後那個主畫面就沒必要每個frame重算了,所以在畫子畫面之前要先把主畫面截起來代用……
Kinra
BlendState的設計好難懂害我試半天
用RenderTarget把畫面截起來的話,做出來的Texture不能跟一般Texture一樣擺在BlendState.NonPremultiplied的批次裡畫,否則半透明資訊會消失(通通變成不透明),要用BlendState.AlphaBlend來畫……
雖然我不太懂這是什麼道理,我在畫RenderTarget的時候也不是在透明背景上畫,而是在黑色背景上疊各種有半透明像素的貼圖,照理說疊完存成一張Texture之後每個像素應該就都只剩下一個算完的不透明顏色啦……為什麼還會因為BlendState不一樣畫出來就不一樣……
Kinra
不過沒那個閒工夫摸到完全懂再繼續了,既然能解決就用了吧
Kinra
Incorrect BlendState.NonPremultiplied alpha behavior...
有大大說是MonoGame的BlendState.NonPremultiplied設定錯了
Kinra
幹還真的……通通用他的設定畫就都沒問題了……也不用兩套BlendState切來切去……
Kinra
而且他提這個都過一年了,MonoGame製作群都沒理他嗎……
Kinra
https://images.plurk.com/4RHPPS83l9JF0JdfNj91Ic.png
做了一堆前置作業,結果唯一可見的變化是玩家腳底下有陰影了
最近都在打シレン5所以陰影也是シレン風格(不管什麼人什麼狀態都是同一個橢圓陰影),懶得弄太複雜了
Kinra
@vieshaphiel - 【腦內垃圾BGM傾倒作業 15】 (32秒) 「那個叫勇者的又來了!」 「...
我是打算讓場上角色們跟著這種節奏戰鬥所以要來幫角色畫個比較蹦蹦跳的戰鬥專用閒置動作
Kinra
用FamiTracker寫曲的好處是寫的同時就可以知道每個音符會持續幾個frame了,例如這首的每個八分音符都是18F(60FPS),所以如果要畫一隻跟著八分音符節奏蹦蹦跳的角色那麼每18F跳一下就好了
Kinra
>> 玩家建設時周圍的空格會自動變成建設用地 [...] 這種地會隨機變成一種「野外」地形,例如森林或洞窟 [...] 路過野外地形的時候如果打算建設,就得跟當地的雜怪戰鬥
原本的暫訂設計是每格野外地形都有個遇敵率,每經過一回合就會上升1%,不過剛剛想到更有趣的玩法了
改成「危險度」,不只遇敵率上升,遇到的敵人等級也會上升(當然內部可能是遇敵率跟等級兩個分開的數值啦,細節之後再想),然後每次玩家在野外地形蓋房子的時候如果運氣好沒遇到怪物,該格原本的危險度就會轉移到這棟新建築周圍的野外地形
換言之在同一個地段接連蓋房子,當地的野外地形就會越來越危險,直到有人中鏢為止
Kinra
Kinra on Twitter
耶~借用3D的力量把骰子做好了
這樣子骰子的六個面要顯示什麼圖案都可以在runtime生成了
戰鬥系統可以整個變成遊戲王的怪獸龍門骰(並沒有要那麼複雜)
Kinra
我本來想連方塊模都在runtime生的,可惜對MonoGame而言很麻煩,所以還是乖乖直接用Blender做方塊
就一個方塊也要1.7K是怎樣
Kinra
Kinra on Twitter
雖然我上面說過擲骰子走路很無聊,不過既然骰子都做出來了還是先擲骰子走路吧……
Kinra
https://images.plurk.com/X9lFdY2x3O0HlKkVKherJ.gif
隨便畫了森林地形的雜兵
我在FB上貼影片結果研究所室友說很像仙劍奇俠傳,所以我就用仙劍一開始的草叢怪概念畫了,剛剛上網看影片才想起來原來真正的草叢怪長得那麼噁……
Kinra
雜兵再加個身體往前挺一下的動作(2F?)當攻擊動畫
然後加個往後倒一下的動作(一樣2F?)當挨打動畫
再加個倒到底的動作(1F?)當死亡動畫就好了……希望
Kinra
Kinra on Twitter
ㄉㄨㄞvsㄉㄨㄞ
Kinra
昨天橋了半天怎麼在子畫面裡面顯示狀態視窗,然後才想起來當初的規劃是狀態視窗要顯示在子畫面的外面……
Kinra
https://images.plurk.com/3lWSTIj4FmTgeN0HBRzdJ1.png
目前的規劃:玩家如果沒有傭兵的話,基本攻擊方式就是拿自己的資源砸怪獸
這邊的指令視窗code寫得極度醜陋,不過整個遊戲應該就只有這裡會用到這種排版所以我懶得想更美的寫法了……………………
Kinra
記錄一下是怎麼個醜陋法,以後看到的時候說不定可以想到怎麼解決
- 目前的視窗class為了做出「配合內容文字長度決定視窗大小」的效果,在生成之前就得先把文字內容畫成一張texture,餵給視窗的生成method
- 之前為了做出在同一個視窗裡陳列各種建築讓玩家用滑鼠選擇的功能,我在負責畫文字texture的class裡加了一個附屬功能,只要在餵給它的字串裡加上特定的tag,就可以讓它在texture裡預留一個空白,順便把這個空白的範圍吐一個rectangle出來讓我另外把建築圖片貼上去(這樣就不用每次換圖片都重畫整張文字texture)
Kinra
- 這次的扔資源指令視窗也用了同樣的功能,拉一個預留空白讓我把資源的圖示貼上去
- 但是我想在右下角顯示目前該資源剩幾個
- 問題是那個預留空白的tag就只能預留空白,裡面沒辦法放文字
- 所以目前的workaround是:生成空白的文字texture跟rectangle→餵給視窗生成→利用rectangle把圖示貼上去→把空白texture扔掉→再生成一次文字,這次再把資源數量寫上去→餵給視窗

醜的點在於:1. 會生成一張無謂的texture然後直接丟掉 2. 第二次生成的文字排版還是寫死的,並沒有辦法叫它在第一次生成的rectangle範圍內「靠右下對齊」
Kinra
1實際上不痛不癢,但2我很不滿意,因為這麼一來資源數字的顯示位置跟最大位數就會被字體寬度影響
比如說現在這個設定是直接規定成最多5個字元,那要是以後換個更窄的字體,數字就會往左縮;換個更寬的則是會往右邊炸出去
https://images.plurk.com/4xEgeTk4JVEcUMPuWIm7k1.png
看起來解決方法是再去用視窗寬度來計算我要畫的字體最多可以畫幾個字……
Kinra
啊……順序倒過來就好了說
先把資源數量畫上去,用資源數量的最大位數來決定視窗要多大,然後再手動算一個rectangle出來把圖貼上去
Kinra
https://images.plurk.com/5R11BW0o8DdwFUUKC2VlRp.png
橋好了
外表看起來幾乎沒變,不過這樣數字的字體怎麼變都行了
不過我現在覺得好像都置中比較好看……
Kinra
啊不對,我當初的計畫是在這裡用更大張的icon,數字則用另一個比較小的字體縮在右下角(簡單來說就是跟世紀帝國的市場賣資源按鈕一樣),所以沒有要置中
Kinra
(其實剛剛有試著改成置中,發現很難改所以算了)
Kinra
剛剛把戰鬥畫面選取敵人的功能做好了
下一步是做砸資源的動畫
Kinra
我絕對不要今天繼續做不然一定會debug到半夜
Kinra
雖然戰鬥系統才剛開始做而已,不過現在已經可以預料到一個潛在問題,就是戰鬥的報酬到底要放什麼東西
目前的規劃上,戰鬥是只有在開發空地的時候才會發生的,所以在有限的地圖空間裡,可能的戰鬥次數也是有限的
換句話說不可以讓玩家只能靠戰鬥來練功,不然會卡關
Kinra
這就表示要準備戰鬥之外的強化手段,前面也提到目前規劃的手段是興建buff建築(蓋了就永久buff然後升級建築來增強buff,或者蓋完之後每次路過都可以領一點經驗值之類的)
但如果這種手段就夠用的話,相對的戰鬥又會覺得沒啥正面回饋,就只是突破一個障礙而已
Kinra
依照我目前的想像,機會有限的戰鬥不能farm,所以應該發比較高的報酬,但不實際做下去不知道會不會有副作用……
Kinra
Kinra on Twitter
只把舉起資源的動作加上去而已就花半天
而且目前資源升起來的速度還是跟角色整個舉手的動作長度連動的,所以如果主角舉手前會掏個腰包之類的,資源就會慢~慢~的升起來。之後再來改成比較合理的計算方式……今天累了……
Kinra
Kinra on Twitter
要做命中時的效果才行不然看起來只是餵餌而已
另外目前是直線飛行,預定要改成有點拋物線的投擲
(但是玩家可以修練技能讓投擲威力暴增,拋物線也會變成直線)
Kinra
資源顯示在最前景是故意的,這只是個寫意式的演出而已,所以不是玩家真的把那個size的資源拿在手上丟出去。之後如果玩家拿到了武器,也只是武器圖示跟資源一樣升到玩家上方然後射向敵人而已
至於為啥要這樣演出……那當然是為了避免畫玩家拿武器攻擊的sprite……
之後我想讓資源升高一點而且到頂的時候稍微閃爍一下,讓演出的意圖明顯一點
Kinra
目前圖示升到哪個位置的算法有個關鍵問題,就是其實程式沒有辦法知道玩家sprite的手在哪裡,因為那個手的位置全看我怎麼畫
玩家sprite目前除了frame的大小之外只有一個輔助座標,用來讓玩家sprite跟地面tile對齊(因為這兩種sprite大小不一樣),看來要再加一個座標了,這樣才能讓任何外觀的玩家攻擊時圖示都顯示在一個好看的位置
Kinra
速速做好了
雖然本來打算存起始能力值的json檔案結果被拿來存這種外觀資料看起來不太漂亮,不過仔細想想……各玩家的起始狀況應該要平等才對,根本沒有什麼個體起始能力值可以讓我存……
Kinra
在地震的同時不務正業的做了個陽春的視窗滑入特效,可以讓視窗生成時從別處滑到定位,還沒滑到之前會半透明顯示&不接受游標判定
(其實是因為一直沒有考慮到畫面上有很多視窗時的圖層先後問題,滑入時發現視窗交疊看起來很醜所以才用半透明來掩飾)
Kinra
拋物線投擲寫好了
影片懶得截了,等戰鬥系統完成度高一點再一起看
Kinra
今晚稍微在戰鬥指令按鈕底下多加了一個顯示tooltip用的長條視窗
這是枝微末節的東西,不過本來今晚是根本沒有要動工的,只是剛好有點時間所以想說加個幾筆而已
Kinra
明天的預定是把敵人的挨打動畫補上去&做個顯示傷害值的動畫
目前我做了個class專門處理在畫面上跳動的sprite,可以讓任何貼圖(包括文字)用指定的方式動來動去,所以最簡單做法就是每次有傷害值就畫成文字貼圖餵給它去跳動
但是這種就只有0~9數字的東西還要這樣一直動態生成新的貼圖用完再丟掉感覺很不漂亮,所以我想乾脆畫個0~9數字的貼圖load一遍就好了……
Kinra
SNES/SFC Style Music - Episode 3a - Overview of chip...
然後我想來試試看這個
雖然之前戰鬥音樂草稿是FamiTracker,不過我感覺SNES音色會比較符合氣氛
Kinra
Kinra on Twitter
傷害值顯示器
跟粒子效果原理一樣,只需要一份貼圖就可以噴無數個copy出來,所以就算以後有N連擊演出也可以用,不過還沒測試那麼多
另外在敵人身上追加了一個身高參數,用來決定傷害值要從哪個高度噴出來,這樣就算sprite本身很高也不用怕傷害值會離得太遠。這是為防以後畫出有往上跳動作的敵人,但是這不見得會發生,所以可能有點浪費
Kinra
這個數字樣式其實是效法シレン5的,乍看之下很醜但是大大的還蠻方便的
顏色可能要再亮一點就是了
Kinra
Kinra on Twitter
欺負草叢怪
Kinra
剛剛才發現我每次用rendertarget畫圖都忘記畫完要把spritebatch拿去丟,所以一整個memory leak
幸好修正這個之後記憶體用量就穩定了,看來應該是沒有漏掉什麼該丟的
Kinra
我上次做的DotsWar也有用到rendertarget,所以應該也有一樣的bug……但我懶得回去碰那個專案了XD
Kinra
沒想到拼圖對戰也有memory leak,原來是因為我用irrKlang的時候也有個地方忘記dispose了XD
Kinra
Kinra on Twitter
迴避動作
就不顯示什麼MISS字樣了,頂多加個迴避音效(繼續模仿シレン)
Kinra
稍微思考了一下不要怪物迴避而是玩家自己暴投會不會讓畫面比較有趣,但是好像還是迴避動作比較能在看到的瞬間就理解發生什麼事了
Kinra
>>是玩家可以修練技能讓投擲威力暴增,拋物線也會變成直線
暴投改成這個進階技能的代價好了,畢竟判定的時間點也不一樣
Kinra
Kinra on Twitter
敵人可以還擊了
這樣寫看起來很簡單,不過實際上這就是整套敵我輪流行動的基本流程組好了的意思。不過還缺分出勝負之後的流程……
Kinra
Kinra on Twitter
再加上死掉時的動畫,最低限度的要素就可以湊齊了
Kinra
目前是測試模式所以還沒有把資源丟出去後會消耗掉的處理寫進去
Kinra
Kinra on Twitter
我真的越看越覺得命中效果會動的話角色本身的挨打動畫1格就夠了
Kinra
我還沒做那種文字會一個一個跳出來的訊息框
晚點來試試看有沒有省力的方法
Kinra
直接修改原有的文字繪製method感覺很容易出錯,所以我決定參考原有的method另外寫一個全新的method,可以代用再把舊的淘汰……
新的method會比較沒效率一點,不過新舊不相容(舊的是static,新的需要建instance)所以可能也沒辦法把舊的留著
Kinra
唔……擔心的事成真了
文字排版沒問題,但是沒辦法把新的字直接畫到已經顯示的字上
畫下去的時候整張texture都會先變全黑
這是spritebatch的性質問題嗎……?
Kinra
乾脆每次畫之前先把原本的狀態複製一份出來然後在新的spritebatch裡畫回去好了
總覺得正解應該不是這麼蠢的做法……
Kinra
How can I clean only a partial area of a RenderTarge...
但從這討論串裡大大們的回覆看來,是真的沒有辦法在已經有內容的rendertarget上面直接畫新的batch上去,所以畫batch的時候才會自動先把整張texture塗黑
不曉得到底是什麼苦衷……
Kinra
耶~整個文字系統翻新完了
就為了讓文字可以一個一個跳出來而不用每次多跳一個字的時候都重算一次整坨字的排版
Kinra
結果今天只把視窗改成可以好幾個疊在一起而已
Kinra
今天只做了一件事就是讓角色被KO的時候會閃爍然後消失
甚至還沒做消失完之後讓角色不能繼續被打的判定
Kinra
不想睡覺所以把遊戲裡所有會動(=每個frame都要呼叫update)的物件通通用一個interface包起來了
這樣只要一個foreach就可以更新所有物件,而且一些射後不理的免洗物件也不用再按照類別各宣告一個list來裝了,通通塞到一個大籮筐裡就好
Kinra
可惜目前只有節省到update的程式,因為我每個物件類別的Draw都寫得不太一樣,沒辦法整合……(設計階段的失策)
Kinra
btw 我做完KO閃爍消失演出之後覺得……甚至沒必要幫怪物畫死亡動畫,就讓牠一邊播挨打動畫一邊閃爍消失就好了,這樣步調也比較快
以後做BOSS級怪物再來考慮特殊的死亡演出就好了
Kinra
MonoGame其實有個Component類別跟對應的集合來處理上述那種統一update的需求,但繼承了Component好像就不能在constructor餵參數了……?不知道是不是有什麼方法我沒學到
Kinra
Is it bad practice to add GameComponents and Drawabl...
嗯我覺得我還是先不要管GameComponent系統好了,我覺得我記不住它裡面包了哪些東西
Kinra
Kinra on Twitter
本來想試試看能不能用shader做馬賽克轉場的,但我不太熟shader怎麼寫所以暫時沒做出預期中的效果,先擱置好了
戰鬥子畫面預定的轉場方式是切割成AxB個區塊然後一塊一塊顯示出來,這種效果不需要用到shader,不過馬賽克shader可能還有別的用處
Kinra
不過剛剛順便做的灰階濾鏡倒是可以直接用了
Kinra
也把死掉的敵人不會再行動的判定加上去了,不過今天還是沒正式開始寫戰鬥結束處理……
Kinra
回來記一下遊戲主軸的構想:
前面提到,目前預定用任務目的地的形式來驅使玩家走遍地圖
序盤為了讓多名玩家各自有一段時間不受打擾,但又不至於窩在自己的地盤,所以玩家會從地圖角落開局,但任務目的地在地圖中央,必須抵達那裡才能解鎖一些中盤必備的機能
集合到中央之後為了讓玩家有繼續探索各地的動力,會在地圖各地樹立新的支線任務目的地(比如說有村莊遇難需要救援之類的),玩家可以一路開墾過去
Kinra
但這有一個問題,就是玩家說不定會硬要把周圍通通開墾光光才去中央,這樣就沒有空地可以建立支線目的地了
所以目前的想法是在中央的劇情事件裡讓魔王登場然後放個隕石魔法之類的在地圖上亂砸
如果玩家沒開墾多少的話這個隕石就只是劇情演出,但如果有空地不夠的問題,隕石就會隨機破壞已開墾的地形
如果砸到玩家蓋的建築,還可以順便讓玩家角色講個台詞(「喔不我的[insert building name]——!!」)
Kinra
當然這樣就要讓隕石的數量多到目不暇給,在隕石砸出的空地偷塞一個NPC村莊才不會顯得太突兀
Kinra
不過這個聚到中央再打散的規劃還有另一個問題,就是所有玩家並不會同時抵達中央,而劇情當然是在第一個人抵達的時候就要發生了(不然那個玩家到了之後就沒事幹了),那麼如果其他玩家離得還很遠,預定要在地圖中央解鎖的機能,要用什麼形式送給其他玩家就是個問題
a. 其他玩家不用來,直接用某種劇情設定送給他們
b. 其他玩家還是要來一趟;如果他們偏偏要去支線目的地,就會因為重大機能未解鎖而被soft gating,例如會被怪獸痛宰之類的
Kinra
終於開始做戰鬥結束流程了,依照慣例一次只邁進一小步
今天做的是敵方或我方全滅時會把所有常駐狀態視窗關掉並且顯示勝敗訊息視窗
不過我目前做的視窗沒有準備任何自己判斷有沒有被游標按到的code,頂多只有一個「游標有沒有在視窗裡面」的bool函數,游標在裡面的時候有沒有同時按左鍵則都是給建立視窗的class去管,這種做法顯然不對,我得統整一下……
Kinra
結果我獨立做了一個訊息視窗專用的衍生class,只有這個class會額外吃input資訊來判斷自己有沒有被按;原本的視窗class還是沒有加這功能
這是因為實際要改的時候發現,除了泛用的訊息視窗之外,需要被按的視窗在被按之前往往還會發生一些複雜的事,到頭來還是要從外面管理(例如戰鬥中的指令視窗是N個視窗一組,游標移到其中一個視窗上面的時候不只要highlight這個視窗,還要把其他所有視窗的highlight消掉,既然都要做這種處理了那當然就是當場一起判斷有沒有按左鍵最省事)
Kinra
試用之後發現我搞錯了
對話框不該期待使用者真的把游標停到對話框上面再按,使用者都想直接隨便往任何地方一按就能結束對話框
Kinra
Kinra on Twitter
玩家被打爆的時候會逃跑
本來想說是不是要畫逃跑sprite的,但發現好像不用
頂多之後畫個冒汗sprite浮在頭上就好了吧
Kinra
不過可能要在逃跑前夾個震驚動作之類的,直接秒逃感覺有點沒說服力XD
Kinra
啊對了目前構想是逃跑的話會噴資源,所以要在這個逃跑動作的演出同時讓資源飛出來
明天再做好了
Kinra
Kinra on Twitter
做好了……嗯這樣還不算做好,因為看起來很矬,不過大概有個基礎了
這是演出方面的東西所以日後再來微調好了,下一步是逃跑按鈕
目前沒資源就沒有攻擊手段,所以逃跑功能是必備的。裝上去之後就可以先告一段落,把戰鬥系統正式掛到建設階段的隨機遇敵判定上了
Kinra
Kinra on Twitter
把戰鬥系統組進主loop了
戰敗或逃走雖然會建設失敗外加噴資源,不過當格的危險度會下降,之後就可以再挑戰
實際run過的感想:
- 「危險度」是用同一個數值決定遇敵率跟敵人強度,原本是覺得魔物越猖獗的地方魔物實力就應該越強才這樣設計,不過遊戲性好像很糟(等於要等到敵人很強才有機會玩到戰鬥系統),還是分開好了
- 目前戰敗之後HP會維持在垂死狀態,要隨著回合經過自然恢復,所以不能頻繁戰鬥,不過這樣好像不好玩。畢竟這不是那種會被敵人追殺或圍堵的遊戲,低HP沒辦法營造危機感,只會讓玩家覺得礙手礙腳而已,還是改成一律從滿血開始戰鬥好了
Kinra
危險度怎麼改慢慢想,明天來畫建築sprite好了
因為建築一直是placeholder的關係,我連建築面朝不同方向的code都還沒寫咧……
Kinra
問題是!其實我還沒想好建築是什麼!!!!!!!!!!!!!!!!!!!!!!!!!
Kinra
雖然我把資源畫成木材跟石頭這兩種很普通的自然物了,但是玩家操作的是區區一個人而不是一個文明,所以蓋什麼伐木場採石場之類的都很奇怪
目前是想設定成召喚小精靈之類的來幫玩家採資源
(又或者乾脆把資源改成比較奇幻一點的晶石之類物質,用魔法陣來開採,但這樣子反倒是「拿資源來蓋建築」這件事會變得奇怪)
Kinra
>>玩家操作的是區區一個人而不是一個文明,所以蓋什麼伐木場採石場之類的都很奇怪
多想了一下之後覺得可以拿在手上砸怪物的資源直接就能成為建材本身就是件不合理的事XD
不合理但有趣的話就沒關係,但木材跟石頭也不是什麼有趣的東西,所以還是改一下設定好了
資源本身不是建材的話,想像成「要讓建築發揮特定的能力就需要加上某種特殊的魔法材質」應該就可以了
Kinra
https://images.plurk.com/4rZNtJoSgSHfQEDdpf8dwN.png
非常沒有創意的赤晶開採器
會隨著累積的開採量而改變動畫
升級的話建築本身的外觀會改變(預定)
目前動畫是各跑各的,所以在場上蓋很多台的時候看起來會很亂,來想想辦法援用其他地方寫過的同步閃爍功能好了
Kinra
同步做好了(雖然做法很髒)
看來我得準備個tooltip之類的讓玩家隨時可以看自己蓋的資源建築總共有幾棟
Kinra
btw 我把建築畫成會動之後覺得不要讓建築面朝不同方向了
因為 1. 這樣要畫一堆動畫很累 2. 會動的東西還那麼多不同方向看起來很花
Kinra
今天本來只是想把遇敵率跟怪物強度拆成兩個數值的,結果發現我原本用來顯示地圖格資訊的視窗寫法很蠢,一定只能顯示兩行字,所以為了讓地形名稱/遇敵率/怪物強度各一行,只好來匡正過去的錯誤
Kinra
我覺得把戰鬥畫面用的指令列獨立出來變成class好像比較好,至少主loop裡路過建築的時候也用得到(起碼要有「升級」跟「拆除」兩個指令可以選)
Kinra
https://images.plurk.com/5tGPFFDYDVd9Av2faQGD4Z.png
問號好方便喔我以後真應該多用一點
Kinra
耶~指令列class做好了
這樣建築本身的選擇也可以改成指令列形式
建築說明也改成toolbar形式
……這表示toolbar也要做成class才行
Kinra
好啦這些衍生class做起來都不難
Kinra
話說我本來的構想是玩家的行動會為虛空賦予定義,所以如果蓋伐木場周圍就會變成森林、蓋採礦場周圍就會變成岩山
但現在建築已經不是伐木場跟採礦場了,所以這個關聯性大概就沒必要死守了(我還是希望最基本的兩種地形是森林跟岩山就是了)
不過自然地形sprite暫時還想不到怎麼呈現比較好看,如果跟建築一樣高的話會擋到建築啊……
Kinra
雖然我這幾天沒進度是因為我在忙著玩新遊戲跟畫圖,不過我之前建築的code寫得太髒也是沒辦法快速生一點小進度的原因
建築又是根據size分類又是根據功能分類的,內部的命名都岔在一起了,當初測試用的code還偷懶把相同size的建築通通當成同一種了
要把code改乾淨需要累積一點幹勁……
Kinra
https://images.plurk.com/2V28cVwTnZhWC7NTf0QDq4.png
建築選擇跟建築說明的改版完成了
建築圖示還沒畫所以目前是隨便拉戰鬥用的圖示來當placeholder
Kinra
先來把sprite的原始檔移植到Aseprite好了
Piskel要把多份動畫拼成同一張實在很麻煩,Aseprite因為可以用tag功能分段預覽loop,所以在同一個檔案裡就能做好幾套不相連的動畫了
Kinra
沒想到乍看之下現代軟體該有的UI便利設計一應俱全的Aseprite竟然沒辦法在透明度slider上點兩下直接打數值進去……
Kinra
搞定之後一天也結束了……
Kinra
我剛試畫了森林tile,放在遊戲裡醜爆,醜到連我的標準都不敢貼截圖上來(看了會覺得噁心)
我想我應該效法NDS版的世紀帝國,四棵樹就好了,不要畫成密集的森林
https://images.plurk.com/3A2p2cf9XlEhCnSEc9sqnx.png
Kinra
Kinra on Twitter
先把「可以選擇不蓋建築而是開道路」的功能加上去了
超麻煩的,因為建築有自己的class,道路則是地圖格子class的一部份,不論建築選擇UI還是蓋建築的流程都得分歧處理
Kinra
這噗太長了我開個新噗好了
載入新的回覆