По какой-то причине мои линии не прорисовываются в Pygame - PullRequest
0 голосов
/ 16 апреля 2019

В моей игре есть класс Стен, состоящий из одной линии, которая составляет единственную стену.Я планирую передать все эти экземпляры 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()

Я ожидал увидеть линии, нарисованные в позициях, которые я жестко закодировал, но линий вообще не было.Что вызывает эту проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...