0

I am trying to make a game in pygame. I want to make a turret that will fire at the player. I have the formula to make this happen, but for some reason, it isn't completely accurate. I am running into the same problem with the player shooting as well. I am trying to use the mouse to aim, and it is off by a little bit.

Here is an image to help with understanding. The cross is the turret and the ghost is the player. The rest is the bullets that should be hitting the player but it is hitting the rect top left it seems.

It is a bit of a mess but here is the code I am trying to test this with.

import pygame, math, random
            
pygame.init()
height,width = 1050,1000
clock = pygame.time.Clock()
screen = pygame.display.set_mode((height, width,))


pygame.display.set_caption("Vampires Suck")
pygame.display.flip()
running = True 

class Crucifix2(pygame.sprite.Sprite):
        def __init__(self):
                super().__init__()
                self.sprite = pygame.image.load("image")
                
                self.image = self.sprite
                
                
                self.rect = self.image.get_rect()
                self.rect.x =(450)
                self.rect.y = (150)
                self.mask = pygame.mask.from_surface(self.image)
                
                
        def update(self):
            
            
            pass
                
            
          

class MagicBullet2(pygame.sprite.Sprite):
    def __init__(self, speed,x,y, targetx, targety):
        super().__init__()
        self.sprite = pygame.image.load("Image")
        self.image = self.sprite
        self.mask = pygame.mask.from_surface(self.image)
        self.rect = self.image.get_rect()
        angle = math.atan2(targety - y, targetx - x)
        self.dx = math.cos(angle) * speed
        self.dy = math.sin(angle) * speed
        self.x = x 
        self.y = y

    def update(self):
        self.x = self.x + self.dx
        self.y = self.y + self.dy

        self.rect.x = int(self.x)
        self.rect.y = int(self.y)
        
        if self.rect.x < -50 or self.rect.x > width + 50 or self.rect.y < -50 or self.rect.y > height + 50:
            self.kill()         
        
    def collide(self, spriteGroup):
            if pygame.sprite.spritecollide(self, spriteGroup, True, pygame.sprite.collide_mask):
                pass

class OurHero(pygame.sprite.Sprite):
        def __init__(self):
                super().__init__()
                
                self.sprite = pygame.image.load('image')
                
                self.size = (400,400)
                self.current_sprite = 0
                self.image =pygame.transform.scale(self.sprite, self.size)
                self.rect = self.image.get_rect(topleft = (580, 630))
                self.rect.x = (430)
                self.rect.y = (380)
                self.mask = pygame.mask.from_surface(self.image)
                
                
                
        def update(self):
            
            keys = pygame.key.get_pressed()
            if keys[pygame.K_LEFT]:
                self.rect.x -= 3
                
            if keys[pygame.K_RIGHT]:
                self.rect.x += 3
        
            if keys[pygame.K_UP]:
                self.rect.y -= 3
     
            if keys[pygame.K_DOWN]:
                self.rect.y += 3
            
            
            if self.rect.x > 793:
                self.rect.x -= 3
            if self.rect.x < 75:
                self.rect.x += 3
            if self.rect.y < 87:
                self.rect.y += 3
            if self.rect.y > 789:
                self.rect.y -=3

            self.current_sprite += 0.027
            
        
        

class aim(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.sprite = pygame.image.load("image")
        self.image = self.sprite
        self.rect = self.image.get_rect(center = (300,300))
        self.rect.inflate(-500,-500)
        
    def update(self):
        self.rect.center = pygame.mouse.get_pos()


class MagicBullet(pygame.sprite.Sprite):
    def __init__(self, speed,x,y, targetx, targety):
        super().__init__()
        self.sprite = pygame.image.load("image")
        self.image = self.sprite
        self.mask = pygame.mask.from_surface(self.image)
        self.rect = self.image.get_rect()
        angle = math.atan2(targety - y, targetx - x)
        self.dx = math.cos(angle) * speed
        self.dy = math.sin(angle) * speed
        self.x = x 
        self.y = y

    def update(self):
        self.x = self.x + self.dx
        self.y = self.y + self.dy

        self.rect.x = int(self.x)
        self.rect.y = int(self.y)
        
        if self.rect.x < -50 or self.rect.x > width + 50 or self.rect.y < -50 or self.rect.y > height + 50:
            self.kill()


mouse_x, mouse_y = pygame.mouse.get_pos()
pygame.mouse.set_visible(False)
mouse = aim()
player = OurHero()
dude_sprite = pygame.sprite.Group()
dude_sprite.add(player)
dude_sprite.add(mouse)
bad = pygame.sprite.Group()
bad3 = pygame.sprite.Group()
bad2 = Crucifix2()
bad.add(bad2)
player_bullets = MagicBullet2(8, bad2.rect.x , bad2.rect.y+90 , player.rect.x, player.rect.y)
bullet_group = pygame.sprite.Group()
bad3.add(player_bullets)
distance_x = player.rect.x - bad2.rect.x
distance_y = player.rect.y - bad2.rect.y
angle = math.atan2(distance_y, distance_x)
dude2 = MagicBullet(5, player.rect.x, player.rect.y, mouse_x, mouse_y)
while running:

    mouse_x, mouse_y = pygame.mouse.get_pos()
    pygame.display.update()
    player_bullets = MagicBullet2(8, bad2.rect.x , bad2.rect.y+90 , player.rect.x + 30, player.rect.y + 30)
    bad3.add(player_bullets)
    
    screen.fill('white')
    bad3.update()
    bad3.draw(screen)

    dude_sprite.update()
    dude_sprite.draw(screen)
    bullet_group.draw(screen)
    bad.update()
    bad.draw(screen)
    bullet_group.update()
    for event in pygame.event.get():
        if event.type == pygame.MOUSEBUTTONDOWN:
            #bullet_group.add(player.creat_bullet())
            dude2 = MagicBullet(8, player.rect.x , player.rect.y , mouse_x, mouse_y)
            bullet_group.add(dude2)
        if event.type == pygame.QUIT:
            running = False
    clock.tick(120)

I have been searching everywhere for an answer. I am not exactly sure what I am looking for. I am very new to game dev and I am still pretty new with python and pygame. I tried transform.scale() but that seemed to push the character off the screen when I put it into update().

0 Answers0