↓
iaen.es Diario de desarrollo Read in English

Gotic · 3 min de lectura

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.

#mundo#mods#godot#pruebas

Una barca de remos sin motor de física en Godot 4: remar, encallar y desembarcar

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. Ahora board() 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 su user://.

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.

Más de Gotic →