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 image
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()