var playerX;var playerY;var playerSize = 15;var playerSpeed = (playerSize / Math.pow(playerSize, 1.44)) * 10;var Newcelltimer = 0;var cell = []var cellEaten = 0;var celliseaten = false;var eaten = false;var zoom = 1;var n = 0;var Xgrid = 600;var Ygrid = 600;var cpu = [];function setup() { frameRate(999) createCanvas(600, 450); playerX = Xgrid / 2 playerY = Ygrid / 2;}function draw() { background(220); push(); var Newzoom = 10 / playerSize let newnewZoom = 1.3 * lerp(0.9, 10 / playerSize, 0.5) Newzoom = lerp(zoom, Newzoom, 0.3) translate(Xgrid / 2, Ygrid / 2 - 50); scale(newnewZoom) translate(-playerX, -playerY); playerSpeed = (playerSize / Math.pow(playerSize, 1.44)) * 10 Newcelltimer++; for (var i = 0; i < cell.length / 2; i++) { let d = int(dist(cell[i * 2], cell[i * 2 + 1], playerX, playerY)) if (d <= playerSize / 2) { playerSize += 5; cell.splice(i * 2, 2) celliseaten = true; } } if (keyIsDown(UP_ARROW)) { playerY -= playerSpeed; } if (keyIsDown(RIGHT_ARROW)) { playerX += playerSpeed; } if (keyIsDown(DOWN_ARROW)) { playerY += playerSpeed; } if (keyIsDown(LEFT_ARROW)) { playerX -= playerSpeed; } if (playerX < playerSize / 2 - Xgrid) { playerX = playerSize / 2 - Xgrid } if (playerY < playerSize / 2 - Ygrid) { playerY = playerSize / 2 - Ygrid } if (playerY > 2 * Ygrid - (playerSize / 2)) { playerY = 2 * Ygrid - (playerSize / 2) } if (playerX > 2 * Xgrid - (playerSize / 2)) { playerX = 2 * Xgrid - (playerSize / 2) } if (Newcelltimer % 30 == 0) { cell.push(ceil(random(0 - Xgrid, 2 * Xgrid)), ceil(random(0 - Ygrid, 2 * Ygrid))) } if (Newcelltimer % 100 == 0) { cpu.push(random(-Xgrid, 2 * Xgrid), random(-Ygrid, 2 * Ygrid), 20) } for (var j = 0; j < cpu.length / 3; j++) { fill(0, 255, 0, 100); circle(NewposX,NewposY, cpu[j * 3 + 2]) } for (var k = 0; k < cell.length / 2; k++) { fill(0, 255, 255, 100) circle(cell[k * 2], cell[k * 2 + 1], 7) } stroke(0) fill(255,255,0) circle(playerX,playerY,playerSize); if (playerSize >= 3 * Xgrid | playerSize >= 3 * Ygrid) { if (Xgrid > Ygrid) { playerSize = 3 * Ygrid; } else { playerSize = 3 * Xgrid; } } noFill(); stroke(0, 0, 0) rect(0 - Xgrid, 0 - Ygrid, 3 * Xgrid, 3 * Ygrid) pop(); text("您的尺寸是 " + playerSize, 20, 20);}
我该如何让编程单元以类似人类的方式移动?目前,我卡在让它移动上,我想到的一种方法是使用Perlin
噪声,但这可能会一直迫使它朝一个方向移动,我可以使用随机数,并将该值映射到度数/弧度
,然后使用三角函数
来找到路径。尽管我还不确定三角函数
的解决方案是什么。
编辑:当我说“以更像人类的方式”时,我并不是在说任何复杂的事情,只是AI的移动方式不像:右,左,右,上,下,左
回答:
让某物体像人类一样移动是一项相当复杂的任务!我理解你只是希望赋予某种移动以自然的外观。P5的噪声函数是实现这一目标的最简单方法。
P5的噪声函数返回一个0到1之间的浮点数,如果直接应用于对象的位置,只能使其朝正方向移动。尝试使用map函数将此输出标准化为-1到1之间:
map(noise(x, y, z), 0, 1, -1, 1)
将此应用于某种变换,你的代理将在正负方向上移动。
因此,要在x轴上移动一个代理,你可以这样做:
let amp = 20; // 你希望代理移动的幅度let offsetX = map(noise, 0, 1, -1, 1) * amp;ellipse(200 + offsetX, 200, 10, 10);