英文:
Simple Collision Detection Project
问题
ArrayList<Greenball> array1 = new ArrayList<Greenball>();
ArrayList<Ghost> array2 = new ArrayList<Ghost>();
void setup(){
size(1000,500);
}
void draw(){
background(255);
for(int i = 0; i < array1.size(); i++){
array1.get(i).move();
array1.get(i).display();
}
for (int i = 0; i < array2.size(); i++){
array2.get(i).move();
array2.get(i).display();
}
}
void mousePressed(){
if (array1.size() != 5) array1.add(new Greenball(int(mouseX), int(mouseY), 40, 40));
}
void keyPressed(){
if (array2.size() != 5) array2.add(new Ghost(int(random(40, 960)), int(random(40, 460)), 40, 40));
}
class Ghost{
PImage ghost;
int x, y, w, h, xSpeed, ySpeed;
int pixelSize = 40;
Ghost(int x_, int y_, int w_, int h_){
x = x_;
y = y_;
w = w_;
h = h_;
xSpeed = int(random(-10, 10));
ySpeed = int(random(1, 10));
}
void move(){
x = x + xSpeed;
y = y + ySpeed;
if(x > width - pixelSize || x < 0){
xSpeed = xSpeed * -1;
}
if(y > height - pixelSize || y < 0){
ySpeed = ySpeed * -1;
}
}
void display(){
ghost = loadImage("greenghost.png");
image(ghost, x, y, w, h);
}
}
class Greenball{
PImage g;
int x, y, w, h, xSpeed, ySpeed;
int pixelSize = 40;
boolean alive = true;
Greenball(int x_, int y_, int w_, int h_){
x = x_;
y = y_;
w = w_;
h = h_;
xSpeed = int(random(-10, 10));
ySpeed = int(random(1, 10));
}
void move(){
x = x + xSpeed;
y = y + ySpeed;
if(x > width - pixelSize || x < 0){
xSpeed = xSpeed * -1;
}
if(y > height - pixelSize || y < 0){
ySpeed = ySpeed * -1;
}
}
void display(){
g = loadImage("green.png");
image(g, x, y, w, h);
}
void checkForCollision(Ghost ghost){
float d = dist(x, y, ghost.x, ghost.y);
float r1 = (x + y) / 2;
float r2 = (ghost.x + ghost.y) / 2;
if (d < r1 + r2) alive = false;
else alive = true;
}
}
注:以上是您提供的代码的翻译,我已经去除了注释并进行了格式调整。如果您有关于代码的具体问题或修改需求,请随时提问。
英文:
I am a newbie with coding and doing a collision detection project for my assignment. I think I got the Algorithm right but my problem is how will I access the object from my ArrayList I created and remove the object once collision is detected. Please see my code and help me to improve it to add the remove() from it. I added a boolean variable to check if true or false then do the remove function.
My end goal is to remove the ghost when it collides with the green ball
ArrayList<Greenball> array1 = new ArrayList<Greenball>();
ArrayList<Ghost> array2 = new ArrayList<Ghost>();
void setup(){
size(1000,500);
}
void draw(){
background(255);
for(int i = 0; i < array1.size() ; i++){
array1.get(i).move();
array1.get(i).display();
}
for (int i = 0; i < array2.size() ; i++){
array2.get(i).move();
array2.get(i).display();
}
}
void mousePressed(){
if (array1.size() != 5) array1.add(new Greenball(int(mouseX),int(mouseY), 40, 40)); //max at 5
}
void keyPressed(){
if (array2.size() != 5)array2.add(new Ghost(int(random(40,960)), int(random(40,460)), 40, 40)); //max at 5
class Ghost{
PImage ghost;
int x,y,w,h,xSpeed,ySpeed;
int pixelSize = 40;
Ghost(int x_, int y_, int w_, int h_){
x = x_;
y = y_;
w = w_;
h = h_;
xSpeed = int(random(-10,10));
ySpeed = int(random(1,10));
}
void move(){
x = x + xSpeed;
y = y + ySpeed;
if(x > width-pixelSize || x < 0){
xSpeed = xSpeed * -1;
}
if(y > height-pixelSize || y < 0){
ySpeed = ySpeed * -1;
}
}
void display(){
ghost = loadImage("greenghost.png");
image(ghost,x,y,w,h);
}
class Greenball{
PImage g;
int x,y,w,h,xSpeed,ySpeed;
int pixelSize = 40;
boolean alive=true;
Greenball(int x_, int y_, int w_, int h_){
x = x_;
y = y_;
w = w_;
h = h_;
xSpeed = int(random(-10,10));
ySpeed = int(random(1,10));
}
void move(){
x = x + xSpeed;
y = y + ySpeed;
if(x > width-pixelSize || x < 0){
xSpeed = xSpeed * -1;
}
if(y > height-pixelSize || y < 0){
ySpeed = ySpeed * -1;
}
}
void display(){
g = loadImage("green.png");
image(g,x,y,w,h);
}
void checkForCollision(Ghost ghost){
float d = dist(x,y,ghost.x,ghost.y);
float r1 = (x+y)/2;
float r2 = (ghost.x + ghost.y)/2;
if (d < r1 + r2) alive = false;
else alive = true;
}
}
答案1
得分: 1
将draw()
函数内添加_Collision Detection Function_
,并运行两个嵌套的for
循环,以便检查是否有任何Ghosts
与任何Greenballs
发生碰撞。
您可以使用以下代码替换您的draw()
函数:
void draw() {
background(255);
// 遍历所有Ghosts
for(int i = 0; i < array2.size(); i++) {
// 移动并显示Ghosts
array2.get(i).move();
array2.get(i).display();
/*
* 对于每个Ghost,检查该Ghost是否与任何Greenball发生碰撞。
* 在这里,您正在检查每个Ghost是否与每个Greenball发生碰撞。
*/
for (int j = 0; j < array2.size(); j++) { // 对于每个Greenball,
if (array1.get(i).checkForCollision(array2.get(j))) { // 如果有任何Ghost与之碰撞,
array1.get(j).alive = false; // 那么将其设置为“alive = false”
}
}
}
// 反向遍历所有Greenballs,以便检查每一个Greenball
for(int i = array1.size() - 1; i >= 0; i--) {
if (array1.get(i).alive == false) { // 如果有任何Greenball死亡,
array1.remove(i); // 那么将其移除
} else { // 否则,移动并显示它。
array1.get(i).move();
array1.get(i).display();
}
}
}
建议:您不需要每次显示Ghost
或Greenball
时都调用loadImage()
,因为这会对您的系统造成很大负担。只需在构造函数中使用ghost = loadImage("ghost.png")
一次即可。
英文:
Add the Collision Detection Function inside draw()
and run two nested for
loops so that you check if any of the Ghosts
is colliding with any of the Greenballs
You can replace your draw function with the following code:
void draw() {
background(255);
// loop through all the Ghosts
for(int i = 0; i < array2.size(); i++) {
//move and display the Ghosts
array2.get(i).move();
array2.get(i).display();
/*
* For every Ghost, check if that Ghost is colliding with any Greenball.
* Here you are checking collision with each Ghost for each Greenball.
*/
for (int j = 0; j < array2.size(); j++) { // for each Greenball,
if (array1.get(i).checkForCollision(array2.get(j)) { // if any Ghost is Colliding with it,
array1.get(j).alive = false; // then set "alive = false" for it
}
}
}
// loop through all the Greenballs in reverse order, so that each and every Greenball is checked
for(int i = array1.size() - 1; i >= 0; i--) {
if (array1.get(i).alive = false) { // if any Greenball is dead,
array1.remove(i); // then remove it
} else { // else, move and display it.
array1.get(i).move();
array1.get(i).display();
}
}
}
Suggestion: You don't need to loadImage()
everytime you display the Ghost
or Greenball
as it is very taxing on your system. Just use ghost = loadImage("ghost.png")
once in the Constructor and you're done.
答案2
得分: 0
依赖于您从何处调用`checkForCollision`方法。我认为最好的地方是`draw`方法。尝试用以下代码替换您的第二个循环:
Iterator<Ghost> ghostIterator = array2.iterator(); // 获取迭代器对象
while (ghostIterator.hasNext()) {
Ghost ghost = ghostIterator.next(); // 获取当前ghost对象
ghost.move(); // 重新计算位置
boolean collided = false;
for (int i = 0, len = array1.size(); i < len; i++) {
if (array1.get(i).checkForCollision(ghost)) { // 检查碰撞
ghostIterator.remove(ghost); // 如果发生碰撞,移除当前ghost
collided = true;
break; // 由于检测到碰撞,停止内部循环
}
if (!collided) {
ghost.display(); // 如果ghost没有碰撞,显示它
}
}
}
请注意,您应该将`checkForCollision`方法的返回类型从`void`更改为`boolean`,并返回计算出的`alive`值。
英文:
It depends on where do you call the checkForCollision
method from. I think the best place for it is the draw
method. Try replace your second loop with the following code:
Iterator<Ghost> ghostIterator = array2.iterator(); // get iterator object
while (ghostIterator.hasNext()) {
Ghost ghost = ghostIterator.next(); // get current ghost object
ghost.move(); // recalculate position
boolean collided = false;
for (int i = 0, len = array1.size(); i < len; i++) {
if (array1.get(i).checkForCollision(ghost)) { // check for collision
ghostIterator.remove(ghost); // remove current ghost if it collided
collided = true;
break; // stop inside loop due to collision detected
}
if (!collided) {
ghost.display(); // if ghost isn`t collided display it
}
}
}
Please note you should change return type of the checkForCollision
method from void
to boolean
and returns calculated alive
value.
答案3
得分: 0
void draw() {
background(0);
for (int i = 0; i < gball1.size(); i++) {
Greenball gball = gball1.get(i);
gball.move();
gball.display();
}
for (int i = 0; i < ghost2.size(); i++) {
Ghost ghost = ghost2.get(i);
ghost.move();
ghost.display();
for (int e = 0; e < gball1.size(); e++) {
Greenball b = gball1.get(e);
if (ghost.ifCollided(b)) {
ghost2.remove(i);
}
}
}
}
英文:
void draw(){
background(0);
for(int i = 0; i < gball1.size() ; i++){
Greenball gball = gball1.get(i);
gball.move();
gball.display();
}
for(int i = 0; i < ghost2.size() ; i++){
Ghost ghost = ghost2.get(i);
ghost.move();
ghost.display();
for(int e = 0; e < gball1.size(); e++){
Greenball b = gball1.get(e);
if(ghost.ifCollided(b)){
ghost2.remove(i);
}
}
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论