Python 如何在PYGAME中同时移动多个对象

Python 如何在PYGAME中同时移动多个对象,python,class,pygame,Python,Class,Pygame,我想做一个游戏,在这个游戏中,我的敌人来自屏幕的两侧。 现在我有了它,敌人可以一次一个地在屏幕上滚动。 我希望一次能有更多的人来,慢慢增加他们见面的频率。 这是我的密码 import pygame, sys, time, random from pygame.locals import * pygame.init() winW = 1000 winH = 600 surface = pygame.display.set_mode ((winW, winH),0,32) pygame.disp

我想做一个游戏,在这个游戏中,我的敌人来自屏幕的两侧。 现在我有了它,敌人可以一次一个地在屏幕上滚动。 我希望一次能有更多的人来,慢慢增加他们见面的频率。 这是我的密码

import pygame, sys, time, random
from pygame.locals import *
pygame.init()
winW = 1000
winH = 600
surface = pygame.display.set_mode ((winW, winH),0,32)


pygame.display.set_caption ('Moving Orc')

class Enemy:
    def __init__(self, char, startY, startX):
        self.char=char
        self.startY=startY
        self.startX=startX
        self.drawChar()

    def drawChar (self):
        self.space = pygame.image.load (self.char)
        self.spaceRect = self.space.get_rect ()
        self.spaceRect.topleft = (self.startX,self.startY)
        self.moveChar()

    def moveChar (self):
        if self.startX == 0:
            self.xMoveAmt = 5
        elif self.startX == 800:
            self.xMoveAmt = -5

        while True:
            surface.fill ((255,255,255))
            self.spaceRect.left += self.xMoveAmt

            surface.blit (self.space, self.spaceRect)

            pygame.display.update()

            time.sleep (0.02)

            if self.spaceRect.right >= winW:
                surface.fill ((255,255,255))
                break

            elif self.spaceRect.left <= 0:
                surface.fill ((255,255,255))
                break


#MAINLINE
while True:
    enemyList=[]
    leftOrRight = random.randint(0,1)
    if leftOrRight == 0:
        leftOrRight = 0
    elif leftOrRight == 1:
        leftOrRight = 800
    enemyList.append(Enemy(("orc.png"), random.randint(50, 500), leftOrRight))

    for i in range (0,len(enemyList)):
        enemyList[i].drawChar()
        break
导入pygame、sys、time、random
从pygame.locals导入*
pygame.init()
winW=1000
winH=600
surface=pygame.display.set_模式((winW,winH),0,32)
pygame.display.set_标题('移动的兽人')
阶级敌人:
定义初始化(self、char、startY、startX):
self.char=char
self.startY=startY
self.startX=startX
self.drawChar()
def drawChar(自身):
self.space=pygame.image.load(self.char)
self.spacelect=self.space.get_rect()
self.spacelect.topleft=(self.startX、self.startY)
self.moveChar()
def moveChar(自身):
如果self.startX==0:
self.xMoveAmt=5
elif self.startX==800:
self.xMoveAmt=-5
尽管如此:
表面填充((255255))
self.spacelect.left+=self.xMoveAmt
surface.blit(self.space、self.spacer等)
pygame.display.update()
睡眠时间(0.02)
如果self.spacelect.right>=winW:
表面填充((255255))
打破

elif self.spacelect.left去掉
drawChar
函数;让敌人的职业意识到
表面
,这只应该存在于游戏逻辑中,这是不好的做法。更改
moveChar
函数,使其仅更新对象的位置。将循环从
moveChar
中取出,并在主游戏循环中处理移动

敌人职业:

class Enemy(object):
    def __init__(self, char, startX=0, startY=0, xMovAmnt=0):
        self.char = char
        self.x = startX
        self.y = startY
        self.xMovAmnt = xMovAmnt
        # no reason to load the image every time you want to draw, do it here
        self.image = pygame.image.load(self.char)
        self.rect = self.image.get_rect()

    def moveChar(self):
        self.x += self.xMovAmnt
游戏循环

enemyList = []
while True:
    ...
    # you never specified when you want to create a new Enemy, 
    #    so you need to figure that out on your own
    ...

    # this is a more "Pythonic" way of looping over a list than using a range
    for enemy in enemyList:
        enemy.movChar()
        surface.blit(enemy.image, (enemy.x, enemy.y))

    pygame.display.update()

为了有多个敌人,你应该解决的事情很少

简单的pygame程序结构是什么样子的

init() 
While(True):
    draw()
    update()
    checkInput()
我看到你已经为敌人写了一个移动和绘制函数,但是他们没有做他们应该做的

draw方法加载图像,并调用移动函数。加载通常应在
\uuuu init\uuuu()
中完成

move函数绘制并移动角色,但它有一个While循环,这会使角色一直被卡住,直到角色离开屏幕为止

一个示例解决方案:

def draw(self,surface):
    surface.blit (self.space, self.spaceRect)

def move(self):
    self.spaceRect.left += self.xMoveAmt
    if self.spaceRect.right >= winW:
        self.kill()
    elif self.spaceRect.left <= 0:
        self.kill()
def绘图(自身、表面):
surface.blit(self.space、self.spacer等)
def移动(自我):
self.spacelect.left+=self.xMoveAmt
如果self.spacelect.right>=winW:
self.kill()

elif self.spacelect.left我认为即使在
敌方
类中有
draw
函数也是不好的。即使在更改它以便必须传入对曲面的引用时,仍然会限制对象曲面的绘制方式。我更喜欢为它的图像提供对象属性,让游戏循环或实用程序模块处理它在各种场景中的绘制方式。编辑:此外,它还为Pygame添加了更多依赖项。从理论上讲,可以在类外部加载图像,并将加载的曲面传递到类的构造函数中,并使其可用于多个框架。我同意,在更大的项目中,draw函数不是可行的方法。这就是为什么我称它为简单的pygame程序。OP的游戏区域是屏幕区域本身,因此精灵的坐标将与屏幕上的坐标相同。把一个简单的游戏复杂化是没有意义的,我现在有了它,可以在屏幕上显示多个跨距和滚动。我怎样才能使产卵和移动不同时发生?每次它移动一个或多个卵过快地填满屏幕。@StephenSparks您可以使用pygame的时间模块跟踪上次卵的时间:好的,我很好。当对象到达另一侧时,如何删除该对象?