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的时间模块跟踪上次卵的时间:好的,我很好。当对象到达另一侧时,如何删除该对象?