Change sprite of guards while strafing around them
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
@@ -9,6 +9,21 @@ class DifficultyScreen extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
backgroundColor: Colors.black,
|
backgroundColor: Colors.black,
|
||||||
|
floatingActionButton: FloatingActionButton(
|
||||||
|
backgroundColor: Colors.red[900],
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).push(
|
||||||
|
MaterialPageRoute(
|
||||||
|
builder: (_) => const WolfRenderer(
|
||||||
|
difficulty: Difficulty.bringEmOn,
|
||||||
|
// isDemo: true,
|
||||||
|
showSpriteGallery: true,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: const Icon(Icons.bug_report, color: Colors.white),
|
||||||
|
),
|
||||||
body: Center(
|
body: Center(
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
|||||||
@@ -118,8 +118,9 @@ class _WolfRendererState extends State<WolfRenderer>
|
|||||||
Entity(
|
Entity(
|
||||||
x: x + 0.5,
|
x: x + 0.5,
|
||||||
y: y + 0.5,
|
y: y + 0.5,
|
||||||
spriteIndex: 50, // Front-facing Brown Guard
|
spriteIndex: 50, // Will be overridden dynamically in tick!
|
||||||
state: EntityState.idle,
|
state: EntityState.idle,
|
||||||
|
angle: _getGuardAngle(objId), // NEW!
|
||||||
mapId: objId,
|
mapId: objId,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@@ -280,6 +281,35 @@ class _WolfRendererState extends State<WolfRenderer>
|
|||||||
}
|
}
|
||||||
_spaceWasPressed = isSpacePressed;
|
_spaceWasPressed = isSpacePressed;
|
||||||
|
|
||||||
|
// --- 4. UPDATE ENTITY SPRITES (8-WAY DIRECTIONAL) ---
|
||||||
|
for (Entity entity in entities) {
|
||||||
|
if (entity.state == EntityState.idle) {
|
||||||
|
// Find angle from the guard TO the player
|
||||||
|
double dx = player.x - entity.x;
|
||||||
|
double dy = player.y - entity.y;
|
||||||
|
double angleToPlayer = math.atan2(dy, dx);
|
||||||
|
|
||||||
|
// Find the difference between where the guard is facing and where the player is
|
||||||
|
double diff = entity.angle - angleToPlayer;
|
||||||
|
|
||||||
|
// Wrap the angle to stay within -PI and +PI
|
||||||
|
while (diff <= -math.pi) {
|
||||||
|
diff += 2 * math.pi;
|
||||||
|
}
|
||||||
|
while (diff > math.pi) {
|
||||||
|
diff -= 2 * math.pi;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Snap that difference to one of 8 octants (45 degrees each)
|
||||||
|
// Sprite 50 is Front, 51 is Front-Right, 52 is Right, etc.
|
||||||
|
int octant = ((diff + (math.pi / 8)) / (math.pi / 4)).floor() % 8;
|
||||||
|
if (octant < 0) octant += 8;
|
||||||
|
|
||||||
|
// Base idle sprite for the Brown Guard is 50
|
||||||
|
entity.spriteIndex = 50 + octant;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
setState(() {});
|
setState(() {});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -298,6 +328,27 @@ class _WolfRendererState extends State<WolfRenderer>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Decodes the Map ID to figure out which way the guard is facing
|
||||||
|
double _getGuardAngle(int objId) {
|
||||||
|
// Normalizes the ID across the 4 difficulty tiers
|
||||||
|
int normalizedId = (objId - 108) % 36;
|
||||||
|
int direction = normalizedId % 4; // 0=East, 1=North, 2=West, 3=South
|
||||||
|
|
||||||
|
// Matches the player spawn angles you already set up
|
||||||
|
switch (direction) {
|
||||||
|
case 0:
|
||||||
|
return 0.0; // East
|
||||||
|
case 1:
|
||||||
|
return 3 * math.pi / 2; // North
|
||||||
|
case 2:
|
||||||
|
return math.pi; // West
|
||||||
|
case 3:
|
||||||
|
return math.pi / 2; // South
|
||||||
|
default:
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
if (_isLoading) {
|
if (_isLoading) {
|
||||||
|
|||||||
@@ -10,7 +10,10 @@ class SpriteGallery extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(title: const Text("VSWAP Sprite Gallery")),
|
appBar: AppBar(
|
||||||
|
title: const Text("VSWAP Sprite Gallery"),
|
||||||
|
automaticallyImplyLeading: true,
|
||||||
|
),
|
||||||
backgroundColor: Colors.black,
|
backgroundColor: Colors.black,
|
||||||
body: GridView.builder(
|
body: GridView.builder(
|
||||||
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
||||||
|
|||||||
Reference in New Issue
Block a user