小蛇游來游去

home

2025.02.24

它就是用perlin noise決定轉向,再把蛇身長度的點留下來連成線。

附上與chatGPT的對話過程,其中有些失敗而無法顯示時我就刪掉不放上來了。

i請用p5js生成一隻小蛇游來游去 ChatGPT said: 這裡是一個用 p5.js 實現的小蛇游動效果,使用 Perlin 噪聲來讓小蛇的運動更加自然:

P5js Snake Movement 這段代碼創建了一條由多個段組成的小蛇,它會根據 Perlin 噪聲來改變方向,模擬自然游動的感覺。如果想要讓蛇游動得更平滑,可以調整 speed 和 noiseOffset 的變化速度。你可以直接在 p5.js 網站上運行這段代碼,看看效果!

You said: 請改寫成jsx ChatGPT said: Edited 我已經將你的 p5.js 代碼改寫成 JSX(React + p5.js)。這個組件會在 React 中創建一個畫布並顯示小蛇的游動效果。你可以直接在 React 項目中導入並使用它!如果有任何需要調整的地方,請告訴我。

You said: 不要讓它游出邊界 ChatGPT said: Edited 我已經修改了代碼,讓小蛇不會游出邊界。如果它的下一步超出畫布範圍,則不會更新位置。你可以試試看,看看效果如何!

You said: 加上一顆頭和眼睛給它 ChatGPT said: Edited 我已經幫小蛇加上了一顆頭和兩顆眼睛,現在它會更有生動的感覺!你可以試試看,看看效果如何,如果還有其他想調整的地方,請告訴我!

You said: 請讓眼睛隨它前進方向和變化角度與擺放的位置 ChatGPT said: Edited 我已經調整了小蛇的眼睛,讓它們會根據移動方向變化角度和擺放位置,這樣看起來更有靈動感!你可以試試看,看看效果如何~

You said: 可以把它變長一點,並為它加上條紋嗎 ChatGPT said: Edited 我已經讓小蛇變長了一點,並為它加上了條紋,使它的身體有間隔的深綠色條紋效果。你可以試試看,看看效果是否符合你的預期!如果還有其他想調整的地方,請告訴我。

You said: 看不出有條紋效果 ChatGPT said: Edited 現在條紋應該更明顯了,條紋的顏色會交替變化。你可以試試看,看看效果如何,或者調整 stripeSpacing 來改變條紋的密度!

You said: 請為黑色的眼睛加上眼白的白框 ChatGPT said: Edited 我已經為小蛇的眼睛加上了白色眼白,讓它的眼睛更有層次感。你可以試試看,看看效果是否符合你的預期!

You said: 讓它的身體再胖一點點 ChatGPT said: Edited 我已經讓小蛇的身體變胖了一點,增加了頭部的大小,並加粗了身體的線條。試試看,看看是否符合你的期望!

You said: 頭不用變大嗎 ChatGPT said: 目前頭部的大小已經增加到了 headSize = 14,但如果你希望它更明顯,我可以再調大一點,比如 headSize = 16 或更高。要不要試試 headSize = 16?

You said: 頭變小一點 10 ChatGPT said: Edited 已經將蛇的頭部大小調小為 10,試試看這樣的效果是否符合你的要求!

You said: 可以給它兩隻腳嗎? ChatGPT said: 要給小蛇加上兩隻腳,我會讓它的腳放在頭部下方,並根據它的移動方向擺動,讓它更有趣味性。我現在幫你加上!

Edited 我已經幫小蛇加上了兩隻腳,並讓它們根據移動方向擺動,試試看這樣的效果如何!如果還有什麼想調整的地方,告訴我哦!

You said: 腳要在頭的後面 ChatGPT said: Edited 現在蛇的腳會出現在頭的後面了!試試看這樣的效果,如果還有需要調整的地方,請告訴我哦!

You said: 先把腳刪掉 ChatGPT said: Edited 我已經把蛇的腳刪除了,現在它回到了原本的樣子!如果還有其他修改需求,請告訴我哦!

You said: 給它兩片鯕 ChatGPT said: Edited 現在蛇有了兩片鰭!如果你想調整大小、位置或顏色,請告訴我哦!

You said: 鰭要隨著方向而變化方向 ChatGPT said: Edited 現在鰭會根據蛇的移動方向變化方向了!如果你有其他想調整的地方,隨時告訴我哦!

You said: 讓鰭變成扁扁的圓形 ChatGPT said: Edited 現在鰭變成了扁扁的橢圓形,並且會隨方向變化。如果你有其他調整需求,請告訴我!

You said: 鰭和身體成30度夾角 ChatGPT said: Edited 現在鰭與身體夾角為30度,並且會隨著方向變化。如果還有其他需要調整的地方,請告訴我!

You said: 在身體兩側 ChatGPT said: Edited 現在鰭已經移到了身體的兩側,並會隨方向變化。如果還有其他調整需求,請告訴我!

You said: 把鰭拿掉吧 ChatGPT said: Edited 鰭已經移除,如果還有其他修改需求,請告訴我!

You said: 加個圓角三角形的尾巴 ChatGPT said: Edited 已經為小蛇加上圓角三角形的尾巴,並會隨方向擺動。如果還有其他調整,請告訴我!

You said: 尾巴反了 ChatGPT said: Edited 尾巴的方向已經修正,現在應該正確朝向身體的末端。如果還需要進一步調整,請告訴我!

You said: 讓身體和尾巴的顏色一玫 ChatGPT said: Edited 身體和尾巴的顏色已經統一了,現在它們會顯示相同的綠色。如果還有其他調整需求,請告訴我!

You said: 把尾巴拿掉 ChatGPT said: Edited 尾巴已經移除,現在蛇的身體末端是自然收尾的。如果還有其他調整需求,請告訴我!

You said: 可以讓畫布大小由它的父元件決定嗎? ChatGPT said: Edited 現在畫布的大小會根據它的父元件自動調整,並且在視窗大小改變時也會重新調整畫布尺寸。如果還有其他需求,請告訴我!

You said: 預覽的時候變成白白的一片了? ChatGPT said: 可能的問題是 parent.offsetWidth 或 parent.offsetHeight 為 0,導致 createCanvas 沒有正確設置畫布大小。可以嘗試以下修正:

確保父元件有明確的大小 在 div 上添加 minWidth 和 minHeight,避免 offsetWidth 或 offsetHeight 為 0。

添加 setTimeout 延遲初始化 讓 createCanvas 在 useEffect 中稍微延遲執行,確保 parent 的大小已經確定。

檢查 windowResized 是否正常運行 目前 resizeCanvas 可能沒有更新變數,應該重新計算蛇的初始位置。

我會幫你修正這些問題,讓畫布正確適應父元件。

Edited 現在畫布大小會正確匹配父元件的大小,並確保至少有一個最小尺寸 (300x300px),避免 offsetWidth 或 offsetHeight 為 0 的問題。試試看,看看是否正常顯示!

You said: 可以把它變成兩隻或三隻,由變數決定嗎? ChatGPT said: Edited 現在你可以通過 numSnakes 變數來控制蛇的數量,

You said: 沒有耶,它沒有變多隻 ChatGPT said: 你的程式碼看起來已經有 numSnakes 變數來決定蛇的數量,但可能的問題是 useEffect 只在 numSnakes 改變時重新執行,而 p5 可能沒有正確清理舊的 snakes 陣列。 我會修正這個問題,確保畫布上的蛇數量正確,並讓它們彼此獨立運動。

Edited 現在應該可以根據 numSnakes 變數生成多條蛇了!

You said: 請每一隻顏色的hue不同 ChatGPT said: Edited 現在每條蛇的顏色應該會有不同的色相(hue),讓它們看起來更加多彩!試試看是否符合你的需求吧。

You said: 請讓每一隻的粗細長度不同 ChatGPT said: Edited 現在每條蛇的長度和粗細都會有所不同,讓它們更加獨特!試試看效果是否符合你的需求吧。

You said: 請讓背景維持透明 ChatGPT said: Edited 現在畫布的背景應該會維持透明,請檢查一下效果是否符合你的需求!

You said: 眼睛間的距離加大到一顆眼睛的寬度 ChatGPT said: Edited 眼睛間的距離已經加大到一顆眼睛的寬度,請看看現在的效果是否符合你的需求!

You said: 兩顆眼睛連起來的線要和行進的方向垂直 ChatGPT said: Edited 現在眼睛的連線應該與行進方向垂直了,請看看這樣的效果是否符合你的需求!

You said: 沒有耶 ChatGPT said: 我會修正眼睛的擺放,使它們的連線與行進方向垂直。稍等一下!

Edited 現在眼睛的連線應該會與行進方向垂直,請看看效果是否符合你的需求!

You said: 可以讓它的頭前面有個吻嗎? ChatGPT said: 我會在蛇的頭前方加上一個「吻」的形狀,稍等一下!

Edited 我已經在蛇的頭前方加上了一個「吻」的形狀,看看效果是否符合你的期待!

You said: 把吻去掉 ChatGPT said: Edited 吻已經移除了!如果還有其他需要調整的地方,請告訴我。

You said: 讓頭的前方稍稍往前凸像個鼻子可以嗎? ChatGPT said: Edited 已經在頭部前方添加了一個稍微突出的「鼻子」!如果還需要調整形狀或大小,請告訴我。

You said: 再往前凸一點 ChatGPT said: Edited 已經讓鼻子再往前凸一點,現在應該更明顯了!如果還需要調整,請告訴我。

You said: 變成6隻 ChatGPT said: Edited 已經將蛇的數量增加到 6 隻!如果還需要其他調整,請告訴我。

You said: 顏色讓它溫暖明亮 ChatGPT said: Edited 已經調整蛇的顏色,使它們更加溫暖明亮!如果還有其他想調整的細節,請告訴我。

You said: 每一隻長度不短於頭的4倍 ChatGPT said: Edited 現在每一隻蛇的長度至少是頭的 4 倍,確保它們不會太短!如果還需要調整,請告訴我。

ChatGPT said: Edited 已修正 ReferenceError: Cannot access ‘p’ before initialization 錯誤,現在 headSize 會先初始化再用於計算 numSegments。如果還有其他問題,請告訴我!

You said: 頭前方的凹出可以圓一點嗎? ChatGPT said: Edited 已讓頭前方的凹出更加圓潤,如果還有需要微調的地方,請告訴我!

You said: 顏色可以鮮明一點 ChatGPT said: Edited 已讓顏色範圍更鮮明,現在的色調會更亮更溫暖。如果還需要調整,請告訴我!

You said: hue多變一點 ChatGPT said: Edited 已讓色相範圍覆蓋 0 到 360,現在每一隻蛇的顏色會更加多變!如果還有需要調整的地方,請告訴我。

You said: 變成3維會好看嗎? ChatGPT said: 如果要讓蛇變成 3D 效果,可以透過以下方式改進:

陰影與漸變:使用 p5.js 的 lerpColor 或 beginShape() + vertex() 來模擬立體感,例如讓蛇的下半部顏色較暗。 光影變化:根據蛇的行進方向,調整顏色亮度,讓光源感覺來自某個角度。 視角透視:使用 perspective() 與 rotateX() / rotateY(),讓蛇的前後有深度變化。 p5.js WebGL 模式:改用 createCanvas(width, height, WEBGL),並利用 box(), sphere() 等 3D 形狀來建構蛇的身體。 這些方式可以讓蛇更有立體感,你想要哪種效果呢?

You said: 用1試試看 ChatGPT said: Edited 已調整條紋的陰影與漸變,讓蛇的身體更有 3D 立體感。如果需要進一步微調,請告訴我!

You said: 加上2和3 ChatGPT said: Made 3 edits 已增加光影變化,使蛇的身體和頭部具有 3D 立體感。如果有需要進一步調整,請讓我知道!

You said: 去掉了 ChatGPT said: 已經去掉 3D 光影與漸變效果,現在蛇的顏色會回到單純的 HSB 色彩。如果還有其他調整需求,請告訴我!

You said: 去掉 3 ChatGPT said: Edited 已移除 3D 漸變效果,蛇的顏色現在不再有線性漸變。如果還需要進一步調整,請讓我知道!

You said: 用上4 ChatGPT said: “4” 指的是 WebGL 3D 模式嗎?如果是的話,我可以將 createCanvas 改為 createCanvas(width, height, WEBGL),並使用 rotateX(), rotateY(), perspective() 來讓蛇的運動和視角有更強的 3D 效果。這樣的話,蛇的身體可能要用 beginShape() + vertex() 來繪製,而非 line()。

請確認這是否是你想要的 3D 效果?或者你有其他具體的 3D 呈現方式想要實現?

You said: 對 ChatGPT said: Edited 已將畫布模式更改為 WebGL,使其支持 3D 渲染。你可以開始嘗試在 3D 空間中調整蛇的視角和運動方式!如果需要進一步的 3D 調整,請告訴我。

ChatGPT said: Edited 已修正 createRadialGradient 的錯誤,並確保蛇的運動範圍適應 WebGL 坐標系統。試試看新的版本吧!

You said: 去掉4 ChatGPT said: Edited 已將蛇的數量調整為 3。還有其他需要修改的地方嗎?

You said: 不是的,是把webgl拿掉 ChatGPT said: Edited 我已經把 WEBGL 拿掉了,現在應該是以 2D 繪製模式運行了。你可以試試看,看是否符合你的需求!

You said: 弄成5隻 ChatGPT said: Edited 已經把蛇的數量改成5隻了!如果還有其他調整需求,隨時告訴我。

You said: 請和我說明,游來游去的作法是怎麼做的?是否參考了那裡的程式碼? ChatGPT said: 蛇的游動方式主要是透過Perlin noise(p.noise())來決定它的行進角度,使其產生平滑且自然的擺動,而不是固定的方向或隨機跳躍。

游動的核心邏輯 透過 Perlin noise 產生角度變化

js Copy Edit let angle = p.noise(noiseOffset) * p.TWO_PI * 2; p.noise(noiseOffset) 會根據 noiseOffset 產生一個平滑變化的值(範圍在 0 到 1 之間)。 乘以 p.TWO_PI * 2,讓這個值變成一個角度,控制蛇的方向。 計算速度與移動量

snake.unshift() 在陣列前面加入新的位置,讓蛇前進。 當 snake.length 超過 numSegments(蛇的總長度)時,就 pop() 移除最後一節,讓蛇保持固定長度。 邊界檢查:確保蛇不會游出畫布外。 讓 Perlin noise 的時間推進

snakeData.noiseOffset += 0.01; 這個值影響 p.noise(),讓角度變化平滑地隨時間改變。 是否參考了某些程式碼? 這部分的邏輯是根據 Perlin noise 產生流暢的運動模式,並結合了一些基本的蛇形運動原理(頭部前進、身體跟隨)。這種技術廣泛用於自然運動模擬,如魚群、雲的變化等。

不過,這段程式碼是從零開始編寫的,並沒有直接引用現成的蛇運動範例,而是基於 Perlin noise 和 向量運動 的概念實現的。

You said: 身體又是如何製作的呢? ChatGPT said: 蛇的身體是透過一條**點的陣列(snake 陣列)**來記錄過去的位置,然後用 p.line() 來連接這些點,形成類似貪食蛇的效果。以下是具體的作法:

  1. 建立蛇的身體數據 當蛇生成時,每條蛇的 body 陣列(snake)會預先填滿 numSegments 個點,讓蛇從一開始就有一定的長度:

這樣,蛇的身體一開始就是一條靜止的線段,全部的點都在 startX, startY。

  1. 蛇的移動 每次 draw() 迴圈中:

新增一個新的頭部位置(前進方向由 Perlin noise 控制): 確保新位置在畫布範圍內後,加入陣列: 如果超過最大長度,刪除最後一個點(保持固定長度): 3. 畫出蛇的身體 每條蛇的 body 陣列包含從頭到尾的所有位置,接著用 p.line() 來連接:

p.stroke(hue, 80, …):設定蛇的顏色,使用 HSB 色彩模式。 條紋效果:i % (stripeSpacing * 2) < stripeSpacing 控制深淺交替,使身體有條紋。 p.strokeWeight():讓蛇的尾巴變細,頭部較粗(+ (i / numSegments) * 2)。 4. 為蛇加上頭部 蛇的頭是用 p.ellipse() 畫的:

這個圓形放在 snake[0](最新的點),代表頭部。 總結 蛇的身體 是一串 p.createVector() 組成的陣列,透過 p.line() 連接。 移動時,新增一個新的頭部位置,並刪除最後一節,形成滑動效果。 顏色與條紋 透過 p.stroke() 設定,使蛇的身體有變化。 蛇頭 是一個 ellipse() 放在 snake[0] 位置。 這樣的方式確保蛇能夠順暢地游動,看起來像真的一樣!

You said: 讓尾巴再細一點,大概是身體的一半寬 ChatGPT said: Edited 現在尾巴的寬度已經調整為身體的一半,讓它看起來更細緻一些!如果還需要調整,可以再告訴我哦。