Sign in to follow this  
YardGnomeNinja

Overriding default drawing for a Roguelike FOV calculation

Recommended Posts

To start, I'll say, there may be a better way than what I'm thinking, so I'm very open to suggestions.

 

I'm making a Roguelike. I have rooms with attaching tunnels, a player that can move to free spaces, the VERY basics.

 

I've reached the point of implementing an FOV (Field of View). I've got it in place for the most part. When the map is drawn, only the visible spaces within the player's FOV display their tiles, however when it comes to updating the display I'm getting nowhere, very...very... slowly.

 

I've tried calling my "recalculateFOV" function in the Phaser "update" state, only to be fired when the player moves, then redrawing the entire map based on the results. This is agonizingly slow for some reason I can't quite decipher and just doesn't work properly.

 

Then I thought maybe I needed to overwrite how Phaser handles drawing to get the job done. I Googled for any help on how to go about that and came up empty.

 

I've read a couple of Phaser tutorials on creating a Roguelike, however the ones I've found left out handling FOV.

 

Any help or suggestions would be greatly appreciated. Thanks!

Share this post


Link to post
Share on other sites

As a roguelike, I assume it's turn-based? If so, the FOV calculations should only be happening once each time the player moves, rather than every update I'd imagine?

 

You could also speed it up by having a maximum radius (in tiles), selecting all of the tiles in a square of size radius*2 (again in tiles) with the player at the centre, and looping over each of those tiles using Phaser.Math.distance(player.x, player.y, tile.x, tile.y) <= radius, checking to see if they're visible or not. If you're not fussed about the range being circular, you could even skip the distance check altogether and just use a square area for your field of view.

 

If you ensure all tiles outside of the square are automatically marked as non-visible (or even just tiles in a square 1 tile bigger in each direction for maximum speed) you can prevent a 'fog of war' style effect whereby seen tiles may remain visible. this routine should be pretty fast and is pretty similar to how most roguelikes usually do this kind of thing.

Share this post


Link to post
Share on other sites

Thanks, lwester32! Yes, I'm going turn-based with it and your suggestions are very similar to what I'm doing for the FOV calculation.

 

The problem I'm having is updating the display. In my "update" version, whenever there was an input from the player that required FOV recalc, I would set a bool and have the update function track it. When it was set to true, the recalc was supposed to be called, the entire floor redrawn, and the recalc bool reset to false;

 

I believe that didn't work because it appeared the update function was being called again before the FOV recalc barely began.

 

I considered trying the "render" state, but I figured that would result the same or worse.

 

Here's an example to help me explain:

 

 s75Rsmh.png

 

So here, the player starts in a fairly small room with what is probably a pillar to the NE, but there could be more wall behind it... I don't know until I move to the right and recalculate FOV and redraw the entire floor. Unfortunately, I simply don't know how to redraw the display.

 

I apologize if this is ridiculous to start a topic over, but I've reached a mental block on this.

Share this post


Link to post
Share on other sites

Yeah, I think maybe you were expecting to have to do more work than you actually do in Phaser - a lot of this stuff (such as updating the renderer) is taken care of automatically, you just have to set visible = false or whatever your 'non-visible' routine needs to do.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.