PYgame collision beim drehen abfragen

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

servus
beim horizontalen und verticalen verschieben klappt die kollisionsabfrage
nur wie mach ich das beim rotieren
woher weis ich in welche richtung ich freifahren muss
und ob eine drehung überhaupt möglich ist zb im TUNNEL kann ich nicht drehen !!


blocktilelist enthält alles was nicht befahrbar ist

Code: Alles auswählen

    def move_vertical(self, moving_vertical):
        self.rect.move_ip(0 ,moving_vertical*self.speed)
        if self.rect.collidelist(blocked_tile_list) != -1:
            self.rect.move_ip(0 ,(moving_vertical*-1)*self.speed)
            self.rect = self.rect.clamp(PLAYRECT)
            self.frame += 1
            self.imind = self.frame/self.animcycle%2
            self.image = self.images[self.imind]
    def move_horizontal(self, moving_horizontal):
        self.rect.move_ip(moving_horizontal*self.speed, 0)
        if self.rect.collidelist(blocked_tile_list) != -1:
            self.rect.move_ip((moving_horizontal*-1)*self.speed, 0)
            self.rect = self.rect.clamp(PLAYRECT)
    def rotate(self,rotate_left,rotate_right):
        center = self.rect.center
        if rotate_left == 2:
            self.angle += 5
        if rotate_right == 2:
            self.angle -= 5
        if self.angle == 360 or self.angle == 0:angle = 0
        self.images[0] = pygame.transform.rotate(self.original_a,self.angle)
        self.images[1] = pygame.transform.rotate(self.original_b,self.angle)
        self.rect = self.images[0].get_rect()
        self.rect.center = center
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

Dadurch, dass man in pygame (soweit ich weiß) keine Rects drehen kann, wird eine genaue Kollisionsabfrage mit dem pygame.Rect - Kram schwer werden. Besser ist da wahrscheinlich ein Verfahren mit Hitmasks (wie z.B. hier: FastPixelPerfect).

Gruß Fred
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

benötigte images im selben verzeichniss wie der Quellcode
BildBild
BildBild

ich hab jetzt das PHENOMEN das ich nur an der mauer drehen kann im freien feld dreht der panzer nicht
zum testen PANZER an die MAUER Fahren up down left right
und dann mit up+down oder left+right drehen
in freien feld dreht der panzer nicht

ich hab mal 3mauern als hardware implementiert

QUELLCODE des gesamten testfeldes ausgelagert
http://paste.pocoo.org/show/52299/

Code: Alles auswählen

    def move_vertical(self, moving_vertical):
        self.rect.move_ip(0 ,moving_vertical*self.speed)
        if self.rect.collidelist(blocked_tile_list) != -1:
            self.rect.move_ip(0 ,(moving_vertical*-1)*self.speed)
            self.rect = self.rect.clamp(PLAYRECT)
            self.frame += 1
            self.imind = self.frame/self.animcycle%2
            self.image = self.images[self.imind]
    def move_horizontal(self, moving_horizontal):
        self.rect.move_ip(moving_horizontal*self.speed, 0)
        if self.rect.collidelist(blocked_tile_list) != -1:
            self.rect.move_ip((moving_horizontal*-1)*self.speed, 0)
            self.rect = self.rect.clamp(PLAYRECT)
    def rotate(self,rotate_left,rotate_right):
        center = self.rect.center
        if rotate_left == 2:
            self.angle += 5
        if rotate_right == 2:
            self.angle -= 5
        if self.angle == 360 or self.angle == 0:angle = 0
        self.images[0] = pygame.transform.rotate(self.original_a,self.angle)
        self.images[1] = pygame.transform.rotate(self.original_b,self.angle)
        self.rect = self.images[0].get_rect()
        self.rect.center = center
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

ich hab nun die lösung selbst herausbekommen
Quellcode des Testfeldes
http://paste.pocoo.org/show/52787/

Hier die Player update bzw movesequenz

Code: Alles auswählen

    def move_vertical(self, moving_vertical):
        self.rect.move_ip(0 ,moving_vertical*self.speed)
        self.frame += 1
        self.imind = self.frame/self.animcycle%2
        self.image = self.images[self.imind]
        self.rect = self.rect.clamp(PLAYRECT)
        if self.rect.collidelist(blocked_tile_list) != -1:
            self.rect.move_ip(0 ,(moving_vertical*-1)*self.speed)
    def move_horizontal(self, moving_horizontal):
        self.rect.move_ip(moving_horizontal*self.speed, 0)
        self.rect = self.rect.clamp(PLAYRECT)
        if self.rect.collidelist(blocked_tile_list) != -1:
            self.rect.move_ip((moving_horizontal*-1)*self.speed, 0)
    def rotate(self,rotate_left,rotate_right):
        rotate = 0
        center = self.rect.center
        if rotate_left == 2:rotate = 5
        if rotate_right == 2:rotate = -5
        if self.angle == 360 or self.angle == 0:angle = 0
        if rotate :
            self.angle += rotate
            self.images[0] = pygame.transform.rotate(self.original_a,self.angle)
            self.images[1] = pygame.transform.rotate(self.original_b,self.angle)
            self.rect = self.images[0].get_rect()
            self.rect.center = center
            if self.rect.collidelist(blocked_tile_list) != -1:
                self.angle -= rotate
                self.images[0] = pygame.transform.rotate(self.original_a,self.angle)
                self.images[1] = pygame.transform.rotate(self.original_b,self.angle)
                self.rect = self.images[0].get_rect()
                self.rect.center = center
Antworten