pygame: player fire delay

2019-06-01 03:11发布

I want to have a delay between firing bullets for my character. I used to do this before in Java like:

    if (System.currentTimeMillis() - lastFire < 500) {
        return;
    }       

    lastFire = System.currentTimeMillis();
    bullets.add(...);

However, how can I do this in pygame way, in order to get that sys currentTimeMillis.This is how my run (game loop) method looks like:

time_passed = 0
while not done:

    # Process events (keystrokes, mouse clicks, etc)
    done = game.process_events()

    # Update object positions check for collisions...
    game.update()

    # Render the current frame
    game.render(screen)

    # Pause for the next frame
    clock.tick(30)

    # time passed since game started
    time_passed += clock.get_time()

As you can see in the previous code, I have created time passed, but I'm not sure if that is correct way of code order, and what else im missing.

标签: python pygame
2条回答
Ridiculous、
2楼-- · 2019-06-01 03:31

Your code is fine, if game.process_events and game.update works as expected.

Edit: Use pygame.time.get_ticks instead of the clock I mentioned earlier. It was using python's time module, so that clock and clock in your code meant different clocks. This is much better way.

#this should be done only once in your code *anywhere* before while loop starts
newtime=pygame.time.get_ticks()

# when you fire, inside while loop
# should be ideally inside update method
oldtime=newtime
newtime=pygame.time.get_ticks()
if newtime-oldtime<500: #in milliseconds 
    fire()

Let me explain you what pygame.time.get_ticks() returns:

  1. On first call, it returns time since pygame.init()
  2. On all later calls, it returns time (in milliseconds) from the first call to get_ticks.

So, we store the oldtime and substract it from newtime to get time diff.

查看更多
时光不老,我们不散
3楼-- · 2019-06-01 03:34

Or, even simpler, you can use pygame.time.set_timer

Before your loop:

    firing_event = pygame.USEREVENT + 1
    pygame.time.set_timer(firing_event, 500)

Then, an event of type firing_event will be posted onto the queue every 500 milliseconds. You can use this event to signal when to fire.

查看更多
登录 后发表回答