Hot answers tagged

45

Mode 7 is a very simple effect. It projects a 2D x/y texture (or tiles) to some floor/ceiling. Old SNES use hardware to do this, but modern computers are so powerful that you can do this realtime (and no need of ASM as you mention). Basic 3D math formula to project a 3D point (x, y, z) to a 2D point (x, y) is : x' = x / z; y' = y / z; When you think ...


42

tl;dr don't mix your event loop with your game loop. When you move your mouse, the game receives a load of pygame.MOUSEMOTION events. You don't actually use these events to update your mouse position though, you are getting the current state of the mouse using pygame.mouse.get_pos(). That's inefficient, but it's not the problem. The problem is you are ...


11

Conceptually you've got it, just think of the rectangle as a helper for you to deal with position and collision detection of your image. To implement it you could use: mySprite.image = pygame.transform.rotate(Surface, angle) This will give you a rotated Surface (image), then you can use: mySprite.rect = mySprite.image.get_rect() To give you your new ...


9

Your problem is the fact that you're only looking at KEYDOWN events. What you need to do is toggle a boolean value when a key is pressed or released. Something like this would work: # event loop for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.KEYDOWN: # check for key ...


9

If I understand right, your map stores whether something is dirt or air, and the simplest thing would be to have dirt and air tiles. However, to make things look better, you have separate images for air above dirt, dirt above air, dirt left of air, and so on. So you're trying to figure out which image to use, given a tile and its neighbors. Is that right? ...


8

Back in January, 2011, I looked at five GUI toolkits for pygame, and tried to get all of them working with Python 3. The five were: Albow, GooeyPy, PGU, pqGUI, and sgc. I didn't succeed with GooeyPy, but I did get the other four to work with Python 3. (I wanted to also try poutine, by Shandy Brown, but I couldn't find it, and I entirely overlooked Ocemp.) ...


8

convert() is used to convert the pygame.Surface to the same pixel format as the one you use for final display, the same one created from pygame.display.set_mode(). If you don't call it, then every time you blit a surface to your display surface, a pixel conversion will be needed - this is a per pixel operation, very slow - instead of a series of memory ...


7

If you read the pygame.time.Clock.tick() and pygame.time.Clock.get_fps() documents, you'll find that: tick() works with milliseconds - it returns the number of milliseconds since the last call get_fps() returns an average of the last 10 calls to tick(). If you do the math, that's pretty damn good that you're getting 59.8 most of the time, since with 60 FPS ...


6

Just separate the events from the drawing. The normal method is to redraw all the time, not to wait for something to change. Normally your loop should be like this: while loop: check events: # find routes, block path, whatever update things: # change the state of the game draw() You shouldn't be thinking in terms of drawing one ...


6

It's only randomized the first time because you're only calling the random function one time (when you create the monster object). When you have ma=random.randmint(5, 20) in your class then you are creating that variable with a random amount at that time, but you are not altering it. In order to get a random value every time you need to reset the value every ...


6

In a game, music would be the a way to play background music and sound the way to play sound effects (ej. jumping, firing, etc). Music is a special streaming channel of the Mixer. This means the file is streamed from disk in small chuncks and not loaded at once. Pygame only supports one Music at a time but you can have several Sound objects playing at once,...


6

You can use the size method size() size(text) -> (width, height) Returns the dimensions needed to render the text. This can be used to help determine the positioning needed for text before it isrendered. It can also be used for wordwrapping and other layout effects. Here is an example myFont = pygame.font.Font(None, fontSize) width = myFont....


6

You could look at Skulpt.org which provides a completely brower-based implementation of PyGame. However I do not know what external APIs PyGame uses and which are supported by Skulpt. Edit: it seems Skulpt also has WebGL bindings so this should be very possible!


6

Use a file format that supports alpha (png), an editor that can save it with a transparent background (gimp2, photoshop, basically not paint) and make sure you load the sprite correctly


5

Here's how I'd approach it: There is always a single open area, represented by a polygon. All other areas are irrelevant. A line starts when you move from the perimeter of the polygon into the polygon's interior. A line stops when you move from the polygon's interior back onto the perimeter. When you stop the line, you have divided the polygon into two ...


5

It would be faster to store all the tiles in a array and then simply check the tile at the players position. That would eliminate the loop (pseudo code): TileDataClass[500,500] arr = mapdata arr[playerposx,playerposy].color = red


5

First we need to clarify what "smooth movement" is. Let's first talk about smooth movement in a pixelated space. Not taking into account motion blur and sub-pixel movement, the smoothest amount of movement you can have on a pixel screen is one pixel. So your code pygame.draw.circle(SCREEN, (255, 255, 255), (newx, SCREENRECT.centery), 30) pygame.display....


5

I suggest you implement some flocking behavior principles on the movement method. If you don't know about flocking algorithms, here are some useful links and tutorials: http://harry.me/blog/2011/02/17/neat-algorithms-flocking/ http://www.lalena.com/AI/Flock/ The trick would be the following: 1- The movement and its direction each frame will be controlled ...


5

Don't know python, but here is a basic arbitrary-language example. You should only have one game loop that updates all other entities. You can determine how much time has passed between each running of the loop and pass that information on to the entities who can use this information. For Example: main() { lastSystemTime = currentSystemTime; while (...


5

PyGame itself, being a wrapper around SDL, is unable to directly use hardware acceleration. You can, however, use PyGame to create an OpenGL context and then render into that via an OpenGL library like pyglet or PyOpenGL, which will let you then also use GLSL vertex and fragment shaders. This blog post does a good job of explaining the basics of using ...


5

First you need to calculate the vector pointing from your player to the current mouse position. This can be done by subtracting the player's position with the mouse's position: mouse_x, mouse_y = pygame.mouse.get_pos() rel_x, rel_y = mouse_x - self.x, mouse_y - self.y Then calculate the angle: angle = math.atan2(rel_y, rel_x) This will calculate the ...


4

A couple of things that I do when debugging games: Use a console to output relevant information. Output debug data directly on top of your game screen. Since you are dealing with a game loop, breakpoints are sometimes quite difficult to use when debugging such things as character movement. Displaying the data you want to verify on screen while you are ...


4

Like Tetrad said, it's a really good idea to constrain all of your conversions to a single place on your code. This will ensure consistency across the game. I'm not familiar with Python, but in C# I'd create a small helper class to help me with this. For instance: public static class UnitsConverter { public static float M2P(float meters) { return ...


4

One of Python's huge weaknesses is the existence of a global interpreter lock. Essentially all python code is executed while holding this lock. The consequence is that multi-threaded python applications are effectively incapable of parallelism. Threads allow the convenience of a multi-threaded programming model, but multi-threaded python applications will ...


4

What you're looking for are surfarrays. A simple tutorial on how to get started with them can be found here. Essentially what a surfarray does is directly modify the pixel values of pygame surfaces, and can operate on each of the R, G, and B channels for every pixel "simultaneously," which I put in quotes because I just mean you can change all the pixels ...


4

Traceback (most recent call last): File "C:\Users\Kylotan\Desktop\test_pg.py", line 31, in <module> if event.type==pg.event.QUIT: AttributeError: 'module' object has no attribute 'QUIT' I added from pygame.locals import * to the top and changed it to just 'QUIT', and it works for me. It's not the clicking that makes the window unresponsive, it'...


4

Presumably you're using a center position and a radius to draw the circle. Just create a rect like this: crect = pygame.Rect(center[0]-radius, center[1]-radius, \ radius*2, radius*2) Then draw the circle like this: pygame.draw.circle(screen, yellow, crect.center, radius)


4

There is no 'proper' way, just different approaches that vary from simple-but-slow to complex-but-fast. You can stick with that method, if your car list is small enough. However, there is a bug in your basic algorithm, as it will compare each pair of cars twice. To fix that, your second loop should start the value of car2 from the position in the list after ...


Only top voted, non community-wiki answers of a minimum length are eligible