В моей игре есть класс Стен, состоящий из одной линии, которая составляет единственную стену.Я планирую передать все эти экземпляры Wall в экземпляр Room, который состоит из экземпляра Room с экземплярами Wall в нем.Однако по какой-то причине, когда я пытаюсь нарисовать линии, они не отображаются в окне.
Я попробовал несколько разных классов, чтобы увидеть, что работает, но ни один из них не работает.Я попытался создать класс Room, который использует pygame.draw.lines()
, чтобы нарисовать все стены.Однако я не был уверен, как проверить обнаружение столкновения для этих линий.Я также попытался создать еще один класс Room, в котором вместо этого используется pygame.draw.polygon()
и используется незаполненный многоугольник, чтобы можно было надеяться, что обнаружение столкновений будет работать между игроком и краями комнаты.Однако я понял, что это может не сработать, потому что мне нужны двери в каждой комнате.Я планирую включить различные стены и иметь двери между ними, которые являются по существу прозрачными стенами, через которые можно пройти.Я не уверен, как это сделать с полигоном.Во всяком случае, вот мой код.
class Game(PygameGame):
def init(self):
super().__init__()
Player.init()
#Ghost.init()
self.playerGroup=pygame.sprite.Group(Player(400,400))
self.wallGroup=pygame.sprite.Group()
wall1StartPos=(300,400)
wall1EndPos=(400,300)
wall1=Wall(wall1StartPos,wall1EndPos)
self.wallGroup.add(wall1)
wall2StartPos=(400,300)
wall2EndPos=(550,300)
wall2=Wall(wall2StartPos,wall2EndPos)
self.wallGroup.add(wall2)
exitStartPos=(550,300)
exitEndPos=(600,300)
exit=Exit(exitStartPos,exitEndPos)
wall3StartPos=(600,300)
wall3EndPos=(600,400)
wall3=Wall(wall3StartPos,wall3EndPos)
self.wallGroup.add(wall3)
wall4StartPos=(500,400)
wall4EndPos=(300,400)
wall4=Wall(wall4StartPos,wall4EndPos)
self.wallGroup.add(wall4)
print(self.wallGroup)
'''self.roomGroup=pygame.sprite.Group()
xLeft=100
yTop=20
widthRoom1=200
heightRoom1=300
self.room1=Room(xLeft,yTop,widthRoom1,heightRoom1)
self.roomGroup.add(self.room1)'''
def timerFired(self,dt):
self.playerGroup.update(self.isKeyPressed)
if pygame.sprite.groupcollide(self.playerGroup,self.wallGroup,False,\
False,collided=None):
self.playerGroup.speed=-60
else:
self.playerGroup.speed=5
'''for room in self.roomGroup:#find a way to only check each active room
#later
for player in self.playerGroup:
if player.x+player.r>=room.xLeft+room.width or player.x-\
player.r<=room.xLeft or player.y-player.r<=room.yTop or \
player.y+player.r>=room.yTop+room.height:
player.speed=-60
else:
player.speed=5'''
def redrawAll(self,screen):
#self.roomGroup.draw(screen)
self.wallGroup.draw(screen)
print('draw wall group')
self.playerGroup.draw(screen)
class Wall(pygame.sprite.Sprite):
def __init__(self,startPos,endPos):
super(Wall,self).__init__()
self.startPos=startPos
self.endPos=endPos
self.width=2
self.height=2
xLeft=startPos[0]
yTop=startPos[1]
self.width=abs(endPos[0]-startPos[0])
self.height=abs(endPos[1]-startPos[1])
angle=-math.atan2(self.height,self.width)
if self.width==0:
self.width=1
if self.height==0:
self.height=1
self.image=pygame.Surface((self.width,self.height),\
pygame.SRCALPHA).convert_alpha()
self.image=pygame.transform.rotate(self.image,angle)
pygame.draw.line(self.image,(0,0,0),startPos,endPos,10)
self.rect=self.image.get_rect()
print(self.rect)
print('wall __init__')
def updateRect(self):
#update the object's rect attribute with the new x,y coordinates
pass
self.rect=self.image.get_rect()
print('wall updateRect')
def update(self):
self.updateRect()
super(Wall,self).update()
print('wall update')
class PygameGame(object):#taken from Lukas Peraza's framework, https://qwewy.gitbooks.io/pygame-module-manual/chapter1/framework.html
def init(self):
pass
def mousePressed(self, x, y):
pass
def mouseReleased(self, x, y):
pass
def mouseMotion(self, x, y):
pass
def mouseDrag(self, x, y):
pass
def keyPressed(self, keyCode, modifier):
pass
def keyReleased(self, keyCode, modifier):
pass
def timerFired(self, dt):
pass
def redrawAll(self, screen):
pass
def isKeyPressed(self, key):
''' return whether a specific key is being held '''
return self._keys.get(key, False)
def __init__(self, width=3000, height=200, fps=50, title="112 Pygame Game"):
self.width = width
self.height = height
self.fps = fps
self.title = title
self.bgColor = (255, 255, 255)
pygame.init()
def run(self):
clock = pygame.time.Clock()
screen = pygame.display.set_mode((self.width, self.height))
# set the title of the window
pygame.display.set_caption(self.title)
# stores all the keys currently being held down
self._keys = dict()
# call game-specific initialization
self.init()
playing = True
while playing:
time = clock.tick(self.fps)
self.timerFired(time)
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
self.mousePressed(*(event.pos))
elif event.type == pygame.MOUSEBUTTONUP and event.button == 1:
self.mouseReleased(*(event.pos))
elif (event.type == pygame.MOUSEMOTION and
event.buttons == (0, 0, 0)):
self.mouseMotion(*(event.pos))
elif (event.type == pygame.MOUSEMOTION and
event.buttons[0] == 1):
self.mouseDrag(*(event.pos))
elif event.type == pygame.KEYDOWN:
self._keys[event.key] = True
self.keyPressed(event.key, event.mod)
elif event.type == pygame.KEYUP:
self._keys[event.key] = False
self.keyReleased(event.key, event.mod)
elif event.type == pygame.QUIT:
playing = False
screen.fill(self.bgColor)
self.redrawAll(screen)
pygame.display.flip()
pygame.quit()
def main():
game = PygameGame()
pygame.init()
game.run()
if __name__ == '__main__':
main()
Я ожидал увидеть линии, нарисованные в позициях, которые я жестко закодировал, но линий вообще не было.Что вызывает эту проблему?