I’m trying to make a game where a laser is being fired and you have to dodge it, but when i resize the laser to make it taller, the image moves downwards. I think this is because the sprite isn’t properly centered. How do i center it? Sorry if I’m asking a stupid question.
I tried moving the sprite upwards to give the illusion that it isn’t moving, but that didn’t work.
Here’s my code:
<code>import pygame
import math
class Laser(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.images = []
for num in range(1, 4):
self.img = pygame.image.load(f"visuals/obstacles/laser/laser_{num}.png").convert_alpha()
self.images.append(self.img)
self.image = self.images[0]
self.rect = self.image.get_rect()
self.rect.center = (x, y)
self.frame = 0
self.is_visible = False
self.time = 0
self.is_firing = False
self.is_charging = False
self.charge_width = 0
self.offset_y = 0
def update(self):
self.frame += 0.3
self.image = self.images[math.floor(self.frame % 3)]
self.image = pygame.transform.scale(self.image, (900, self.charge_width * 10))
# Behaviour
key = pygame.key.get_pressed()
if key[pygame.K_SPACE]:
self.is_charging = True
if self.is_firing:
self.is_visible = True
self.time += 1
if self.time >= 30:
self.is_visible = False
self.time = 0
self.is_firing = False
self.charge_width = 0
if self.is_charging:
self.charge_width += (10 - self.charge_width) / 4
if self.is_visible:
self.charge_width = 30
if self.is_charging:
self.time += 1
if self.time >= 30:
self.time = 0
self.is_charging = False
self.is_firing = True
import pygame
import math
class Laser(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.images = []
for num in range(1, 4):
self.img = pygame.image.load(f"visuals/obstacles/laser/laser_{num}.png").convert_alpha()
self.images.append(self.img)
self.image = self.images[0]
self.rect = self.image.get_rect()
self.rect.center = (x, y)
self.frame = 0
self.is_visible = False
self.time = 0
self.is_firing = False
self.is_charging = False
self.charge_width = 0
self.offset_y = 0
def update(self):
self.frame += 0.3
self.image = self.images[math.floor(self.frame % 3)]
self.image = pygame.transform.scale(self.image, (900, self.charge_width * 10))
# Behaviour
key = pygame.key.get_pressed()
if key[pygame.K_SPACE]:
self.is_charging = True
if self.is_firing:
self.is_visible = True
self.time += 1
if self.time >= 30:
self.is_visible = False
self.time = 0
self.is_firing = False
self.charge_width = 0
if self.is_charging:
self.charge_width += (10 - self.charge_width) / 4
if self.is_visible:
self.charge_width = 30
if self.is_charging:
self.time += 1
if self.time >= 30:
self.time = 0
self.is_charging = False
self.is_firing = True
</code>
<code>import pygame
import math
class Laser(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.images = []
for num in range(1, 4):
self.img = pygame.image.load(f"visuals/obstacles/laser/laser_{num}.png").convert_alpha()
self.images.append(self.img)
self.image = self.images[0]
self.rect = self.image.get_rect()
self.rect.center = (x, y)
self.frame = 0
self.is_visible = False
self.time = 0
self.is_firing = False
self.is_charging = False
self.charge_width = 0
self.offset_y = 0
def update(self):
self.frame += 0.3
self.image = self.images[math.floor(self.frame % 3)]
self.image = pygame.transform.scale(self.image, (900, self.charge_width * 10))
# Behaviour
key = pygame.key.get_pressed()
if key[pygame.K_SPACE]:
self.is_charging = True
if self.is_firing:
self.is_visible = True
self.time += 1
if self.time >= 30:
self.is_visible = False
self.time = 0
self.is_firing = False
self.charge_width = 0
if self.is_charging:
self.charge_width += (10 - self.charge_width) / 4
if self.is_visible:
self.charge_width = 30
if self.is_charging:
self.time += 1
if self.time >= 30:
self.time = 0
self.is_charging = False
self.is_firing = True
import pygame
import math
class Laser(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.images = []
for num in range(1, 4):
self.img = pygame.image.load(f"visuals/obstacles/laser/laser_{num}.png").convert_alpha()
self.images.append(self.img)
self.image = self.images[0]
self.rect = self.image.get_rect()
self.rect.center = (x, y)
self.frame = 0
self.is_visible = False
self.time = 0
self.is_firing = False
self.is_charging = False
self.charge_width = 0
self.offset_y = 0
def update(self):
self.frame += 0.3
self.image = self.images[math.floor(self.frame % 3)]
self.image = pygame.transform.scale(self.image, (900, self.charge_width * 10))
# Behaviour
key = pygame.key.get_pressed()
if key[pygame.K_SPACE]:
self.is_charging = True
if self.is_firing:
self.is_visible = True
self.time += 1
if self.time >= 30:
self.is_visible = False
self.time = 0
self.is_firing = False
self.charge_width = 0
if self.is_charging:
self.charge_width += (10 - self.charge_width) / 4
if self.is_visible:
self.charge_width = 30
if self.is_charging:
self.time += 1
if self.time >= 30:
self.time = 0
self.is_charging = False
self.is_firing = True
</code>
import pygame
import math
class Laser(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.images = []
for num in range(1, 4):
self.img = pygame.image.load(f"visuals/obstacles/laser/laser_{num}.png").convert_alpha()
self.images.append(self.img)
self.image = self.images[0]
self.rect = self.image.get_rect()
self.rect.center = (x, y)
self.frame = 0
self.is_visible = False
self.time = 0
self.is_firing = False
self.is_charging = False
self.charge_width = 0
self.offset_y = 0
def update(self):
self.frame += 0.3
self.image = self.images[math.floor(self.frame % 3)]
self.image = pygame.transform.scale(self.image, (900, self.charge_width * 10))
# Behaviour
key = pygame.key.get_pressed()
if key[pygame.K_SPACE]:
self.is_charging = True
if self.is_firing:
self.is_visible = True
self.time += 1
if self.time >= 30:
self.is_visible = False
self.time = 0
self.is_firing = False
self.charge_width = 0
if self.is_charging:
self.charge_width += (10 - self.charge_width) / 4
if self.is_visible:
self.charge_width = 30
if self.is_charging:
self.time += 1
if self.time >= 30:
self.time = 0
self.is_charging = False
self.is_firing = True
import pygame
import math
class Laser(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.images = []
for num in range(1, 4):
self.img = pygame.image.load(f"visuals/obstacles/laser/laser_{num}.png").convert_alpha()
self.images.append(self.img)
self.image = self.images[0]
self.rect = self.image.get_rect()
self.rect.center = (x, y)
self.frame = 0
self.is_visible = False
self.time = 0
self.is_firing = False
self.is_charging = False
self.charge_width = 0
self.offset_y = 0
def update(self):
self.frame += 0.3
self.image = self.images[math.floor(self.frame % 3)]
self.image = pygame.transform.scale(self.image, (900, self.charge_width * 10))
# Behaviour
key = pygame.key.get_pressed()
if key[pygame.K_SPACE]:
self.is_charging = True
if self.is_firing:
self.is_visible = True
self.time += 1
if self.time >= 30:
self.is_visible = False
self.time = 0
self.is_firing = False
self.charge_width = 0
if self.is_charging:
self.charge_width += (10 - self.charge_width) / 4
if self.is_visible:
self.charge_width = 30
if self.is_charging:
self.time += 1
if self.time >= 30:
self.time = 0
self.is_charging = False
self.is_firing = True
New contributor
pixelfrog is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.