移动对象的数组叠加起来 [英] Array of moving objects stacking up
问题描述
我的问题涉及创建移动对象的数组。创建时在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);
}}
要点是:
- 使用类中相关的符号属性,而不是外(这将意味着在全球范围内)
- 使用不同的位置,使符号实例不重叠
请务必检查出丹尼尔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:
- using properties related to a Symbol within the class, not outside (which would mean the global scope)
- 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屋!