PYGAME collision bei unterschiedlichen screenwidth ?

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

Guten Tag
mein Spieler bewegt sich in einer 640x480 umgebung
das spielfeld ist 1280x960

auf dem spielfeld befinden sich nicht passierbare RECT's die in einer liste stehen

wenn ich nun das spielfeld verschiebe müsste sich ja auch die liste mitbewegen
oder mach ich da einen denkfehler

mit der self.colidelist(blockt_list) kann ich da nix anfangen
SCREENRECT = Rect(0, 0, 640, 480)
PLAYRECT = Rect(0, 0, 1280, 960)

mittels self.movex self.movey
könnte man alle coordinalten der block liste verschieben bei jedem move
gibts da eine andere lösung
BIN FÜR ALLES OFFEN
PLAYRECT soll noch grösser werden mindestens *3

Code: Alles auswählen

    def move_vertical(self, moving_vertical):
        global backgroundx,backgroundy
        if moving_vertical == 1 and self.movey < PLAYRECT.bottom and not(self.rect.centery <(SCREENRECT.bottom-(2*self.rect.height))):
            backgroundy -= self.speed
            self.movey += self.speed
        elif moving_vertical == -1 and self.movey > SCREENRECT.bottom and not(self.rect.centery >(SCREENRECT.top+(2*self.rect.height))):
            backgroundy += self.speed
            self.movey -= self.speed
        else:    
            self.rect.move_ip(0 ,moving_vertical*self.speed)
            self.rect = self.rect.clamp(SCREENRECT)
            if self.rect.collidelist(blocked_tile_list) != -1:
                self.rect.move_ip(0 ,(moving_vertical*-1)*self.speed)
    def move_horizontal(self, moving_horizontal):
        global backgroundx,backgroundy
        if moving_horizontal == 1 and self.movex < PLAYRECT.right and not(self.rect.centerx <(SCREENRECT.right-(2*self.rect.height))):
            backgroundx -= self.speed
            self.movex += self.speed
        elif moving_horizontal == -1 and self.movex > SCREENRECT.right and not(self.rect.centerx >(SCREENRECT.left+(2*self.rect.height))):
            backgroundx += self.speed
            self.movex -= self.speed
        else:    
            self.rect.move_ip(moving_horizontal*self.speed, 0)
            self.rect = self.rect.clamp(SCREENRECT)
            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
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Quellcode ausgelagert mit cklassen objekten sprite
http://paste.pocoo.org/show/53146/
benötigte 4 images im selben verzeichniss wie der Quellcode
BildBild
BildBild

könnte es gehen

jedoch fährt mein player manchmal durch die mauern durch
fehler enddeckt auch beim playrect verschieben muss man ja auf kolölision testen

Code: Alles auswählen

    def move_horizontal(self, moving_horizontal):
        global backgroundx,backgroundy
        if moving_horizontal == 1 and self.movex < PLAYRECT.right and not(
            self.rect.centerx <(SCREENRECT.right-(2*self.rect.height))
            )and not pygame.sprite.spritecollideany(self,stone) :
            backgroundx -= self.speed
            self.movex += self.speed
        elif moving_horizontal == -1 and self.movex > SCREENRECT.right and not(
            self.rect.centerx >(SCREENRECT.left+(2*self.rect.height))
            )and not pygame.sprite.spritecollideany(self,stone) :
            backgroundx += self.speed
            self.movex -= self.speed
        else:    
            self.rect.move_ip(moving_horizontal*self.speed, 0)
            self.rect = self.rect.clamp(SCREENRECT)
            if pygame.sprite.spritecollideany(self,stone) :
                self.rect.move_ip((moving_horizontal*-1)*self.speed, 0)
richtig lange if anweisungen
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

wer mein panzer projekt mitferfolgt hier nun der Panzer schiest

Quellcode Komplett
http://paste.pocoo.org/show/53316/

2 weitere images
Bild Bild
so siehts dann aus
Bild

die schussclasse

Code: Alles auswählen

class Panzerweapon(pygame.sprite.Sprite):
    speed = 10
    frame = 0
    animcycle = 3
    def __init__(self,pos,angle):
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.images = []
        self.original_a = pygame.image.load('gran.png').convert_alpha()
        self.original_b = pygame.image.load('grana.png').convert_alpha()
        self.images.append(pygame.transform.rotate(self.original_a,angle))
        self.images.append(pygame.transform.rotate(self.original_b,angle))
        self.angle = angle-180
        self.start_angle = self.angle
        self.image = self.images[0]
        self.x,self.y = pos #pos center des abschusses
        self.master_x,self.master_y = pos
        self.bufferx = 69 #kanonenoffset in x
        self.buffery = 66 #kanonenlänge vom center
        self.rad_angle = self.angle * math.pi / 180 # radiant wegen schussrichtung + - 2PI
        self.buffer_x = self.bufferx * -math.sin(self.rad_angle)
        self.buffer_y = self.buffery * -math.cos(self.rad_angle)
        self.x = self.master_x + self.buffer_x
        self.y = self.master_y + self.buffer_y
        self.rect = self.image.get_rect(center = (self.x, self.y))
    def update(self):
        self.frame += 1
        self.imind = self.frame/self.animcycle%2
        self.image = self.images[self.imind]
        self.rect.centerx = self.rect.centerx + (math.sin(self.angle*2*math.pi/360)*-self.speed)
        self.rect.centery = self.rect.centery + (math.cos(self.angle*2*math.pi/360)*-self.speed)
        if not SCREENRECT.contains(self.rect):
            self.kill()
in der main aufruf

Code: Alles auswählen

        if event.type == KEYDOWN and event.key == K_c and player.alive() :
            Panzerweapon((player.rect.centerx, player.rect.centery),player.angle)
Zuletzt geändert von sea-live am Samstag 8. Mai 2010, 09:38, insgesamt 1-mal geändert.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Die Particel bei Granate trifft Mauer
stammen von der classe

Code: Alles auswählen

class Particle(pygame.sprite.Sprite):
    def __init__(self, pos, vx, vy, ax, ay, size, colorstructure):
        pygame.sprite.Sprite.__init__(self, self.containers)
        self.vx, self.vy, self.ax, self.ay = vx, vy, ax, ay
        self.images = []
        #self.ti = pygame.time.get_ticks() # Livetime
        for x in colorstructure:
            start, end, duration = x
            startr, startg, startb = start
            endr, endg, endb = end
            def f(s, e, t):
                return s + int((e - s)*(t/float(duration)))
            for t in range(duration):
                image = pygame.Surface((size, size)).convert()
                image.fill((f(startr, endr, t), f(startg, endg, t), f(startb, endb, t)))
                self.images.append(image)
        self.image = self.images[0]
        self.rect = self.image.get_rect(center = pos)
    def update(self):
        self.rect.move_ip(self.vx/3, self.vy/3)
        if not self.images:
            #print pygame.time.get_ticks()-self.ti #livetime
            self.kill()
        else:
            self.image = self.images.pop(0)
        
der aufruf in der main sieht wie folgt aus

Code: Alles auswählen

        for shot in pygame.sprite.groupcollide(panzerweapon, stone, 1, 0):
            for i in range(10):
                Particle(shot.rect.center, random.randrange(-7, 7), random.randrange(-7, 7), 0, 1, 3,
                         [((0, 255, 0), (0, 200, 0), 3), ((0, 150, 0), (0, 0, 0), 5)])
die 3 und die 5 sind die lifetime die man mit #Livetime in der klasse überprüfen sollte <1000milisekunden
Antworten