简体   繁体   English

Pygame 矩形左右移动

[英]Pygame rectangle movement left to right

I have created a enemy class with a pygame.rect and I'm trying to move it from right to left on the screen then back right and repeat that in the loop.我用 pygame.rect 创建了一个敌人 class ,我试图在屏幕上从右向左移动它,然后向右移动并在循环中重复。 So far in the enemy update I only have moving from right to left functioning, then the rect stops.到目前为止,在敌人更新中,我只能从右向左移动,然后矩形停止。 Is this because it is constantly updating which causes the code not to work?这是因为它不断更新导致代码无法工作吗? I'm not sure how to implement going both directions.我不确定如何实现双向。

# Pygame template - skeleton for a new pygame project
import pygame
import random
import os

# set up asset folders
os.environ['SDL_VIDEO_CENTERED'] = '1'
game_folder = os.path.dirname(__file__)
img_folder = os.path.join(game_folder, 'img')

# Screen resolution and frames
WIDTH = 480
HEIGHT = 600
FPS = 60

# define colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

# initialize pygame and create window
pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Shmup!")
clock = pygame.time.Clock()

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((100, 40))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH / 2
        self.rect.bottom = HEIGHT - 10
        self.speedx = 0
        self.speedy = 0

    def update(self):
        self.speedx = 0
        self.speedy = 0
        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_LEFT]:
            self.speedx = -8
        if keystate[pygame.K_RIGHT]:
            self.speedx = 8
        self.rect.x += self.speedx
        if keystate[pygame.K_UP]:
            self.speedy = -8
        if keystate[pygame.K_DOWN]:
            self.speedy = 8
        self.rect.y += self.speedy
        if self.rect.right > WIDTH:
            self.rect.right = WIDTH
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.bottom > HEIGHT:
            self.rect.bottom = HEIGHT
        if self.rect.top < 100:
            self.rect.top = 100



class Enemies(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((50, 40))
        self.image.fill(BLACK)
        self.rect = self.image.get_rect()
        self.rect.x = WIDTH - 10
        self.rect.bottom = HEIGHT / 2
        self.speedx = 0

    def update(self):
        self.speedx = 0
        if self.rect.right > 0:
            self.speedx = 2  
        self.speedx = -self.speedx
        if self.rect.left < 0:
            self.speedx *= -1
        self.speedx = self.speedx

        self.rect.x += self.speedx


all_sprites = pygame.sprite.Group()
player = Player()
enemies = Enemies()
all_sprites.add(player)
all_sprites.add(enemies)

# Game Loop
running = True
while running:
    # keep loop running at the right speed
    clock.tick(FPS)
    # Process input (events)
    for event in pygame.event.get():
        # check for closing window
        if event.type == pygame.QUIT:
            running = False


    # Update
    all_sprites.update()

    #Draw / render
    screen.fill(BLUE)
    all_sprites.draw(screen)
    # *after* drawing everything
    pygame.display.flip()

pygame.quit()
quit()

Don't over complicate things.不要把事情复杂化。 Init the constant speed in the constructor:在构造函数中初始化恒速:

class Enemies(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        # [...]
        self.speedx = 2

There are 2 cases where you've to change the speed.有两种情况你必须改变速度。
If the enemy is at the left ( self.rect.left <= 0 ), then the moving direction has to be changed to the right, this means self.speedx has to be positive.如果敌人在左边( self.rect.left <= 0 ),则移动方向必须向右更改,这意味着self.speedx必须为正。 Use abs(x) to make the speed positive (eg self.speedx = abs(self.speedx) ).使用abs(x)使速度为正(例如self.speedx = abs(self.speedx) )。
If the enemy is at the right ( self.rect.right >= WIDTH ), then direct has to be changed to the left.如果敌人在右边( self.rect.right >= WIDTH ),则必须将 direct 更改为左边。 So the speed has to be negative (eg self.speedx = -abs(self.speedx) ).所以速度必须是负数(例如self.speedx = -abs(self.speedx) )。

The following code moves the enemy always in the proper direction, even if the enemy is out of the window:以下代码始终将敌人移动到正确的方向,即使敌人在 window 之外:

class Enemies(pygame.sprite.Sprite):

    # [...]

    def update(self):
        if self.rect.left <= 0:
            self.speedx = abs(self.speedx)
        elif self.rect.right >= WIDTH:
            self.speedx = -abs(self.speedx) 
        self.rect.x += self.speedx    

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM