当尝试将p5适配为react-p5时,我可以使用两个setup & draw方法创建一个简单的草图。
当尝试设置一个更复杂的示例时,在p5.js画布中显示一些实体,我需要p5.js方法在画布中绘制它。
按照react-p5的教程,它是says:
如果你需要在Sketch方法之外的react-p5使用的P5示例,那么你可以从window.p5中获得它。
这里的行为令人惊讶:当我尝试访问p5全局示例时,我可以访问一些方法,如window.p5.Vector.random2D()
,但有些方法不可用,如window.p5.stroke(_, _);
。而window.p5
示例与p5
示例的类型相同,作为草图的绘制和设置函数中的参数传递。
我的问题是:如何获得全局可用的完整示例?我需要这个来画我的粒子。现在我可以访问P5的全局示例,但它不能满足所有需求。
下面是sketch with stackblitz的工作示例
下面是所涉及的代码:
import React from "react";
import Sketch from "react-p5";
import p5Types, { Vector } from "p5";
class Particle {
acceleration: Vector;
velocity: Vector;
position: Vector;
lifespan : number;
constructor(position : Vector) {
// window.p5.Vector.random2D method is accessible
this.acceleration = window.p5.Vector.random2D();
this.velocity = window.p5.Vector.random2D();
this.position = position.copy();
this.lifespan = 255;
}
update() {
this.velocity.add(this.acceleration);
this.position.add(this.velocity);
this.lifespan -= 2;
}
display() {
// the four methods below are not accessible from p5 instance
window.p5.stroke(200, this.lifespan);
window.p5.strokeWeight(2);
window.p5.fill(127, this.lifespan);
window.p5.ellipse(this.position.x, this.position.y, 12, 12);
}
run() {
this.update();
this.display();
}
isDead() {
return this.lifespan < 0;
}
}
let particle : Particle;
function setup(p5: p5Types, canvasParentRef: Element) {
p5.createCanvas(720, 400).parent(canvasParentRef);
particle = new Particle(p5.createVector(50,50));
}
function draw(p5 : p5Types) {
p5.background(51);
particle.display();
}
export const ParticlesSketch: React.FC<{}> = () => {
return <Sketch setup={setup} draw={draw} />;
};
1条答案
按热度按时间yqlxgs2m1#
react-p5
库并不打算以这种方式使用。示例化的p5方法,如stroke
和ellipse
,应该在传递给draw
或setup
函数的示例上调用。您引用的关于使用window.p5
访问全局变量的指南可能指的是像p5.Vector
这样的类型,而不是绘图方法。话虽如此,理论上你可以让它与像这样的东西一起工作:
加上文件顶部的类型声明: