For a game that I am developing I need to make a rectangle move from side to side, in this specific case I would like the sprite rect1
to have this behavior. How can I do it?
Here is the code I have:
import pygame,sys
from pygame.locals import *
from random import randint
import time
ancho = 700
alto = 640
negro = (0,0,0)
blanco = (255,255,255)
class Stanly(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("sprites/Stanly.png")
self.rect = self.image.get_rect()
self.rect.centerx = 50
self.rect.centery = 580
self.vel = 1
def update(self):
keys = pygame.key.get_pressed()
if keys[K_DOWN]:
self.rect.y += self.vel
if self.rect.bottom > 640:
self.rect.bottom = 640
if keys[K_UP]:
self.rect.y -= self.vel
if self.rect.top < 0:
self.rect.top = 0
if keys[K_RIGHT]:
self.rect.x += self.vel
if self.rect.right > 700:
self.rect.right = 700
if keys[K_LEFT]:
self.rect.x -= self.vel
if self.rect.left < 0:
self.rect.left = 0
class rectU(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("sprites/ud.png")
self.rect = self.image.get_rect()
self.rect.left = 0
self.rect.top = 0
class rectD(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("sprites/ud.png")
self.rect = self.image.get_rect()
self.rect.left = 0
self.rect.top = 608
class rectL(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("sprites/lr.png")
self.rect = self.image.get_rect()
self.rect.left = 0
self.rect.top = 0
class rectR(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("sprites/lr.png")
self.rect = self.image.get_rect()
self.rect.right = 700
self.rect.top = 0
class rect1(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("sprites/rect 1.png")
self.rect = self.image.get_rect()
self.rect.left = 72
self.rect.bottom = 640
class rect2(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("sprites/rect 1.png")
self.rect = self.image.get_rect()
self.rect.left = 144
self.rect.top = 0
class rect3(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("sprites/rect 1.png")
self.rect = self.image.get_rect()
self.rect.left = 216
self.rect.bottom = 640
class rect4(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("sprites/rect 1.png")
self.rect = self.image.get_rect()
self.rect.left = 288
self.rect.top = 0
class rect5(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("sprites/rect 1.png")
self.rect = self.image.get_rect()
self.rect.left = 360
self.rect.bottom = 640
class rect6(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("sprites/rect 1.png")
self.rect = self.image.get_rect()
self.rect.left = 432
self.rect.top = 0
class rect7(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("sprites/rect 1.png")
self.rect = self.image.get_rect()
self.rect.left = 504
self.rect.bottom = 640
class rect8(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load("sprites/rect 1.png")
self.rect = self.image.get_rect()
self.rect.left = 576
self.rect.top = 0
all_sprites = pygame.sprite.Group()
rects = pygame.sprite.Group()
Mrects = pygame.sprite.Group()
players = pygame.sprite.Group()
def Game():
pygame.init()
pygame.key.set_repeat(1,25)
ventana = pygame.display.set_mode((ancho, alto))
pygame.display.set_caption("Game")
player = Stanly()
RectU = rectU()
RectD = rectD()
RectL = rectL()
RectR = rectR()
Rect1 = rect1()
Rect2 = rect2()
Rect3 = rect3()
Rect4 = rect4()
Rect5 = rect5()
Rect6 = rect6()
Rect7 = rect7()
Rect8 = rect8()
all_sprites.add(player)
all_sprites.add(RectU)
all_sprites.add(RectD)
all_sprites.add(RectL)
all_sprites.add(RectR)
# rects level 1
all_sprites.add(Rect1)
all_sprites.add(Rect2)
all_sprites.add(Rect3)
all_sprites.add(Rect4)
all_sprites.add(Rect5)
all_sprites.add(Rect6)
all_sprites.add(Rect7)
all_sprites.add(Rect8)
rects.add(RectU)
rects.add(RectD)
rects.add(RectL)
rects.add(RectR)
# rects level 1
rects.add(Rect1)
rects.add(Rect2)
rects.add(Rect3)
rects.add(Rect4)
rects.add(Rect5)
rects.add(Rect6)
rects.add(Rect7)
rects.add(Rect8)
players.add(player)
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
colls = pygame.sprite.groupcollide(players, rects, False, False)
for player, rects_ in colls.items():
player.rect.centerx = 50
player.rect.centery = 580
# Actualizamos todos los sprites del juego
all_sprites.update()
ventana.fill(negro)
# Dibujamos todos los sprites
all_sprites.draw(ventana)
pygame.display.flip()
pygame.quit()
Game()
If what you want is for the sprite to scroll from side to side of the screen (or a certain space) constantly, you simply have to specify a scrolling speed, override its method
update
so that in each iteration it modifies its coordinates on the X axis of according to the speed and reverse the sign of the speed when it reaches one of the limits so that it reverses the direction of displacement.Simplifying your code to make it easier to reproduce we can create the following example:
We get the following result:
In case someone wants to easily reproduce the code, I leave the image used for the sprite, which must be saved in a folder called sprites located in the directory of our script:
An observation regarding the speed of movement of the sprite:
In order that the speed of movement of the sprites does not depend on the frames per second (which can vary both by specifying them explicitly and by the capacity of the hardware) it is usually normalized using as unit
pixeles/segundo
. In this case the sprite moves at 150 pixels every second.To achieve the above, what we do is pass to the method
update
of each sprite the seconds that have passed since the last frame was drawn. Which we get withdt = fps_clock.tick(FPS) / 1000.0
. All sprites in the group receive the dt parameter, so all of their methodsupdate
must accept it (def update(self, dt)
). You can check how the speed is constant regardless of the fps by changing the constantFPS
.Regardless of the question, I recommend looking at the code style conventions defined in PEP-8 when you have time. Although they are just that, conventions, they help your code follow a standard and therefore its readability by third parties. For example, classes should be named in uppercase using CamelCase, functions should be lowercase and underlined to separate words, constants should be uppercase and underlined to separate words, etc.