我正在使用 Go 并將其編譯為 Web 程序集。我正在嘗試用隨機顏色渲染一堆彼此相鄰的矩形,但它們一直渲染為灰色。我的渲染函數看起來像這樣: for row,_ := range rows { for col,_ := range row { ctx.Set("fillStyle", fmt.Sprintf("#%06x", rand.Int())) ctx.Call("fillRect", 20, 20 + (col * width), maxHeight - (row*height)) } }它用它渲染了一個大塊(所有矩形都彼此相鄰)但都是灰色的,而不是用不同的顏色來渲染它們。示例中的這些代碼是否足以進一步提供幫助?如果不是,我可以將它發布到要點上,因為我是 WASM 的新手,我不確定哪些部分可能真正相關 - 但據我所知,這 2 個函數是唯一與渲染有關的函數。
1 回答

HUH函數
TA貢獻1836條經驗 獲得超4個贊
問題是您使用此表達式來構造填充樣式:
fmt.Sprintf("#%06x",?rand.Int())
rand.Int()
返回一個非負偽隨機數int
。如果和的大小int
為 64 位。這意味著隨機數將是隨機的 8 個字節(由于非負,第一位始終為 0)。GOOS=js
GOARCH=wasm
int
如果你用動詞格式化這樣一個數字%06x
,幾乎所有時間它都會不僅僅是 6 個十六進制數字。寬度表示至少6
為6,標志表示如果小于則用零填充。但如果它更長,則不會被截斷。0
如果您將無效顏色設置為canvas.fillStyle
,它將忽略它并且最后設置的有效填充樣式將保持活動狀態。我猜這是你在循環之前使用的灰色。
修復很容易,只要確保隨機數不超過 3 個字節,或者換句話說,6 個十六進制數字。使用一個簡單的位掩碼:
ctx.Set("fillStyle",?fmt.Sprintf("#%06x",?rand.Int()&0xffffff))
或者使用rand.Intn()
代替rand.Int()
:
ctx.Set("fillStyle",?fmt.Sprintf("#%06x",?rand.Int(0x1000000)))
還context.fillRect()
需要 4 個參數:x
,?y
,width
和height
,所以它應該是這樣的:
ctx.Call("fillRect",?20+(col*width),?maxHeight-(row*height),?width,?height)
- 1 回答
- 0 關注
- 102 瀏覽
添加回答
舉報
0/150
提交
取消