<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Canvas on Wayne X.Y. Blog</title>
    <link>/tags/canvas/</link>
    <description>Recent content in Canvas on Wayne X.Y. Blog</description>
    <generator>Hugo</generator>
    <language>zh-TW</language>
    <lastBuildDate>Thu, 26 Feb 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="/tags/canvas/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>在網頁中打造微型世界：Playground 像素藝術與尋路實作</title>
      <link>/zh/2026/02/26/playground-pixel-art-implementation/</link>
      <pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate>
      <guid>/zh/2026/02/26/playground-pixel-art-implementation/</guid>
      <description>&lt;h1 id=&#34;在網頁中打造微型世界playground-像素藝術與尋路實作&#34;&gt;在網頁中打造微型世界：Playground 像素藝術與尋路實作&lt;/h1&gt;&#xA;&lt;p&gt;&#xA;  &lt;img src=&#34;/img/playground/playground_overview.png&#34; alt=&#34;Playground Overview&#34;&gt;&#xA;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;前陣子 coding 時看到 github 上面一個有趣的專案叫做 &lt;a href=&#34;https://github.com/pablodelucca/pixel-agents&#34;&gt;Pixel Agents&lt;/a&gt;，能夠把 AI coding 時，將 agent 模擬成像素風格的小人物，並把處理過程模擬成在辦公室工作的樣子，看起來很可愛😆，也因為我很喜歡像素風格，就想說能不能在自己的網站也呈現類似的感覺，於是就有了這個 &lt;a href=&#34;/playground/&#34;&gt;Playground&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;p&gt;這篇文章將會分享這個小天地背後的實作細節，包含如何用 HTML5 Canvas 渲染出銳利的像素畫、角色狀態的設計，以及他們是如何在房間內找到路徑（BFS 尋路演算法）的。&lt;/p&gt;&#xA;&lt;p&gt;場景素材則是來自 &lt;a href=&#34;https://limezu.itch.io/moderninteriors&#34;&gt;Modern Interiors&lt;/a&gt;。&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;-核心架構設計canvas-與銳利的像素&#34;&gt;🎨 核心架構設計：Canvas 與銳利的像素&lt;/h2&gt;&#xA;&lt;p&gt;整個 Playground 的基礎是建立在 HTML5 的 &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; 標籤上。為了忠實呈現早期遊戲機那種清晰的「顆粒感」，我們必須確保圖片放大後不會變得模糊。&lt;/p&gt;&#xA;&lt;p&gt;在繪圖素材上，角色的單格尺寸其實非常小，僅有 &lt;code&gt;16x32&lt;/code&gt; 像素（寬 16 像素，高 32 像素），而基礎的地磚區塊大小 (Tile Size) 則是 &lt;code&gt;16x16&lt;/code&gt; 像素。&lt;/p&gt;&#xA;&lt;p&gt;如果我們直接把畫布依原尺寸顯示在網頁上，由於現代螢幕解析度極高，使用者可能要拿放大鏡才看得到角色。因此，我們需要在 CSS 中把它放大：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;#playgroundCanvas {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff79c6&#34;&gt;width&lt;/span&gt;: &lt;span style=&#34;color:#bd93f9&#34;&gt;832&lt;/span&gt;&lt;span style=&#34;color:#8be9fd&#34;&gt;px&lt;/span&gt;;     &lt;span style=&#34;color:#6272a4&#34;&gt;/* 原始寬度 416 放大了兩倍 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff79c6&#34;&gt;height&lt;/span&gt;: &lt;span style=&#34;color:#bd93f9&#34;&gt;480&lt;/span&gt;&lt;span style=&#34;color:#8be9fd&#34;&gt;px&lt;/span&gt;;    &lt;span style=&#34;color:#6272a4&#34;&gt;/* 原始高度 240 放大了兩倍 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#ff79c6&#34;&gt;max-width&lt;/span&gt;: &lt;span style=&#34;color:#bd93f9&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#8be9fd&#34;&gt;%&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image-rendering: &lt;span style=&#34;color:#ff79c6&#34;&gt;pixelated&lt;/span&gt;; &lt;span style=&#34;color:#6272a4&#34;&gt;/* 關鍵：保持像素銳利邊緣 */&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    image-rendering: &lt;span style=&#34;color:#ff79c6&#34;&gt;crisp-edges&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;透過 &lt;code&gt;image-rendering: pixelated;&lt;/code&gt;，瀏覽器在縮放 Canvas 時會使用最近鄰插值 (Nearest-neighbor interpolation)，從而保留了我們想要的 8-bit 復古感。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
