Seite 1 von 1

PYgame collision beim drehen abfragen

Verfasst: Mittwoch 21. Mai 2008, 12:34
von sea-live
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

Verfasst: Mittwoch 21. Mai 2008, 14:16
von fred.reichbier
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

Verfasst: Mittwoch 21. Mai 2008, 17:04
von sea-live
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

Verfasst: Donnerstag 22. Mai 2008, 18:42
von sea-live
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