2016-01-06 10 views
0

Я пытаюсь сделать определенное количество отображения PShapes в сцене, это делается с помощью клавиш от 0 до 9. Сами объекты действительно появляются, но респаункообразно. Я использую arrayList для их хранения. Я подозреваю, что что-то не так с цикл, который считывает форму из массива ... но я не могу понять это ...Контрольное число PShapes в сцене с ключевым входом

import java.io.*; 
import java.util.Random; 
import java.util.ArrayList; 

Random rnd = new Random(); 

PShape torus; 
int nTorus; 
ArrayList<PShape> toruses; 



void settings() { 
    size(640, 480, P3D); 
} 

void setup() { 


    toruses = new ArrayList(); 
} 

void draw() { 

    background(0); 

    for (PShape torus : toruses) { 
    pushMatrix(); 
    translate((int)(rnd.nextDouble() * 1000-1000), (int)(rnd.nextDouble() * 1000-1000), (int)(rnd.nextDouble() * 1000-1000)); 
    shape(torus); 

    popMatrix(); 
    } 
} 


void keyPressed() { 



    if (key == '1') { 
    nTorus = 1; 
    } else if (key == '2') { 
    nTorus = 2; 
    } else if (key == '3') { 
    nTorus = 3; 
    } else if (key == '4') { 
    nTorus = 4; 
    } else if (key == '5') { 
    nTorus = 5; 
    } else if (key == '6') { 
    nTorus = 6; 
    } else if (key == '7') { 
    nTorus = 7; 
    } else if (key == '8') { 
    nTorus = 8; 
    } else if (key == '9') { 
    nTorus = 9; 
    } else if (key == '0') { 
    nTorus = 0; 
    } 


    toruses.clear(); 
    for (int i = 0; i < nTorus; i++) { 

    PShape tShape = getTorus((int)(rnd.nextDouble() * 200+50), (int)(rnd.nextDouble() * 100+50), 32, 32); 

    toruses.add(tShape); 
    } 
} 

ответ

1

У вас есть несколько вещей происходит в вашем коде :

  • Почему вы постоянно проверяете key каждый раз, когда вызывается функция draw()?
  • Вы действительно проверяете его дважды, так как вы по какой-то причине также вызываете функцию createTorus() от draw().
  • Переменная key содержит последнюю нажатую клавишу, поэтому всегда будет введен большой оператор if в вашей функции draw().

Вместо постоянной проверки функции draw() вам будет лучше использовать функцию keyPressed(). Таким образом, вы можете действовать только тогда, когда пользователь на самом деле нажимает клавишу. Затем из функции draw() вам нужно всего лишь сделать то, что находится в ArrayList.

Вот небольшой пример, который принимает этот подход, чтобы рисовать точки на основе пользовательского ввода:

ArrayList<PVector> points = new ArrayList<PVector>(); 

void setup() { 
    size(500, 500); 
} 

void keyPressed() { 

    int pointCount = 0; 

    if (key == '1') { 
    pointCount = 1; 
    } else if (key == '2') { 
    pointCount = 2; 
    } else if (key == '3') { 
    pointCount = 3; 
    } else if (key == '4') { 
    pointCount = 4; 
    } else if (key == '5') { 
    pointCount = 5; 
    } else if (key == '6') { 
    pointCount = 6; 
    } else if (key == '7') { 
    pointCount = 7; 
    } else if (key == '8') { 
    pointCount = 8; 
    } else if (key == '9') { 
    pointCount = 9; 
    } 

    points.clear(); 
    for (int i = 0; i < pointCount; i++) { 
    points.add(new PVector(random(width), random(height))); 
    } 
} 

void draw() { 
    background(0); 
    for (PVector point : points) { 
    ellipse(point.x, point.y, 10, 10); 
    } 
} 
+0

Привет, спасибо за помощь. Мне удалось заставить их появиться на сцене и не возродиться, как сумасшедшие. Однако, если я устанавливаю случайное местоположение, которое нужно установить, оно возвращается снова к респавнению ... Я использую push/popMatrix и trasnlations, чтобы сделать это. – eneko

+0

@eneko Я предлагаю задать новый вопрос. Начните с [MCVE] (http://stackoverflow.com/help/mcve), который я вам дал, и добавляю столько кода, сколько необходимо для повторения проблемы. Вам будет намного легче помочь вам. –

+0

Получил работу, спасибо! Подход был приятным и простым. – eneko

 Смежные вопросы

  • Нет связанных вопросов^_^