gpt4 book ai didi

javascript - 我如何让 clicked() 函数起作用?

转载 作者:行者123 更新时间:2023-12-04 08:46:29 24 4
gpt4 key购买 nike

我正在关注 Coding Train 编码挑战,挑战 #6:有丝 split 。我被困在应该检测其中一个单元格上的点击的部分。如果你把它放到你的网络浏览器中,你就会明白我的意思——它说 cells[i].clicked is not a function不久之后它说cells[i].moved is not a function即使它之前工作得很好。有人能修吗???我正在使用 atom 代码编辑器和 p5.js 库。如果你不知道 p5.js,你可能仍然知道什么是错的......不过我已经在下面的代码中引用了它。
./index.html 使用这个确切的代码,它引用了 P5.JS

<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<!-- This next part referneces p5.js -->
<script src="https://cdn.jsdelivr.net/npm/p5@1.1.9/lib/p5.js"></script>
<title>Mitosis Simulation</title>
</head>
<body>
<script src="script.js" ></script>
<script src="cell.js" ></script>
</body>
</html>
./script.js
var cells = [];

function setup() {
createCanvas(600, 600);
//make two cells
cells.push(new Cell());
cells.push(new Cell());
}

function draw() {
background(51);
//make the cells move and show
for(var i = 0; i < cells.length; i ++) {
cells[i].move();
cells[i].show();
}
}

function mousePressed() {
//this SHOULD detect a click but it doesn't
for(var i = 0; i < cells.length; i ++) {
if(cells[i].clicked(mouseX, mouseY)) {

cells.push(cells[i].mitosis);
}
}
}
./cell.js 单元格的代码,我猜你可以称之为面向对象编程
function Cell(pos, r) {
//gives the cell either the argument pos, or a random place on the canvas
this.pos = pos || createVector(random(width), random(height));
//gives it either the argument r or the radius of 80
this.r = r || 80;
//gives a random rgb color
this.c = color(0, random(150, 255), random(150, 255));

//move the cell
this.move = function() {
//define the direction that it moves
var vel = p5.Vector.random2D();
//move in that direction
this.pos.add(vel);
}

//show the cell
this.show = function() {
fill(this.c);
noStroke();
//display a cell at this.pos.x, this.pos.y with a radius of this.r
ellipse(this.pos.x, this.pos.y, this.r, this.r);
}

//return true when clicked
this.clicked = function(x, y) {
//find distance between mouseX, mouseY and its position
var d = dist(this.pos.x, this.pos.y, x, y);
//if distance is in the circle, return true
if(d < this.r / 2) {
return true;
} else {
return false;
}
}

//split in two
this.mitosis = function() {
//make a new cell exactly like its predeccesor and return it
var cellss = new Cell(this.pos, this.r/2, this.c);
return cellss;
}
}
我敢肯定这是一个愚蠢的错误或其他什么,但一定要告诉我!

最佳答案

错误在您的 mousePressed() 中:您不是将有丝 split 称为函数,您只是在说 cells[i].mitosis .当你这样做时,它不会运行有丝 split 函数,它实际上只是返回对该函数的引用。

function mousePressed() {
// detects clicks, and if there is a click, it runs the mitosis function
for(var i = 0; i < cellLength; i ++) {
if(cells[i].clicked(mouseX, mouseY)) {
cells.push(cells[i].mitosis());
}
}
}
其他一些注意事项:
  • 创建一个半径为 1/2 的新单元实际上并没有使大小减半,由于 2d 事物的工作方式,它实际上使面积小于一半。想象一下,您有一个正方形,并将每条边的长度减少 1/2:它将有 1/4 的面积。该区域的实际减半需要对对 Angular 线的长度进行一些复杂的数学运算。所以你必须用 pi 做类似的事情,Shiffman 在他的 agar.io 教程
  • 中详细介绍了这一点。
  • 最佳做法是在主要 JavaScript 代码之前引用所有类(或在本例中为闭包),例如在 HTML 中:

  •     <script src="cell.js" ></script>
    <script src="script.js" ></script>

    关于javascript - 我如何让 clicked() 函数起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64289209/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com