I am having an issue where my bullets dont look like they are coming out of my gun they look like they are coming out of the players body VIDEO as you can see in the video it shoots somewhere else or its the gun its the same thing for the left side it shoots good going up but it shoots bad going down VIDEO
I tried angeling my gun to 120 but what happens is everything good works for the right side not for the left side VIDEO as you can see it just glitches
my projectile class
class projectile(object):
def __init__(self, x, y, dirx, diry, color):
self.x = x
self.y = y
self.dirx = dirx
self.diry = diry
self.slash = pygame.image.load("round.png")
self.slash = pygame.transform.scale(self.slash,(self.slash.get_width()//2,self.slash.get_height()//2))
self.rect = self.slash.get_rect()
self.rect.topleft = ( self.x, self.y )
self.speed = 18
self.color = color
self.hitbox = (self.x + -18, self.y, 46,60)
how my projectiles append
if event.type == pygame.MOUSEBUTTONDOWN:
# this is for the bullets
if len(bullets) < 3:
if box1.health > 25:
mousex, mousey = pygame.mouse.get_pos()
playerman.isJump = True
start_x, start_y = playerman.x - 30, playerman.y - 65
mouse_x, mouse_y = event.pos
dir_x, dir_y = mouse_x - start_x, mouse_y - start_y
distance = math.sqrt(dir_x**2 + dir_y**2)
if distance > 0:
new_bullet = projectile(start_x, start_y, dir_x/distance, dir_y/distance, (0,0,0))
bullets.append(new_bullet)
# this is displaying the bullets for the player
for bullet in bullets[:]:
bullet.move()
if bullet.x < 0 or bullet.x > 900 or bullet.y < 0 or bullet.y > 900:
bullets.pop(bullets.index(bullet))
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)
my full gun class
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 = (120/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)
how my images are 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)
I think what I am trying to say is how could I make my gun rotate at exactly at my mouse poisition without any problems
my full code script
If fired vertically into the air, a bullet can reach a height of up to around 2 miles. But because of the various forces acting on a projectile that is fired in this way, the shooter is extremely unlikely to be hit by one of his own bullets as it comes back down.
It can travel around 1.5 miles at a 12,000 foot altitude," Paskiewicz said. Many factors go into where a bullet travels like wind, obstacles, weight of bullet and trajectory. Experts said if it were on a flat surface with no obstacles, a . 22 caliber from a handgun could almost make it from The Vibe to Zoo Knoxville.
split(r'\s*(?:\d+|A-Za-z]+)[.)]\ s*', text)). strip() should work.
When struck by the firing pin it creates a small explosion and ignites the powder. The powder is what is used to propel the shot after being ignited by the primer by creating pressure from rapidly expanding gasses as a result of the powder burning.
It looks to me as if your bullets are originating at the players coordinates and not at the edge of the gun. You probably need to apply the same offset you used for the gun, to the projectile origin. Or just extract the top right and bottom right coordinates of the gun after rotation and set the projectiles origin to equal the average position.
As for why the gun does not seem to be pointing in the direction of the pointer, the coordinate origin is at the top left of the object and not the center. It would probably be easier to offset the position of the cursor object by half width and height. Otherwise you would need to do some additional trigonometry to adjust the offset based on the distance to the cursor.
This is a pretty good example of finding the 2 points, but note that the other 2 points are mirrored. (this could be fixed but i didn't bother)
Adapted from - How can you rotate an image around an off center pivot in Pygame
And From - Rotate point about another point in degrees python
Online IDE - https://repl.it/@ikoursh/tracking
import pygame
import math
import time
def rotate(origin, point, angle):
"""
Rotate a point counterclockwise by a given angle around a given origin.
"""
angle = math.radians(angle)
ox, oy = origin
px, py = point
qx = ox + math.cos(angle) * (px - ox) - math.sin(angle) * (py - oy)
qy = oy + math.sin(angle) * (px - ox) + math.cos(angle) * (py - oy)
return [qx, qy]
def blitRotate(surf, image, pos, originPos, angle):
# calculate 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 = (
round(pos[0] - originPos[0] + min_x - pivot_move[0]), round(pos[1] - originPos[1] - min_y + pivot_move[1]))
box_rel = [[0, 0], [w, 0], [w, -h], [0, -h]]
box_n_rotate = [rotate(originPos, p, -angle) for p in box_rel] # crete a box with negative rotation
for i in range(len(box_n_rotate)):
box_n_rotate[i][0] += pos[0] - originPos[0]
box_n_rotate[i][1] += pos[1] - originPos[1]
for c in box_n_rotate[:2]:
pygame.draw.circle(screen, (0, 255, 0), [round(c[i]) for i in range(len(c))], 5)
# get a rotated image
rotated_image = pygame.transform.rotate(image, angle)
# rotate and blit the image
surf.blit(rotated_image, origin)
pygame.init()
size = (400, 400)
screen = pygame.display.set_mode(size)
clock = pygame.time.Clock()
image = pygame.image.load('boomerang64.png')
pivot = (48, 21)
angle, frame = 0, 0
done = False
while not done:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
screen.fill(0)
pos = (200 + math.cos(frame * 0.05) * 100, 200 + math.sin(frame * 0.05) * 50)
blitRotate(screen, image, pos, pivot, angle)
pygame.draw.line(screen, (0, 255, 0), (pos[0] - 20, pos[1]), (pos[0] + 20, pos[1]), 3)
pygame.draw.line(screen, (0, 255, 0), (pos[0], pos[1] - 20), (pos[0], pos[1] + 20), 3)
pygame.display.flip()
frame += 1
angle += 1
# time.sleep(0.2)
pygame.quit()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With