提问人:Serge 提问时间:7/16/2023 更新时间:7/16/2023 访问量:47
处理对象操作
Processing Object Manipulations
问:
我有一个关于处理中的对象的问题。处理或处理 Py,它们几乎相同。
这就是:我们如何操作/移动/擦除对象?
让我们想象一个移动的圆圈。它在 X 轴上移动,因为我们递增其中心点的 X 值。但是在这样做的同时,它会留下以前绘制的所有其他圆圈的痕迹。现在,我们可以在绘制新圆圈之前添加一个后台命令,这将隐藏跟踪,并且在某种程度上可以解决问题。
x = 0
def setup():
size(800, 800)
def draw():
global x
background(255, 255, 255)
circle(x, 400, 50)
x += 5
我还尝试了 OOP 方法,创建一个类,它可以创建一个圆作为方法。但是,由于它不像 Unity 中的预制件,因此一旦绘制了圆圈,我就无法真正访问它。因此,如果我想移动它,我必须重新绘制背景,然后再次调用该方法来绘制一个新圆。因此,这是相同的技术。
class moveCircle(object):
def __init__(self, x, y, r):
self.x = x
self.y = y
self.r = r
def makeCircle(self):
circle(self.x, self.y, self.r)
x = 0
def setup():
size(800, 800)
def draw():
global x
background(150, 150, 150)
a = moveCircle(x, 400, 50)
a.makeCircle()
x += 5
- 所以,我的观点是,难道没有一种正确的方法来操纵物体吗?就像我想移动圆圈一样,我可以以某种方式更改它的坐标而不是重新绘制所有这些图层吗?
- 如果不是,这是否意味着如果 a 有 3 个圆圈,其中只有一个移动,其他两个也需要重新绘制,但位置保持不变?
答:
2赞
apodidae
7/16/2023
#1
以下处理源代码演示了一种使用 PVector 数组来跟踪多个矩形的 x 和 y 坐标的技术。对象类也可用于此目的。要运行演示,请先选择要移动的对象,然后使用键盘箭头键重新定位它。
PVector[] r;
int selected = -1;
void setup() {
surface.setTitle("Move selected rectangle with keyboard arrows");
size(600, 400);
r = new PVector[3];
// init values
r[0] = new PVector(140, 20);
r[1] = new PVector(25, 50);
r[2] = new PVector(180,100);
}
void draw() {
background(209);
for(int i = 0; i < r.length; i++){
if(i == selected){
fill(0, 255, 0);
} else {
fill(209);
}
rect(r[i].x, r[i].y, 50, 50);
}
}
void mousePressed(){
for(int i = 0; i < r.length; i++){
if((mouseX >= r[i].x) && (mouseX <= r[i].x + 50) && (mouseY >= r[i].y) && (mouseY <= r[i].y + 50)) {
selected = i;
println("selected =",selected);
}
}
}
void keyPressed() {
if (key == CODED) {
if (keyCode == LEFT) {
r[selected].x-=5;
}
if (keyCode == RIGHT) {
r[selected].x+=5;
}
if (keyCode == UP) {
r[selected].y-=5;
}
if (keyCode == DOWN) {
r[selected].y+=5;
}
}
}
评论