处理:精灵移动随机停止
问题描述:
我是新来处理和修改某人的代码。除了为什么我的精灵会随机停止之外,我明白了所有这一切。我最终失去了所有似乎是随机点的运动。任何帮助?处理:精灵移动随机停止
PImage img;
sprite player;
wall[] walls;
void setup() {
size(750, 750);
img = loadImage("sprite.png");
player = new sprite(50,300);
frameRate(60);
smooth();
walls = new wall[3];
walls[0] = new wall(250,0,40,500);
walls[1] = new wall(500,250,40,500);
walls[2] = new wall(300,200,40,500);
}
void draw() {
background(255, 255, 255);
noStroke();
player.draw();
player.move(walls);
for(int i = 0; i < walls.length; i++){
walls[i].draw();
}
}
class sprite {
float x;
float y;
sprite(float _x, float _y){
x = _x;
y = _y;
}
void draw(){
image(img,x,y);
}
void move(wall[] walls){
float possibleX = x;
float possibleY = y;
if (keyPressed==true) {
println(key);
if (key=='a') {
possibleX= possibleX - 2;
}
if (key=='d') {
possibleX = possibleX + 2;
}
if (key=='w') {
possibleY = possibleY - 2;
}
if (key=='s') {
possibleY = possibleY + 2;
}
}
boolean didCollide = false;
for(int i = 0; i < walls.length; i++){
if(possibleX > walls[i].x && possibleX < (walls[i].x + walls[i].w) && possibleY > walls[i].y && possibleY < walls[i].y + walls[i].h){
didCollide = true;
}
}
if(didCollide == false){
x = possibleX;
y = possibleY;
}
}
}
class wall {
float x;
float y;
float w;
float h;
wall(float _x, float _y, float _w, float _h){
x = _x;
y = _y;
w = _w;
h = _h;
}
void draw(){
fill(0);
rect(x,y,w,h);
}
}
答
问题就出在你的move()
功能:
void move(wall [] walls) {
...
boolean didCollide = false;
for (int i = 0; i < walls.length; i++) {
if (possibleX > walls[i].x && possibleX < (walls[i].x + walls[i].w) && ...){
didCollide = true;
}
}
if (didCollide == false) {
x = possibleX;
y = possibleY;
}
}
您检查碰撞,在for循环,这是很好的!然而,你永远不会解决碰撞(即将人Sprite从墙上移开,使墙不再位于其可能的矩形内),因此人不能再移动,因为每次调用该函数时,didCollide都会变为真仍然。
可以通过添加该代码这个下一次测试:
if (didCollide == false) {
...
} else {
println("I stopped moving.");
// could also put collision-resolving code here
}
如果你看到,在控制台,它意味着你碰了壁。
解决冲突是从墙上移动精灵,并在墙上的最近边缘之间的距离的问题,再加上多一点,这样你不接触它仍然像这样:
// If sprite to the left of the wall, i.e. went too far to the right...
float diff = walls[i].x - walls[i].w - this.x;
this.x += diff + 1.0
...
// If sprite below the wall, and essentially too high up....
float diff = walls[i].y + wall[i].h - this.y;
this.y += diff + 1.0
如果你将问题缩小到[mcve],你会有更好的运气。请注意,这不应该是你的整个草图。例如,您的问题与绘制图像无关,因此您不需要这些。把它缩小到一个硬编码矩形与另一个硬编码矩形相碰撞。你有没有尝试[调试](http://happycoding.io/tutorials/processing/debugging)你的代码? –