[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] Sprite Collision



Actually the correct syntax to address an element would be:

passible_at[x][y]

Not thinking in Python this morning ;^)

-Casey

On Apr 30, 2007, at 9:39 AM, Casey Duncan wrote:

If you keep track of which tiles are passible in an list, you only need to consider the tiles surrounding a given monster, which should not be a problem performance-wise. In fact, you only need to consider the tiles that the monster wants to move into, and if the first one is passible then that's all you need to test.

Let's say you have a map that is 100 x 100 tiles. You can initialize a list for it like so:

passible_at = [[True] * 100] * 100 # Create a 2 dimensional list with an element for each tile

(then populate it however you create your map, setting the elements that are not passable to some True value). So if there's a big boulder at x=25, y=30 you would do:

passible_at[25, 30] = False

let's say you want to see if you can pass through a given x, y coordinate on the map, just do this:

if passible_at[x, y]:
    # can go there, tally ho!
else:
    # can't go there, maybe consider another direction

You could even get fancy and have varying degrees of passibility, like mountains or swamp or debris that can be passed through, but takes longer to do so. This would be done by assigning a passibility "score" to each map location that tells how many turns it takes to get through. The value None could mean "impassible".

Another question is are we talking about navigating around small obstacles (relative to the map) or through a more complex system of rooms with long walls or other large obstructions with only small pathways through? If it's the latter you'll probably want to use a path finding algorithm so the monster can figure out how to navigate through the rooms from point a to point b (an example implementation of this was posted a week or so ago). If you do have "rooms", but the monsters don't ever leave the room they start in on their own, this might not be necessary, however.

-Casey

On Apr 30, 2007, at 6:56 AM, Samuel Mankins wrote:

Now that my AI is chasing the Ninja around, I'd like to make it so that when they bump into a block, they "slide" around it. I figured I'd do this by having it find out where the block is in relation to the monster, and then stop moving in the direction that was causing it to bump into the block. But I don't want to say "for block in block_group" because that eats up too much CPU, so my question is, how can I figure out where the block is without using that? Is there an easier way to solve the problem?
I tried just using ifs to do it (It looked something like: If self.x_dir == 1 and self.y_dir == 1, self.x_dir = 1 and self.y_dir = 0) but then the monsters just floated over the blocks.
Thanks!