站在敵人身上一直打空,因為牠的受擊框只有 10 像素深
我自己在做一款雙人橫向清版遊戲,玩起來像小時候的《吞食天地 II》,一路往右走一路打,主角換成了寶可夢,算是一款致敬作。兩個人可以擠在同一副鍵盤上玩,也可以各拿一台平板連同一個 Wi-Fi,目前只有 Mac 和 Windows 版,沒有公開發行。
這類遊戲的地面有深度,角色除了左右走,也能往畫面上方或下方移動,像走在一條有寬度的街上。要打到敵人,兩個人得大致站在同一排。程式判斷「有沒有打到」,靠的是每個角色身上一塊看不見的方框,叫受擊框,攻擊的範圍碰到敵人的受擊框,才算命中。
6 月 16 日晚上,這個遊戲有一種很明顯的手感問題:貼著一隻小怪站,拳腳揮得很用力,傷害卻有一下沒一下,看起來就像一直打空。
晚上 9 點 47 分合進主線的那筆修正,把原因寫得很清楚。小怪的圖大約 38×40 像素,受擊框卻只有 16×10,寬度勉強,深度只有 10 像素。街道大約有 120 像素深,兩個角色上下只要錯開十幾個像素,程式就認定不在同一排,玩家眼睛看到的是自己站在敵人身上,判定上卻是隔壁排。
修法是把小怪的受擊框放大到 28×26,上下能錯開的距離放寬到 19 像素左右。只放大敵人的框,玩家的框維持原樣,這樣攻擊比較穩,玩家自己也還是小小一塊,閃得掉敵人的攻擊,連帶少挨幾下打。王有自己另外一套尺寸,不受影響。同一筆還附了一組測試,上下錯開 12 像素要打得到,錯開 40 像素還是要打不到,免得之後有人改著改著又變回去,或是放大過頭,隔一條街都打得到。
20 分鐘後,又補了一筆,這次修的是抓取。
這個遊戲的角色除了拳腳,還可以貼近敵人把牠抓起來摔出去。拳腳放大受擊框之後順了,抓取卻沒有跟著變好,因為它走的是另一條路。拳腳是看兩個框有沒有重疊,敵人的框一放大,自然就好打了;抓取沒有用框,它自己量一次兩個角色上下差多少,差距在 8 像素以內才抓得到。受擊框放大了,抓取完全不知道,還在用 8 像素的老標準,比敵人新受擊框的一半還小。結果就是拳腳打得到,同一個位置伸手去抓,還是抓空。
修法很單純,五個主角的抓取深度都從 8 拉到 14,跟敵人受擊框的一半(13)差不多。比較重要的是又加了一條檢查:抓取深度不能小於敵人受擊框高度的一半。以後誰再去動受擊框,抓取要是沒跟上,這條檢查會先失敗,不用等到玩家玩到想摔手把才發現。
那天晚上的版本 v0.1.4,在 10 點 14 分打上標籤,兩個修正都在裡面。
在我腦子裡,「打到」原本是一件事,這次才看清楚它在程式裡其實是好幾條各自獨立的路。拳腳看框有沒有重疊,抓取量上下距離,兩條路沒有共用同一個數字,改了一條,另一條就安安靜靜停在舊的行為上。
我對那條檢查的印象比修法本身還深。受擊框和抓取深度原本是兩個沒關係的數字,各寫在各的地方,那條檢查把它們綁在一起,以後只要有一邊改了另一邊沒改,就會有東西出聲。agent 每次開工都是從零讀起,不會記得這兩個數字之間有關係,寫成檢查,它就不需要記得。
其他作品在作品集。
先不說了,我得去把其他還在自己量距離的判定,一條一條找出來。
這段 code 寫於 2026 年 6 月 16 日,文章整理於 2026 年 10 月。