Concept Sketchbook · 05 · Holding a thought together

Her.

她

Her entire life rests in the opening line of a novel. You piece together Mrs. Dalloway’s fragmented stream of consciousness.

Date
July 17, 2025
Input
Drag to gather the words, release to let go
Built with
p5.js · OpenProcessing
Status
Draft sketch · playable
Live sketch · Drag to gather the words, release to let goOpen on OpenProcessing ↗
(01)

Exploration

The feeling · Holding a thought together

What does it feel like to hold a thought together?

A sentence floats apart on the screen. The player can only keep it whole by holding on. Letting go is not failure. It is just what thoughts do.

(02)

Narrative exploration

The sketch takes the first line of Virginia Woolf’s Mrs Dalloway: “Mrs. Dalloway said she would buy the flowers herself.”

In the novel, a whole day and a whole life unfold from that line. Here the words drift like thoughts on water, set in a minimal pixel typeface.

The same sentence can be read in English, Chinese or Japanese, and each language breaks it into different pieces.

Point of view

The player is inside Clarissa Dalloway’s mind, or close to it. They are not her, but they do what her thinking does: gather, lose hold, gather again.

Narrative structure

Stream of consciousness, the technique Woolf’s novel is known for, turned into an action. The whole story is one sentence, and the player keeps putting it together and losing it. The narrative does not move forward. It loops, the way a mind returns to the same thought.

Motifs

The flowers

An ordinary errand. Woolf turned buying flowers into the start of a whole day of memory.

The thin line

What holds a thought together. It exists only while the player keeps holding.

Three languages

The same thought in three shapes. Each language breaks the sentence differently, so each version is a different mind.

Emotional arc
  1. 01

    Drift

    Words float apart on a pale page. Nothing is in order.

  2. 02

    Gathering

    Holding the button, the player pulls the words in. They line up as the sentence, trailing behind like a thought being followed.

  3. 03

    Release

    Letting go, everything scatters. It is not a failure, just a mind moving on, and the player can begin again.

Mechanic as meaning
ActionMeaning
Holding the mouse→Paying attention
Words chaining in order→A thought taking shape
Letting go→The mind wandering again
Switching language→The same thought, broken differently
(03)

Result and iteration

What came out of it

Holding on became a line. Collected words link up behind the cursor in the order of the sentence, joined by thin strokes, and fall apart the moment the player lets go. The feeling that came out of it is how fragile attention is.

Lines from the sketch
Mrs. Dalloway said she would buy the flowers herself.达洛维夫人说,她会亲自去买花。
ダロウェイ夫人は、自分で花を買うつもりだと言った。Japanese · 日文
Decisions in the code

Order comes from the sentence

Words can be picked up in any order, but they always line up as the sentence. The player gathers, the sentence arranges.

40 px apart, easing 10%

Each word follows the one before it at 40 px and moves 10% of the way each frame, so the chain trails like a thought.

Release resets

Letting go scatters everything. There is no partial save, just as there isn’t for a thought.

(04)

Code

Structure
sentences{}
The opening line in English, Chinese and Japanese, split into words.
loadWords() / resetWords()
Builds the floating words for the chosen language and scatters them again.
mouseDragged()
Collects any floating word the cursor passes over.
draw()
Floats the loose words, then chains the collected ones behind the cursor in sentence order and draws lines between them.
mousePressed() / mouseReleased()
Language buttons on press. Release scatters the words.
draw(): a sentence that followsp5.js
// collected words, in the order of the original sentence
let chain = [];
for (let target of wordList) {
  let found = words.find(w => w.text === target && w.collected);
  if (found) chain.push(found);
}

// each word follows the one in front of it; the first follows the cursor
for (let i = 0; i < chain.length; i++) {
  let word = chain[i];
  let target = i === 0 ? { x: mouseX, y: mouseY } : chain[i - 1];
  let angle = atan2(target.y - word.y, target.x - word.x);
  let desiredX = target.x - cos(angle) * 40;
  let desiredY = target.y - sin(angle) * 40;
  word.x = lerp(word.x, desiredX, 0.1);
  word.y = lerp(word.y, desiredY, 0.1);
}

// a thin line ties the thought together
stroke(80);
for (let i = 0; i < chain.length - 1; i++) {
  line(chain[i].x, chain[i].y, chain[i + 1].x, chain[i + 1].y);
}

Condensed from the original for reading. The order is read from the sentence, not from when the words were picked up.

Full source on OpenProcessing ↗The embedded sketch above also has a Code tab with the complete source.

(05)

Method

What this sketch taught me about the method
01

Make holding the cost

Attention is a held button. Letting go is always allowed and always costs the whole thought.

02

Let the content do the sorting

The sentence arranges itself, so the player can gather freely.

03

Translate the feeling, not just the words

Three languages break the same line into different pieces, and so into different games.

See the method behind the series →

概念速写本 · 05 · 把思绪拢在一起

她.

Her

她的一生,躺在小说的开头。你可以串联起达洛维夫人混乱的思绪。

日期
2025 年 7 月 17 日
操作
拖动收集词语,松开放手
工具
p5.js · OpenProcessing
状态
草稿速写 · 可试玩
在线试玩 · 拖动收集词语,松开放手在 OpenProcessing 打开 ↗
(01)

探索

感受 · 把思绪拢在一起

把一个念头拢在一起,是什么感觉?

一句话在屏幕上散开漂浮,玩家只有一直按住,才能让它保持完整。松手不算失败,思绪本来就是这样。

(02)

叙事探索

速写取自弗吉尼亚·伍尔夫《达洛维夫人》的第一句:“达洛维夫人说,她会亲自去买花。”

小说里,一整天、一整个人生都从这句话展开。在这里,词语像水面上的思绪一样漂浮,用极简的像素字体呈现。

同一句话可以切换成英文、中文或日文来读,每种语言都会把它拆成不同的碎片。

视角

玩家身处达洛维夫人的意识里,或者离它很近。玩家不是她,但做着她的思绪在做的事:聚拢、松开、再聚拢。

叙事结构

意识流,伍尔夫这部小说最为人所知的写法,在这里变成了一个动作。整个故事只有一句话,玩家一次次把它拼起来,又一次次失去。叙事不向前推进,而是循环,就像思绪总会回到同一个念头。

意象

花

一件寻常的小事。伍尔夫把买花写成了一整天回忆的开端。

细线

把念头连在一起的东西,只在玩家按住时存在。

三种语言

同一个念头的三种形状。每种语言拆句的方式不同,每个版本都是不同的思绪。

情绪曲线
  1. 01

    漂浮

    词语在浅色的页面上四散漂浮,没有任何顺序。

  2. 02

    聚拢

    按住鼠标,玩家把词语拉过来。它们按句子排好,拖在后面,像一个正被追随的念头。

  3. 03

    松开

    一松手,一切散开。这不是失败,只是思绪去了别处,玩家可以重新开始。

机制即意义
动作含义
按住鼠标→集中注意
词语按顺序连成一串→一个念头成形
松开→思绪又飘走
切换语言→同一个念头,被拆成不同的样子
(03)

结果与迭代

得到了什么

“握住”变成了一条线:收集到的词按句子的顺序跟在光标后面,用细线连在一起;玩家一松手,它们就散开。由此得到的感受是“注意力有多脆弱”。

速写里的句子
达洛维夫人说,她会亲自去买花。Mrs. Dalloway said she would buy the flowers herself.
Japanese · 日文ダロウェイ夫人は、自分で花を買うつもりだと言った。
代码里的决定

顺序来自句子

词语可以任意顺序拾起,但总会按句子排好。玩家负责收集,句子负责排列。

间隔 40 px,每帧靠近 10%

每个词以 40 px 的间距跟着前一个词,每一帧走 10% 的距离,这串词拖在后面,像一个念头。

松手即重置

一松手全部散开,没有“存一半”,念头也没有。

(04)

代码解读

结构
sentences{}
开篇句的英文、中文、日文版本,拆成词语。
loadWords() / resetWords()
为所选语言生成漂浮的词,并重新打散。
mouseDragged()
收集光标经过的漂浮词语。
draw()
让散开的词漂浮,再把收集到的词按句子顺序串在光标后面,并在它们之间画线。
mousePressed() / mouseReleased()
按下时处理语言按钮;松开时打散词语。
draw():跟着走的句子p5.js
// collected words, in the order of the original sentence
let chain = [];
for (let target of wordList) {
  let found = words.find(w => w.text === target && w.collected);
  if (found) chain.push(found);
}

// each word follows the one in front of it; the first follows the cursor
for (let i = 0; i < chain.length; i++) {
  let word = chain[i];
  let target = i === 0 ? { x: mouseX, y: mouseY } : chain[i - 1];
  let angle = atan2(target.y - word.y, target.x - word.x);
  let desiredX = target.x - cos(angle) * 40;
  let desiredY = target.y - sin(angle) * 40;
  word.x = lerp(word.x, desiredX, 0.1);
  word.y = lerp(word.y, desiredY, 0.1);
}

// a thin line ties the thought together
stroke(80);
for (let i = 0; i < chain.length - 1; i++) {
  line(chain[i].x, chain[i].y, chain[i + 1].x, chain[i + 1].y);
}

为方便阅读做了精简。顺序读取自原句,而不是词语被拾起的先后。

在 OpenProcessing 查看完整源码 ↗上方嵌入的速写里也有 Code 标签,可以查看完整源码。

(05)

方法

这个速写对方法的启发
01

让“握住”成为代价

注意力就是一个按住的按键。随时可以松手,但松手就失去整个念头。

02

让内容自己排序

句子会自己排好,玩家可以随意收集。

03

翻译感受,而不只是文字

三种语言把同一句话拆成不同的碎片,也就成了三种不同的玩法。

查看整个系列的方法 →