如何让我的玩家在关卡中循环而不是撞到墙上?

How to make my player loop around the level instead of hit the wall?

我怎样才能让玩家绕到另一边(类似于吃豆人如何从地图的一侧移动到另一侧)?另外,我想为我射击子弹时添加一些音效,但我发现很难找到关于 3.6 的 Pygame 的任何深入内容。 (这可能需要重新格式化,我手动将代码隔开,这样就可以 post)

import pygame, time, os, random
from pygame.locals import
pygame.init()
bcolor = pygame.Color("red")
 surfacex = 400  # Surface X size
 surfacey = 400  # Surface Y size
 surface = pygame.display.set_mode([surfacex, surfacey])
 surface.fill(bcolor)

  move_direction = 0
  enemy_direction = 0


  class obj_player(object):
   def __init__(self):
    self.rect = pygame.Rect(200, 350, 16, 16)

def move(self, dir):
    if dir == 0 and self.rect.x <= surfacex - 16:
        self.rect.x += 5
    if dir == 1 and self.rect.x >= 0:
        self.rect.x -= 5


 class shoot_bullet(object):
def __init__(self):
    list_bullets.append(self)
    self.rect = pygame.Rect(player.rect.x + 8, 350, 4, 8)

def update(self):
    self.rect.y -= 5

    for enemy in list_enemies:
        if self.rect.colliderect(enemy.rect):
            list_bullets.remove(self)
            list_enemies.remove(enemy)


  class obj_enemy(object):
    def __init__(self, pos):
    list_enemies.append(self)
       self.rect = pygame.Rect(pos[0], pos[1], 16, 16)

def update(self, dir):
    if dir == 0:
        self.rect.x += 2
    if dir == 1:
        self.rect.x -= 2


   player = obj_player()
   clock = pygame.time.Clock()

   can_shoot = True

   list_bullets = []
   list_enemies = []

  pygame.time.set_timer(USEREVENT + 1, 2000)

  for yy in range(5):
   for xx in range(5):
    obj_enemy((0 + 35 * xx, 50 + 35 * yy))

 while True:
clock.tick(60)
surface.fill([0, 0, 0])

if pygame.event.peek(pygame.QUIT):
    pygame.display.quit()
    quit()

key = pygame.key.get_pressed()
if key[pygame.K_LEFT]:
    move_direction = 1
if key[pygame.K_RIGHT]:
    move_direction = 0
if key[pygame.K_SPACE] and can_shoot == True:
    can_shoot = False
    shoot_bullet()
if key[pygame.K_SPACE] == False and can_shoot == False:
    can_shoot = True
player.move((move_direction))

for bullet in list_bullets:
    bullet.update()
    pygame.draw.rect(surface, (46, 222, 16), bullet.rect)

for enemy in list_enemies:
    enemy.update(enemy_direction)
    pygame.draw.rect(surface, (46, 222, 16), enemy.rect)

pygame.draw.rect(surface, (0, 255, 255), player.rect)
pygame.display.flip()

   for event in pygame.event.get():
    if event.type == USEREVENT + 1:
        if enemy_direction == 0:
            enemy_direction = 1
        else:
            enemy_direction = 0
   if len(list_enemies) == 0:
    print("YOU WIN")
    break
  pygame.display.quit()

当前的 obj_player.move 方法只是检查当前方向是否有移动空间,如果有则移动。对于每个方向,当当前方向没有移动空间时,您需要添加将玩家移动到屏幕另一侧的行为。

def move(self, direction):
    if direction:
        if self.rect.x:
            self.rect.x -= 5
        else:
            self.rect.x = surfacex-20
    else:
        if self.rect.x <= surfacex-16:
            self.rect.x += 5
        else:
            self.rect = 0

将此添加到您的 move() 方法中

if self.rect.x > surfacex:
    self.rect.x = 0

if self.rect.right < 0:
    self.rect.right = surfacex

if self.rect.y > surfacey:
    self.rect.y = 0

if self.rect.bottom < 0:
    self.rect.bottom = surfacey

这意味着:如果你的球员在屏幕外"move"他到对手方。