Una barca de remos sin motor de física en Godot 4: remar, encallar y desembarcar
Un bote en el muelle de Caleta para remar por la costa, desembarcar en el islote y pescar en mar abierto. Sin física de verdad: solo mira la hondura del agua y el muelle.

Desde la orilla y el muelle de Caleta Salobre el agua no pasa de unos 2 m. El mar abierto, donde viven los peces grandes, empieza a unos 200 m, y llegar nadando era una paliza. Así que en la punta del muelle amarré un bote de remos.
Con R (USAR en el móvil) te subes. El joystick o WASD rema: el bote gira hacia donde empujas, relativo a la cámara, y avanza más cuanto más de frente vaya. SALTAR te baja: junto a tierra, al muelle o donde el agua cubre poco, de pie; en agua honda, nadando junto al bote, y desde el agua te puedes volver a subir. El bote se queda donde lo dejas, sale en el mapa, y desde el noray del muelle se trae de vuelta. Parado, se puede pescar desde él, y así se llega al mar abierto y a sus peces.
Cómo está hecho
No hay física de verdad. Mientras vas a bordo, el mod es el mover del jugador (como la escoba cuando vuela): cada paso decide dónde está el bote y sienta al jugador encima. La única pregunta es si el bote cabe en el sitio siguiente:
func free_at(p: Vector2, ahead: Vector2) -> bool:
var bow := p + ahead * BOW
if depth_at(p) < DRAFT or depth_at(bow) < DRAFT:
return false
if absf(p.x) > Island.LIMIT - EDGE or absf(p.y) > Island.LIMIT - EDGE:
return false
for q in [p, bow]:
if _pier_distance(q) < PIER_CLEAR:
return false
for d in decor:
if q.distance_to(d) < DECOR_CLEAR:
return false
return true
Mira el agua bajo el centro y bajo la proa (DRAFT son 0,6 m), el borde del mundo, el muelle como un segmento y las dos barcas de adorno de Caleta. Si no cabe, se para y te avisa de que ahí no hay fondo. Como la isla no se guarda sino que se calcula con una función de altura, la hondura se puede preguntar en cualquier punto.
Rema a 4,5 m/s como mucho (nadando se va a 2,6 y corriendo a 6). Al estar en el bote, la interacción común se apaga, y por eso se baja con SALTAR y no con USAR: no hizo falta otro botón. La pesca tampoco conoce la barca. Pregunta al mover si allows_fishing(), y el bote dice que sí cuando va a menos de 0,25 m/s y no estás remando.
Si guardas yendo a bordo, al cargar sigues a bordo. Si el sitio guardado no es agua con fondo, el bote vuelve al amarre.
Lo que salió mal
- Al subir, el jugador iba de pie hasta el primer paso de física. La postura sentada la ponía el primer
move_player, y la pesca, que guarda la postura que hay al lanzar, se quedaba con la de estar de pie. Ahoraboard()te sienta en el momento, y hay una prueba que mira la postura sin esperar a la física. - Desde el agua se veía hueca la punta del muelle de Caleta. El muelle de los pueblos no tenía testas desde antes de esta ronda, y no se vio hasta mirarlo desde el bote. Se cerró por las dos caras, con prueba.
- La barca la hizo una sesión de Claude a la vez que otra hacía la pesca. Dos sesiones en el mismo repositorio comparten la carpeta temporal y
user://, y las pruebas de una pisaban las partidas de prueba de la otra: cada una acabó con su worktree y suuser://.
Medido en el PC: 32 comprobaciones con la física del motor (remar, encallar ante el islote, bajarse en el muelle, en la orilla y en alta mar, volver a subir nadando, controles táctiles, guardar). Coste de dibujo: en mar abierto, 56–70 llamadas; con la barca amarrada y el pueblo delante, 322.
Lo que falta por comprobar
Sin probar en el móvil. El sonido de la remada se generó y se midió, pero no se ha escuchado. Y como no hay física, el bote no choca con los postes del muelle ni con las barcas de otros pueblos, y girando pegado al muelle la proa puede asomar sobre la tablazón.