移动对象的数组叠加起来 [英] Array of moving objects stacking up

查看:124
本文介绍了移动对象的数组叠加起来的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题涉及创建移动对象的数组。创建时在x = 200的目标是使每一个创建符号开始,然后沿x轴移动。这是通过创建单独的对象,不过当我试图让他们出现在阵,他们只是出现在彼此顶部可能(做球透明的,所以你可以看到他们叠加)。有没有一种方法来创建独立的数组对象的数组,这样不会发生这种情况。

  INT numSymbols = 100;
诠释symbolXPos;
INT I;符号[]符号=新符号[numSymbols]无效设置(){
的for(int i = 0; I< numSymbols;我++){
   符号由[i] =新符号();
  }  大小(748,1024);
    }    无效的draw(){
  背景(255,255,255);
  我++;
  如果(ⅰ→10){
符号[1] .addSymbol(ⅰ);
  }
  如果(ⅰ大于100){
符号[2] .addSymbol(ⅰ);
  }
  如果(ⅰ> 200){
符号[3] .addSymbol(ⅰ);
  }}  INT symbolY = 748-2 * 6-89-180;
  INT symbolX = 200;
  诠释symbolPos;
  布尔firstLoop =真;
INT xSpeed​​;类符号{   无效addSymbol(INT xSpeed​​){如果(firstLoop ==真){
symbolXPos = xSpeed​​;
firstLoop = FALSE;
}其他{  xSpeed​​ = symbolX +(xSpeed​​ - symbolXPos);填写(0,0,0,20);
noStroke();
矩形(xSpeed​​,symbolY,36,36,18);
}
}
}


解决方案

这看起来很奇怪,第一部分是您有一个似乎与一个符号实例这些属性,而不是主要适用范围:

  INT symbolY = 748-2 * 6-89-180;
  INT symbolX = 200;
  诠释symbolPos;
  布尔firstLoop =真;
  INT xSpeed​​;

也许你的意思是这样的:

  INT numSymbols = 100;
诠释symbolXPos;
INT I;符号[]符号=新符号[numSymbols]无效设置(){
  的for(int i = 0; I< numSymbols;我++){
    符号由[i] =新符号();
  }  大小(748,1024);
}无效的draw(){
  后台(255,255,255);
  我++;
  如果(ⅰ→10){
    符号[1] .addSymbol(ⅰ);
  }
  如果(ⅰ大于100){
    符号[2] .iaddSymbol(ⅰ);
  }
  如果(ⅰ> 200){
    符号[3] .addSymbol(ⅰ);
  }
}类符号{
  INT symbolY = 748-2 * 6-89-180;
  INT symbolX = 200;
  诠释symbolPos;
  布尔firstLoop =真;
  INT xSpeed​​;  无效addSymbol(INT xSpeed​​){    如果(firstLoop ==真){
      symbolXPos = xSpeed​​;
      firstLoop = FALSE;
    }其他{      xSpeed​​ = symbolX +(xSpeed​​ - symbolXPos);      填充(0,0,0,20);
      noStroke();
      矩形(xSpeed​​,symbolY,36,36,18);
    }
  }
}

即便如此,感觉就像在code是更复杂的比它应该是并没有关于类和对象/实例一些混乱。

让我们假设你只是要水平移动的符号。你可以用这样简单的类:

 类符号{
  //位置
  浮X;
  浮ÿ;
  //速度
  浮speedX;  无效updateAndDraw(){
    //更新位置
    X + = speedX;
    如果出界//重置为0
    如果(X GT;宽)×= 0;
    //画
    矩形(X,Y,8,8,18);
  }}

它有一个X,Y和只是一个 speedX 现在。 x属性由速度递增,并且更新后的位置来呈现在屏幕上的符号

下面是使用上述类的基本的素描:

  INT numSymbols = 100;
符号[]符号=新符号[numSymbols]无效设置(){
  大小(748,1024);
  填充(0,0,0,64);
  noStroke();  的for(int i = 0; I< numSymbols;我++){
    符号由[i] =新符号();
    //用不同的速度轻松地告诉符号APPART
    符号[I] .speedX = 0.01 *第(i + 1);
    //增量y位置使符号不重叠
    符号[I] .Y = 10 *我;
  }
}
无效的draw(){
  背景(255);
  的for(int i = 0; I< numSymbols;我++){
    符号[I] .updateAndDraw();
  }
}
类符号{
  //位置
  浮X;
  浮ÿ;
  //速度
  浮speedX;  无效updateAndDraw(){
    //更新位置
    X + = speedX;
    如果出界//重置为0
    如果(X GT;宽)×= 0;
    //画
    矩形(X,Y,8,8,18);
  }}

要点是:


  1. 使用类中相关的符号属性,而不是外(这将意味着在全球范围内)

  2. 使用不同的位置,使符号实例不重叠

请务必检查出丹尼尔Shiffman的对象教程,它提供了一个很好的和简单的介绍到对象面向对象编程

My question concerns creating an array of moving objects. The goal is to have each created "symbol" starts at x=200 when created and then moves along the x-axis. This is possible by creating individual objects, though when I try to make them appear in an array they just appear on top of each other (made the balls transparent so you can see them stack). Is there a way to create an array of individual array objects so that this doesn't happen.

int numSymbols = 100;
int symbolXPos;
int i;

Symbol[] symbols = new Symbol[numSymbols];   

void setup(){
for(int i = 0; i < numSymbols; i++){
   symbols[i] = new Symbol(); 
  }

  size(748,1024);
    }

    void draw(){
  background(255,255,255);
  i++;
  if(i > 10){
symbols[1].addSymbol(i);
  }
  if(i > 100){
symbols[2].addSymbol(i);
  }
  if(i > 200){
symbols[3].addSymbol(i);
  }

}

  int symbolY = 748-2*6-89-180;
  int symbolX = 200; 
  int symbolPos;
  boolean firstLoop = true;
int xSpeed;

class Symbol{

   void addSymbol(int xSpeed){

if(firstLoop == true){
symbolXPos = xSpeed;
firstLoop = false;
}else{

  xSpeed = symbolX + (xSpeed - symbolXPos);    

fill(0,0,0,20);
noStroke();
rect(xSpeed,symbolY, 36, 36, 18);
}
}
}

解决方案

The first part that looks strange is that you have these properties that seem related to a Symbol instance, and not to the main scope:

int symbolY = 748-2*6-89-180;
  int symbolX = 200; 
  int symbolPos;
  boolean firstLoop = true;
  int xSpeed;

perhaps you meant something like this:

int numSymbols = 100;
int symbolXPos;
int i;

Symbol[] symbols = new Symbol[numSymbols];   

void setup() {
  for (int i = 0; i < numSymbols; i++) {
    symbols[i] = new Symbol();
  }

  size(748, 1024);
}

void draw() {
  background(255, 255, 255);
  i++;
  if (i > 10) {
    symbols[1].addSymbol(i);
  }
  if (i > 100) {
    symbols[2].iaddSymbol(i);
  }
  if (i > 200) {
    symbols[3].addSymbol(i);
  }
}

class Symbol {
  int symbolY = 748-2*6-89-180;
  int symbolX = 200; 
  int symbolPos;
  boolean firstLoop = true;
  int xSpeed;

  void addSymbol(int xSpeed) {

    if (firstLoop == true) {
      symbolXPos = xSpeed;
      firstLoop = false;
    } else {

      xSpeed = symbolX + (xSpeed - symbolXPos);    

      fill(0, 0, 0, 20);
      noStroke();
      rect(xSpeed, symbolY, 36, 36, 18);
    }
  }
}

Even so, it feels like the code is more complex than it should be and there is some confusion regarding classes and objects/instances.

Let's assume you're simply going to move symbols horizontally. You could use a class as simple as this:

class Symbol{
  //position
  float x;
  float y;
  //speed
  float speedX;

  void updateAndDraw(){
    //update position
    x += speedX;
    //reset to 0 if out of bounds
    if(x > width) x = 0;
    //draw
    rect(x, y, 8, 8, 18);
  }

}

It has an x,y and just a speedX for now. The x property is incremented by the speed, and the updated position is used to render the symbol on screen.

Here's a basic sketch using the above class:

int numSymbols = 100;
Symbol[] symbols = new Symbol[numSymbols];

void setup(){
  size(748, 1024);
  fill(0, 0, 0, 64);
  noStroke();

  for (int i = 0; i < numSymbols; i++) {
    symbols[i] = new Symbol();
    //use different speeds to easily tell the symbols appart
    symbols[i].speedX = 0.01 * (i+1);
    //increment y position so symbols don't overlap
    symbols[i].y = 10 * i;
  }
}
void draw(){
  background(255);
  for (int i = 0; i < numSymbols; i++) {
    symbols[i].updateAndDraw();
  }
}
class Symbol{
  //position
  float x;
  float y;
  //speed
  float speedX;

  void updateAndDraw(){
    //update position
    x += speedX;
    //reset to 0 if out of bounds
    if(x > width) x = 0;
    //draw
    rect(x, y, 8, 8, 18);
  }

}

The key points are:

  1. using properties related to a Symbol within the class, not outside (which would mean the global scope)
  2. using different positions so Symbol instances don't overlap

Be sure to check out Daniel Shiffman's Objects tutorial, it provides a nice and easy intro to Object Oriented Programming

这篇关于移动对象的数组叠加起来的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆