多个精灵碰撞检测

时间:2020-02-25 03:21:12

标签: python python-3.x pygame

好,所以我一直在尝试找出如何进行设置,但无法使其正常工作。如果您熟悉的话,我正在尝试获得与游戏Frogger中的移动日志类似的功能。到目前为止,我所进行的碰撞检测仅适用于一个pygame.sprite.Group()

import pygame
import os
import random

os.environ['SDL_VIDEO_CENTERED'] = '1'

WIDTH = 480
HEIGHT = 720
FPS = 60

# Moving Object spacing setup first row 
INSTANCE_COUNT = 0
BOX_WIDTH = 30
SPACING = 120

# object speed
pos_objspeed = 1
neg_objspeed = -1

BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

pygame.init()
pygame.mixer.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()

class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((30, 30))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.centerx = WIDTH / 2
        self.rect.bottom = HEIGHT - 96
        self.speedx = 0
        self.speedy = 0

class MovingObj_Test(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((90, 30))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = (INSTANCE_COUNT * (SPACING+ BOX_WIDTH))
        #self.rect.x = random.randrange(WIDTH)
        self.rect.bottom = 384
        self.speedx = pos_objspeed

    def update(self):
        self.rect.x += self.speedx
        if self.rect.x >= 480:
            self.rect.x = -30
            self.rect.bottom = 384
            self.speedx = pos_objspeed        

class MovingObj_TestTwo(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((90, 30))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = (INSTANCE_COUNT * (SPACING+ BOX_WIDTH))
        #self.rect.x = random.randrange(WIDTH)
        self.rect.bottom = 336
        self.speedx = neg_objspeed

    def update(self):
        self.rect.x += self.speedx
        if self.rect.x >= 480:
            self.rect.x = -30
            self.rect.bottom = 336
            self.speedx = neg_objspeed

all_sprites = pygame.sprite.Group()
movingobj_l = pygame.sprite.Group()
movingobj_r = pygame.sprite.Group()

for i in range (3):
    INSTANCE_COUNT = i + 1
    obj1 = MovingObj_Test()
    all_sprites.add(obj1)
    movingobj_l.add(obj1)

for i in range (3):
    INSTANCE_COUNT = i + 1
    obj2 = MovingObj_TestTwo()
    all_sprites.add(obj2)
    movingobj_r.add(obj2)

player = Player()
all_sprites.add(player)

running = True
onLogLeft = False
onLogRight = False
groundSpd = 48
while running:

    clock.tick(FPS)

    hitsleft = pygame.sprite.spritecollide(player, movingobj_l, False, pygame.sprite.collide_rect)
    for hit in hitsleft:
        player.speedx = pos_objspeed
        player.speedy = 0
        onLogLeft = True
    if len(hitsleft) == 0:
        onLogLeft = False
        player.speedx = 0
        player.speedy = 0
    hitsright = pygame.sprite.spritecollide(player, movingobj_r, False, pygame.sprite.collide_rect)
    for hit in hitsright:
        player.speedx = neg_objspeed
        player.speedy = 0
        onLogRight = True
    if len(hitsright) == 0:
        onLogRight = False
        player.speedx = 0
        player.speedy = 0


    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                player.speedx = -groundSpd
            if event.key == pygame.K_RIGHT:
                player.speedx = groundSpd
            if event.key == pygame.K_UP:
                player.speedy = -groundSpd
            if event.key == pygame.K_DOWN:
                player.speedy = groundSpd

        if event.type == pygame.KEYUP and onLogLeft == False and onLogRight == False:
            if event.key == pygame.K_LEFT:
                player.speedx = 0
            if event.key == pygame.K_RIGHT:
                player.speedx = 0
            if event.key == pygame.K_UP:
                player.speedy = 0
            if event.key == pygame.K_DOWN:
                player.speedy = 0

    if onLogLeft == False and onLogRight == False and player.rect.bottom <= 384:
        running = False

    player.rect.x += player.speedx
    player.rect.y += player.speedy

    if event.type == pygame.QUIT:
        running = False



    #player.rect.x += player.speedx
    #player.rect.y += player.speedy

    all_sprites.update()
    screen.fill(BLACK)
    all_sprites.draw(screen)
    pygame.display.flip()



pygame.quit()
quit()

好吧,在我的代码中

hitsright = pygame.sprite.spritecollide(player, movingobj_r, False, pygame.sprite.collide_rect)

检查碰撞并更新玩家的速度,但

hitsleft = pygame.sprite.spritecollide(player, movingobj_l, False, pygame.sprite.collide_rect)

没有做同样的事情。

如果有人有任何想法,为什么我会感到困惑。另外,我该如何解决这两种问题呢?

1 个答案:

答案 0 :(得分:0)

左右代码的行为有所不同,因为如果检测到与.right{ width: 30%; } .left{ ... //width must be auto } 的冲突,则会设置var ul = document.getElementById("homePage_content-ul"); var li = ul.getElementsByTagName("li"); var numItems = li.length; var css = document.createElement("style"); css.type = "text/css"; css.innerHTML = "ul#homePage_content-ul { column-count: " + Math.round(numItems/2) + "; column-gap: 0; }"; document.body.appendChild(css);

hitsleft

但是如果与player.speedx发生冲突,就不会与for hit in hitsleft: player.speedx = pos_objspeed 发生冲突,并且hitsleft会立即重置:

hitsright

您必须根据两个条件(例如,在player.speedx-if len(hitsright) == 0: onLogRight = False player.speedx = 0 -player.speedx语句中设置if

elif