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

Re: [pygame] Pygame Problem Solving 1



Lamonte Harris wrote:
Problem Solving 1
--------
Rendering a map switching script. There will be a simple window. At the bottom if tge screen it will say pick a map. Using the mouse events and positioning I will be able to click on the squares that will represent certain maps at the bottom of the screen and the different maps will be displayed.

How to do that?
---
First make my "genmap" class then in the __init__ function add 2 variables "self.cmap" and "self.blockrect". "self.cmap" would represent the current map to be displayed. If there isn't a variable assigned then the area above the boxes will not be displayed. Make a function to display the tile maps. With that function I would append square rects to te " self.blockrect" variable for later use to detect if the current mouse position will match any of the rects when I left mouse click on the pygame window. In that list, there could be tuples inside the list for instance:

self.blockrect = [((0,0,0,0),1)]

The first value in the tuple would be the map rect second value in the tuple would represent the map name in the directory to load.

How would I get the current top surface of where my mouse is located?
Just giving a guess, I was thinking of making a square surface thats the same size of the sqaures at the bottom of the screen but the sqaures at the bottom of the screen have different possitioning meaning its easier to located different maps. Like example:

Pygame Window:
----------------------------------------
|                          ___       |
|          |--\_/--|  /-\ |___|      |
|          |_/\/\_| /---\|            |
|                                      |
|                                      |
|                                      |
 --------------------------------------
|   ------     ------    ------         |
|   |    |     |     |   |      |         |
|   ------     ------    ------         |
 --------------------------------------
Thats above is the whole window its all one big part but sort of seperated if you get what I mean. Probably by a pygame line. So I was thinking if I made an invisible rect that moved when the mouse moved then I left clicked and it would get the current surface position of the rect, then it would run a function to see if that current position matches any of the map squares at the bottom of the screen then the " self.cmap" variable would update. Does anyone think my theory will work, I've only written then down at school and is attempting to do this this weekend for some more learning with pygame.
It's a little hard to follow.
For example, what is this talk about an invisible rect that follows the mouse? All you care about are mouse clicks. So when the mouse clicks (when you're parsing events and you come across a MOUSEBUTTONDOWN or whatever the event is called) you just call pygame.mouse.get_pos() and you have the current position. You don't have to constantly track the position.
and I'm not sure what your self.blockrect and self.cmap stuff was about.
I would say to do it like this off the top of my head:
import pygame, os
class Tileset(object):
 def __init__(self, tiletuplelist):
   """tiletuplelist is of the form [(tilename, tilelocation)]
   self.tiles = {}
   for tilepair in tiletuplelist:
     self.tiles[tilepair[0]] = pygame.image.load(tilepair[1])

class Map(object):
 def __init__(self, mapdata, tileset):
"""mapdata is a 2d array of strings that are the tilenames for each location."""
   self.map = mapdata
   self.tileset = tileset
 def drawmap(self, location, maxh, maxw, screen):
   """location is a tuple"""
   #using position and maxwidth and maxheight, and the
   #data about the tile sizes from the tileset, you can make sure
   #you don't draw out of bounds.

So basically you'd construct one tileset like this
tiles = Tileset(['grass','grass.bmp','dirt','dirt.bmp'])
Then you'd make a map like this:
map1 = Map([["grass","dirt"],["dirt","grass"]], tiles)

then whenever you wanted to draw map1 you'd just call map1.draw
and it would draw itself using your tileset.
So if you wanted to change your tileset later you could, easily.
Also, because the tileset is referenced by variable names instead of indices, it'll be easy to list all possible tiles for selection. and since each map is a different object, you just have to clear the screen and call map2.draw() when you want to switch maps. It makes everything simple. I'm not claiming the code works or that's the best way to do it, but that's just what I came up with on first glance.

Also as you were mentioning earlier, you wanted to use rects of existing tiles to collide with the mouse to see if they had selected a tile, but you want them to be able to select any tile, even blank ones, right? Blah, there are too many considerations that are going to be particular to your implementation. You can look at Phil Hassey's PGU for ideas on tile editors. His is pretty slick.
-Luke