0

VIDEO I been having this problem quite a while I am trying to make my rect follow my guns tip so I could make my bullets look like they are coming out of my guns tip but I am not really sure how I could do that I can only make my gun rotate and not make my bullets look like they are coming out of my guns tip VIDEO as you can see I have blitted the gun image and a small rect how would I make that rect rotate with my guns tip? what ever position the gun is at

here is the code you could run it with this imageenter image description here

code


import pygame,random,math

pygame.init()

window = pygame.display.set_mode((500,500))
pygame.display.set_caption("um..")



# how the gun is blitted



def blitRotate(surf, image, pos, originPos, angle):
 
    # calcaulate the axis aligned bounding box of the rotated image
    w, h = image.get_size()
    sin_a, cos_a = math.sin(math.radians(angle)), math.cos(math.radians(angle)) 
    min_x, min_y = min([0, sin_a*h, cos_a*w, sin_a*h + cos_a*w]), max([0, sin_a*w, -cos_a*h, sin_a*w - cos_a*h])
 
        # calculate the translation of the pivot 
    pivot        = pygame.math.Vector2(originPos[0], -originPos[1])
    pivot_rotate = pivot.rotate(angle)
    pivot_move   = pivot_rotate - pivot
 
        # calculate the upper left origin of the rotated image
    origin = (pos[0] - originPos[0] + min_x - pivot_move[0], pos[1] - originPos[1] - min_y + pivot_move[1])
 
        # get a rotated image
    rotated_image = pygame.transform.rotate(image, angle)

 
        # rotate and blit the image
    surf.blit(rotated_image, origin)

    

# the gun
class handgun():
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
 
        # LOL THESE IS THE HAND
        self.shootsright = pygame.image.load("hands.png")
        self.image = self.shootsright
        self.rect  = self.image.get_rect(center = (self.x, self.y))
        self.look_at_pos = (self.x, self.y)
 
        self.isLookingAtPlayer = False
        self.look_at_pos = (x,y)
        self.hitbox = (self.x + -18, self.y, 46,60)

        self.gunDirection = "right"

    def draw(self,drawX,drawY):
        self.rect.topleft =  (drawX,drawY)
 
        # the guns hitbox
        # rotatiing the gun
        dx = self.look_at_pos[0] - self.rect.centerx
        dy = self.look_at_pos[1] - self.rect.centery 
            
        angle = (190/math.pi) * math.atan2(-dy, dx)
        gun_size = self.image.get_size()
        pivot = (8, gun_size[1]//2)
 
        blitRotate(window, self.image, self.rect.center, pivot, angle)

        if((angle > 90 or angle < -90) and self.gunDirection != "left"):
            self.gunDirection = "left"
            self.image = pygame.transform.flip(self.image, False, True)
        if((angle < 90 and angle > -90) and self.gunDirection != "right"):
            self.gunDirection = "right"
            self.image = pygame.transform.flip(self.image, False, True)

    def lookAt( self, coordinate ):
        self.look_at_pos = coordinate
 
 

 
white = (255,255,255)
handgun1 = handgun(300,300,10,10,white)




# the square that will be rotating with the gun



class portal:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
        self.direction = "blobright"

        self.angle = 0

    def draw(self,dx,dy):
        self.rect.topleft = (dx,dy)
        pygame.draw.rect(window,self.color,self.rect)

        



white = (0,0,0)

port1 = portal(200,200,10,10,white)





# the main loop
runninggame = True
while runninggame:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            runninggame = False


    # fill the window black
    window.fill((255,255,255))

    # draw the rect that will be rotating with the gun tips

    port1.draw(handgun1.x,handgun1.y)

    # draw the gun
    handgun1.draw(port1.x,port1.y)

    handgun1.direction = "right"

    # gun rotation
    mousex, mousey = pygame.mouse.get_pos()
    if not handgun1.isLookingAtPlayer:
        handgun1.lookAt((mousex, mousey))



    pygame.display.update()
pygmae.quit()













        



Habib Ismail
  • 69
  • 5
  • 16

1 Answers1

3

I'm not clear on your requirement, but I updated the code so the rectangle will always be in the firing line of the gun and always 100 pixels away.

To update the code:

-- In the handgun class change all angle references to self.angle so the angle can be accessed outside the class.

-- In the portal class (draw method), use the gun angle to position the rectangle:

def draw(self,dx,dy):
    # keep same distance from gun, use gun angle
    self.dist = 100
    dx = handgun1.x + self.dist*math.cos(-handgun1.angle*(math.pi/180)) -65 # why offset needed ?
    dy = handgun1.y + self.dist*math.sin(-handgun1.angle*(math.pi/180)) -50 # why offset needed ?
    self.rect.topleft = (dx,dy)
    pygame.draw.rect(window,self.color,self.rect)

For the circle to align with the gun origin, I had to offset the rectangle origin (-65, -50). I don't know why this is required.

enter image description here

Mike67
  • 11,175
  • 2
  • 7
  • 15