RIVER.
A river of memories, where the dead become stars, and the living become stones.
Exploration
Can words be found in a landscape, without being told where to look?
Nothing on screen says “click here”. The stones are just stones until the player tries one. The current already bends around them, and that is the only hint that they matter.
Narrative exploration
A river carries memories downstream. The dead become stars and the living become stones. The stars are never drawn. They are the feeling the river gives off.
Each stone holds one line. Reading them is like stepping across someone’s memories, one stone at a time.
The canvas is tall and narrow, 400 by 700, so the river reads as something you look down into.
The player stands on the bank, looking down into the water. They are not one of the stones. They are a passer-by who stops to listen to the living, who have gone quiet and heavy.
Environmental storytelling. There is no narrator and no order. Eight stones each hold one of four lines, so the same words come back more than once, and every player reads them in a different order. The story is assembled by the reader, not delivered.
The river
Memory as something that moves on, whatever anyone does.
Stones
The living, whose hearts have grown heavy. They stay while everything flows past.
Stars, unseen
The dead. They are named but never drawn, which is how absence feels.
- 01
Watching
A pale yellow river, moving slowly. It is calm, almost a pattern.
- 02
Noticing
The current bends around the stones. The player wonders if they mean something, and clicks.
- 03
Listening
Words rise from the stones and stay. The river has not changed, but now the player knows what it is carrying.
Result and iteration
The river became a quiet reading game. Eight stones, four lines, placed at random each time, so no two rivers say things in the same order. The feeling that came out of it is finding, not being shown.
Memories flow away like water.记忆像水一样流走。
Every stone hides a secret.每块石头都藏着一个秘密。
Step across my memories踩过我的记忆
All aging hearts turn into stone所有老去的心都会变成石头
Eight stones, four lines
More stones than lines, so the same words repeat, the way memories do.
Current pushed by 10%
Lines that come within a stone’s radius plus 10 px are pushed outward by 10% each frame. Enough to see, never enough to break the flow.
A gentle sway
Every point of current sways by 3 px on a sine wave, so the river is never still.
Code
setup()- A 400 × 700 canvas. One FlowLine every 20 px across, and eight Stone objects at random positions.
FlowLine- A column of points every 10 px. Each frame they sway and are pushed away from nearby stones.
Stone- Random position and a radius of 15–30 px. Picks one of four lines and shows it, floating, once clicked.
draw()- Paints a translucent yellow over the canvas each frame, which leaves soft trails, then draws the current and the stones.
update() {
for (let pt of this.points) {
// the current sways gently as it moves down the screen
let shift = sin((frameCount + pt.y) * 0.02) * 3;
let px = pt.x + shift;
// near a stone? push the water outward
for (let stone of stones) {
let d = dist(px, pt.y, stone.x, stone.y);
if (d < stone.r + 10) {
px += (px - stone.x) * 0.1;
}
}
// ease toward the new position
pt.x = lerp(pt.x, px, 0.1);
}
}Lightly condensed from the original for reading. The stones never move. The water does all the noticing.
Full source on OpenProcessing ↗The embedded sketch above also has a Code tab with the complete source.
Method
Hide meaning in the world
The hint is in the landscape, not in the interface.
Use randomness for re-reading
Random placement makes each visit a slightly different river.
Let the environment react first
The current bends before the player acts, which invites the first click.
记忆之河.
这是一条记忆之河,死人的心脏会变成星星,而活着的人心脏,却随之变成了河中的石头。
探索
能不能让文字藏在风景里,不提示玩家去哪里找?
画面上没有“点这里”。石头只是石头,直到玩家试着点一下。水流本来就绕着它们弯曲,这是唯一的提示:它们很重要。
叙事探索
一条河把记忆带向下游。死去的人变成星星,活着的人变成石头。星星从不出现在画面上,它们是这条河给人的感觉。
每块石头里藏着一句话。读它们,就像一块一块踩过某个人的记忆。
画布又高又窄,400 × 700,这条河读起来像是在低头往下看。
玩家站在岸边,低头看水。玩家不是其中一块石头,而是停下来倾听的过路人。被倾听的是活着的人,他们已经变得沉默、沉重。
环境叙事。没有叙述者,也没有顺序。八块石头各藏着四句话中的一句,同样的话会不止一次出现,每个玩家读到的顺序都不一样。故事是读者自己拼起来的,而不是被讲给他听的。
河
记忆是会流走的东西,无论谁做什么。
石头
活着的人,心已经变得沉重。一切从他们身边流过,他们留在原地。
看不见的星星
死去的人。被说出名字,却从不被画出来,缺席就是这种感觉。
- 01
观看
一条淡黄色的河,缓缓流动,平静得几乎像一张图案。
- 02
留意
水流绕着石头弯曲。玩家开始好奇它们是否有意义,于是点了一下。
- 03
倾听
字从石头里浮起来,并且留在那里。河没有变,但玩家现在知道它承载着什么了。
结果与迭代
这条河成了一个安静的阅读游戏:八块石头、四句话,每次随机摆放,所以没有两条河以同样的顺序说话。由此得到的感受是“自己找到”,而不是“被告知”。
记忆像水一样流走。Memories flow away like water.
每块石头都藏着一个秘密。Every stone hides a secret.
踩过我的记忆Step across my memories
所有老去的心都会变成石头All aging hearts turn into stone
八块石头,四句话
石头比句子多,同样的话会重复出现,就像记忆一样。
水流被推开 10%
进入石头半径再加 10 px 范围的水流,每一帧被向外推开 10%:看得出来,又不会打断水流。
轻轻摆动
每个水流点按正弦波摆动 3 px,河永远不会静止。
代码解读
setup()- 400 × 700 的画布。横向每 20 px 一条 FlowLine,再随机放下八个 Stone 对象。
FlowLine- 每 10 px 一个点组成的一列。每一帧,点会摆动,并被附近的石头推开。
Stone- 随机位置,半径 15–30 px。从四句话里随机挑一句,被点击后漂浮着显示出来。
draw()- 每一帧在画布上刷一层半透明的黄色,留下柔和的残影,再画水流和石头。
update() {
for (let pt of this.points) {
// the current sways gently as it moves down the screen
let shift = sin((frameCount + pt.y) * 0.02) * 3;
let px = pt.x + shift;
// near a stone? push the water outward
for (let stone of stones) {
let d = dist(px, pt.y, stone.x, stone.y);
if (d < stone.r + 10) {
px += (px - stone.x) * 0.1;
}
}
// ease toward the new position
pt.x = lerp(pt.x, px, 0.1);
}
}为方便阅读略作精简。石头从不移动,留意到石头的始终是水。
在 OpenProcessing 查看完整源码 ↗上方嵌入的速写里也有 Code 标签,可以查看完整源码。
方法
把意义藏进世界
提示在风景里,不在界面上。
用随机换来重读
随机摆放让每次来看的都是一条略有不同的河。
让环境先回应
玩家还没动,水流就已经绕开了石头,这邀请了第一次点击。