Search code examples
pythonpython-2.7pygameequations

Pygame bullet motion from point A to point B


I am trying to make a game with a python library called 'Pygame' (v1.9.2) and I have made a character for the player. This character is supposed to "shoot" "bullets" or "spells" to the point of mouse_pos and what I need help with is that the "bullet" has a constant speed assigned to 1 self.speed = 1, if I try to increase the speed it will cause a flickering effect when the bullet reaches mouse_pos because self.pos will either be higher or lower than mouse_pos.

How can I make this bullet go quickly & smooth like a bullet and still get to the exact point where mouse_pos is set?

Example with self.speed = 1
https://media.giphy.com/media/AAifrctxHHQbe/giphy.gif

Example with self.speed = 2
http://4.1m.yt/d_TmNNq.gif

related code is inside update() function
Sprites.py (Spell/Bullet class)

class Spell(pygame.sprite.Sprite):
    def __init__(self,game,x,y,spelltype,mouse_pos):
        pygame.sprite.Sprite.__init__(self)
        self.game = game
        self.width = TILESIZE
        self.height = TILESIZE
        self.type = spelltype
        self.effects = [
                'effect_'+self.type+'_00',
                'effect_'+self.type+'_01',
                'effect_'+self.type+'_02'
        ]
        self.image = pygame.image.load(path.join(IMG_DIR,"attack/attack_"+self.type+".png")).convert_alpha()
        self.image = pygame.transform.scale(self.image,(self.width,self.height))
        self.rect = self.image.get_rect()
        self.rect.x = x+self.width
        self.rect.y = y+self.height
        self.speed = 1
        self.mouse_pos = mouse_pos
        self.idx = 0

    def update(self):
        if not self.rect.collidepoint(self.mouse_pos):
            if self.mouse_pos[0] < self.rect.x:
                self.rect.x -= self.speed
            elif self.mouse_pos[0] > self.rect.x:
                self.rect.x += self.speed

            if self.mouse_pos[1] < self.rect.y:
                self.rect.y -= self.speed
            elif self.mouse_pos[1] > self.rect.y:
                self.rect.y += self.speed
        else:
            self.image = pygame.image.load(path.join(IMG_DIR,"effects/"+self.effects[self.idx]+".png"))
            self.idx += 1
            if self.idx >= len(self.effects):
                self.kill()

Solution

  • If your bullet goes so fast that it passes through the target, you might want to test if the line between the bullets current point an its last point intersect with your target.

    A bit more detail is available here: https://gamedev.stackexchange.com/questions/18604/how-do-i-handle-collision-detection-so-fast-objects-are-not-allowed-to-pass-thro