Kollision zwischen Masken in Pygame

Lesezeit: 4 Minuten

Kollision zwischen Masken in Pygame
LM-Programmierung

Ich habe ein Problem mit Kollisionen in meinem Spiel, die Maske des Raumschiffs kollidiert nicht richtig mit einem Hintergrund und ich glaube, dass der Versatz ein Problem ist, bin mir aber nicht sicher.

Ich habe mehrere Kollisionstechniken ausprobiert und viele Antworten auf mein Problem überprüft, aber keine davon hat mir geholfen.

import pygame as pg
import os

os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (2, 29)

pg.init()


def gameLoop():
    display_width = 1800
    display_height = 1000
    pg.display.set_caption("Kerbal Space Landing Simulator")
    clock = pg.time.Clock()
    display = pg.display.set_mode((display_width, display_height))
    sprsp = pg.image.load('C:/Users/PC/PycharmProjects/untitled/sprspaceship.png').convert_alpha()
    cosbg = pg.image.load('C:/Users/PC/PycharmProjects/untitled/cosmos bg.png').convert_alpha()
    done = False

class Spaceship:
    def __init__(self, x, y, mass):
        self.x = x
        self.y = y
        self.width = 139
        self.height = 106
        self.velx = 0
        self.vely = 0
        self.mass = mass
        self.color = (255, 255, 255)
        self.spr = sprsp
        self.fuel = 500
        self.mask = pg.mask.from_surface(self.spr)
        self.angle = 0
        self.changerot = 0

    def check_controls(self):
        if keys[pg.K_SPACE] and self.fuel > 0:
            if self.angle > 0:
                self.vely += 0.005 * (self.angle - 90)
                self.velx += -0.005 * self.angle
            else:
                self.vely += -0.005 * (self.angle + 90)
                self.velx += -0.005 * self.angle

            self.fuel += -3
        if keys[pg.K_LEFT] and self.angle < 90:
            self.angle += 2
        if keys[pg.K_RIGHT] and self.angle > -90:
            self.angle += -2

    def update_pos(self):
        self.vely += 0.01
        self.x += self.velx
        self.y += self.vely
        self.mask = pg.mask.from_surface(self.spr)

    def update_rotation(self):
        self.rspr = pg.transform.rotate(self.spr, self.angle)
        self.changerot -= self.angle

    def draw(self):
        if self.fuel > 0:
            pg.draw.rect(display, (255, 255, 255), (display_width - 100, 100 + 500 - self.fuel, 10, self.fuel), 0)
        display.blit(self.rspr, (int(self.x), int(self.y)))

        self.changerot = 0

class Terrain(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.mask = pg.mask.from_threshold(display, (160, 160, 160))
        self.hitbox = pg.Rect(self.x, self.y, display_width, 500)
        self.ox = display_width // 2 - self.x // 2
        self.oy = display_height // 2 - self.y // 2

    def draw(self):
        pg.draw.rect(display, (160, 160, 160), (self.x, self.y, display_width, 500), 0)

spaceship = (Spaceship(500, 100, 1))
terrain = (Terrain(0, 800))

def redrawGameWindow():
    display.blit(cosbg, (0, 0))
    spaceship.draw()
    terrain.draw()
    pg.display.update()

def check_for_collisions():
    offset = (int(spaceship.x - terrain.ox), int(spaceship.y - terrain.oy))
    print(offset)
    print(spaceship.mask.overlap(terrain.mask, offset))
    return spaceship.mask.overlap(terrain.mask, offset)
    # return spaceship.hitbox.colliderect(terrain.hitbox)
    # return pg.sprite.spritecollide(spaceship.spr, terrain.mask, False, pg.sprite.collide_mask)

while not done:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            done = True

    keys = pg.key.get_pressed()
    mouse_pressed = pg.mouse.get_pressed()
    x, y = pg.mouse.get_pos()

    spaceship.check_controls()
    spaceship.update_pos()
    spaceship.update_rotation()
    if check_for_collisions() is not None:
        print('Hit! You've hit the ground with the speed:', spaceship.vely)
        exit()

    redrawGameWindow()
    clock.tick(60)

gameLoop()

Raumschiff kollidiert nicht mit der Oberfläche. Ich weiß, wie man es mit einfacherem Code beheben kann, aber in Zukunft möchte ich zufällig generiertes Gelände verwenden. Können Sie mir bei diesen Kollisionen helfen?

  • Warum verwenden Sie .ox, .oy-Koordinaten für Terrain, aber .x, .y-Koordinaten für Raumschiffe? Was passiert, wenn Sie auch .x-, .y-Koordinaten für Gelände verwenden?

    – Nikos M.

    23. April 19 um 18:44 Uhr

  • Leider funktioniert es immer noch nicht.

    – LM-Programmierung

    23. April 19 um 18:47 Uhr

  • Ist das dein richtiger Code? Sie haben einen Fehler mit der lokalen Variablen sprsp in self.spr = sprsp. Du erschaffst sprsp in gameloop() aber es ist eine lokale Variable und existiert nicht, wenn Sie sie ausführen self.spr = sprsp

    – Furas

    23. April 19 um 19:20 Uhr


  • Ja, es funktioniert bei mir

    – LM-Programmierung

    23. April 19 um 19:38 Uhr

Kollision zwischen Masken in Pygame
Rabbid76

Die Maske für die Terrain ist nie eingestellt. Kiste eine richtige Terrain Maske:

class Terrain(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
        maskSurf = pg.Surface((display_width, display_height)).convert_alpha()
        maskSurf.fill(0)
        pg.draw.rect(maskSurf, (160, 160, 160), (self.x, self.y, display_width, 500), 0)
        self.mask = pg.mask.from_surface(maskSurf)
        print(self.mask.count())
 
        # [...]

Beim Benutzen pygame.mask.Mask.overlap()dann müssen Sie die Überlappung der überprüfen Spaceship und das Terraineher als das Terrain und das Spaceship.
Seit der Terrain Maske ist eine Maske des gesamten Bildschirms, der Offset für die overlap() Test ist die Position der Spaceship:

def check_for_collisions():
    offset = (int(spaceship.x), int(spaceship.y))
    collide = terrain.mask.overlap(spaceship.mask, offset)
    print(offset, collide)
    return collide

Minimalbeispiel: 1641759771 316 So drehen Sie das Sprite in Pygame wahrend Sie sich repl.it/@Rabbid76/PyGame-SurfaceMaskIntersect

Kollision zwischen Masken in Pygame

Siehe auch: Maske

  • Ich kann gar nicht ausdrücken, wie glücklich ich über eine Antwort bin, vielen Dank!

    – LM-Programmierung

    23. April 19 um 19:40 Uhr


  • Ja, so ist es. Danke

    – LM-Programmierung

    23. April 19 um 19:47 Uhr

.

665380cookie-checkKollision zwischen Masken in Pygame

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy