WIP fixing ASCII renderer
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
@@ -55,7 +55,11 @@ class AsciiRasterizer extends Rasterizer {
|
||||
// Terminal characters are usually twice as tall as they are wide.
|
||||
// We override the base multiplier to squish sprites horizontally.
|
||||
@override
|
||||
double get aspectMultiplier => 0.6;
|
||||
double get aspectMultiplier => 2.0;
|
||||
|
||||
// Squish the entire 3D projection vertically by 50% to counteract tall terminal fonts
|
||||
@override
|
||||
double get verticalStretch => 1.8;
|
||||
|
||||
// Intercept the base render call to initialize our text grid
|
||||
@override
|
||||
|
||||
@@ -15,6 +15,10 @@ abstract class Rasterizer {
|
||||
/// ASCII renderers can override this (e.g., 0.6) to account for tall characters.
|
||||
double get aspectMultiplier => 1.0;
|
||||
|
||||
/// A multiplier to counteract tall pixel formats (like 1:2 terminal fonts).
|
||||
/// Defaults to 1.0 (no squish) for standard pixel rendering.
|
||||
double get verticalStretch => 1.0;
|
||||
|
||||
/// The main entry point called by the game loop.
|
||||
/// Orchestrates the mathematical rendering pipeline.
|
||||
dynamic render(WolfEngine engine, FrameBuffer buffer) {
|
||||
@@ -279,7 +283,8 @@ abstract class Rasterizer {
|
||||
if (side == 1 && math.sin(player.angle) < 0) texX = 63 - texX;
|
||||
|
||||
// Calculate drawing dimensions
|
||||
int columnHeight = (viewHeight / perpWallDist).toInt();
|
||||
int columnHeight = ((viewHeight / perpWallDist) * verticalStretch)
|
||||
.toInt();
|
||||
int drawStart = (-columnHeight ~/ 2 + viewHeight ~/ 2).clamp(
|
||||
0,
|
||||
viewHeight,
|
||||
@@ -330,10 +335,12 @@ abstract class Rasterizer {
|
||||
if (transformY > 0) {
|
||||
int spriteScreenX = ((width / 2) * (1 + transformX / transformY))
|
||||
.toInt();
|
||||
int spriteHeight = (viewHeight / transformY).abs().toInt();
|
||||
int spriteHeight = ((viewHeight / transformY).abs() * verticalStretch)
|
||||
.toInt();
|
||||
|
||||
// Scale width based on the aspectMultiplier (useful for ASCII)
|
||||
int spriteWidth = (spriteHeight * aspectMultiplier).toInt();
|
||||
int spriteWidth = (spriteHeight * aspectMultiplier / verticalStretch)
|
||||
.toInt();
|
||||
|
||||
int drawStartY = -spriteHeight ~/ 2 + viewHeight ~/ 2;
|
||||
int drawEndY = spriteHeight ~/ 2 + viewHeight ~/ 2;
|
||||
|
||||
@@ -185,7 +185,7 @@ class WolfEngine {
|
||||
}
|
||||
|
||||
if (input.isFiring) {
|
||||
player.fire(elapsed.inMilliseconds);
|
||||
player.fire(_timeAliveMs);
|
||||
} else {
|
||||
player.releaseTrigger();
|
||||
}
|
||||
@@ -271,7 +271,7 @@ class WolfEngine {
|
||||
for (Entity entity in entities) {
|
||||
if (entity is Enemy) {
|
||||
final intent = entity.update(
|
||||
elapsedMs: elapsed.inMilliseconds,
|
||||
elapsedMs: _timeAliveMs,
|
||||
playerPosition: player.position,
|
||||
isWalkable: isWalkable,
|
||||
tryOpenDoor: doorManager.tryOpenDoor,
|
||||
|
||||
Reference in New Issue
Block a user