Надеюсь, я правильно понял вашу проблему, и следующий скриншот объясняет, как вы можете найти решение.Это довольно быстро и в основном зависит от ручного позиционирования слова.Прежде всего я разбил весь текст на отдельные слова;хранится в массиве myWords
.
В цикле draw
я использую две переменные - xPos
и yPos
- для представления воображаемого курсора, который перемещается по экрану.Предложение if проверяет, выпадет ли текущее слово из области эскиза (включая отступ):
float xPosEnd = xPos + textWidth (myWords[i]);
Если это так, курсор переместится в начало следующей строки.
if (xPosEnd > width - PADDING_X) {
...
Прямо сейчас расстояние зависит от мыши, а высота строки фиксирована;но также может легко быть динамичным.Вы можете использовать переменные xPos
и yPos
, чтобы поиграть с позициями слов.Кроме того, xPosEnd
указывает конечное положение слова.Как я уже сказал, этот подход довольно быстр и может применяться на уровне персонажа.
Сценарий ручного позиционирования текста
public static final int FONT_SIZE = 20;
public static final float LINE_HEIGHT = FONT_SIZE * 1.3f;
public static final float PADDING_X = 25;
public static final float PADDING_Y = 15;
PFont font;
String myText;
String[] myWords;
float spacing = 5;
void setup () {
size (480, 320);
smooth ();
font = createFont ("Arial", FONT_SIZE);
textFont (font);
myText = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, ";
myText += "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ";
myText += "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris ";
myText += "nisi ut aliquip ex ea commodo consequat.";
myWords = myText.split (" ");
}
void draw () {
background (0);
float xPos = PADDING_X;
float yPos = PADDING_Y + FONT_SIZE;
// For every word in the text
for (int i=0; i < myWords.length; i++) {
// Calculate the expected end position of
// the current word in this line
float xPosEnd = xPos + textWidth (myWords[i]);
// Check if word is not to long
// for current screen bounds. If...
if (xPosEnd > width - PADDING_X) {
// Set the cursor to the beginning
// of the next line
xPos = PADDING_X;
yPos += LINE_HEIGHT;
}
// Display word at xPos-yPos
text (myWords[i], xPos, yPos);
// Move the cursor to the right for the
// next word in list
xPos += textWidth (myWords[i]) + spacing;
}
}
void mouseMoved () {
spacing = map (mouseX, 0, width, 0, 40);
}