【问题标题】:Pygame sprite touchingPygame 精灵感人
【发布时间】:2018-12-04 16:53:12
【问题描述】:

我正在尝试用两个精灵构建一个简单的游戏。我不知道如何添加代码来检测精灵是否与另一个精灵接触。我也很难理解关于这个主题的无数教程。如果您能尝试尽可能简单地向我解释这一点,那就太棒了!

import pygame
import sys
from pygame.locals import *
pygame.init()

black = (0, 0, 0)
white = (255, 255, 255)
bg = black
square = pygame.image.load('square.png')
square1 = pygame.image.load('square1.png')
screen = pygame.display.set_mode((640, 400))

UP = 'UP'
DOWN = 'DOWN'
LEFT = 'LEFT'
RIGHT = 'RIGHT'
direction = RIGHT
movex, movey, movex1, movey1 = 100, 100, 200, 200

class player1(pygame.sprite.Sprite):
    """Player 1"""

    def __init__(self, xy):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load('square.png')
        self.rect = self.image.get_rect()

class player2(pygame.sprite.Sprite):
    """Player 2"""

    def __init__(self, xy):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load('square1.png')
        self.rect = self.image.get_rect()

while True:
    screen.fill(black)
    collide = pygame.sprite.collide_mask(player1, player2)
    if collide == True:
        print 'collision!'
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_w:
                movey -= 10 
            elif event.key == K_s:
                movey += 10
            elif event.key == K_a:
                movex -= 10
            elif event.key == K_d:
                movex += 10
            if event.key == K_UP:
                movey1 -= 10 
            elif event.key == K_DOWN:
                movey1 += 10
            elif event.key == K_LEFT:
                movex1 -= 10
            elif event.key == K_RIGHT:
                movex1 += 10
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    screen.blit(square, (movex, movey))
    screen.blit(square1, (movex1, movey1))
    pygame.display.update()

【问题讨论】:

    标签: python pygame collision


    【解决方案1】:

    先解决一些问题:

    • pygame.sprite.collide_mask 永远不会返回 True。它返回一个点或None。所以你的支票collide == True 永远不会被评估为True
    • pygame.sprite.collide_mask 除外两个 Sprite 实例,但您使用 class 对象作为参数调用它 (collide_mask(player1, player2))
    • 只需要pygame.sprite.collide_mask就可以进行像素完美碰撞检测
    • 您实际上并没有在其余代码中使用 player1player2

    如果您使用的是Sprite 类,那么一种简单的碰撞检测方法是使用Group 类。但由于您只有两个 Sprite,您可以使用 colliderect 简单地检查它们的 Rects 的交集。

    我已更新您的代码以使用 Sprite 类:

    import pygame
    import sys
    from pygame.locals import *
    pygame.init()
    
    black = (0, 0, 0)
    white = (255, 255, 255)
    
    screen = pygame.display.set_mode((640, 400))
    
    class Player(pygame.sprite.Sprite):
    
        def __init__(self, image, x, y):
            pygame.sprite.Sprite.__init__(self)
            self.image = pygame.image.load(image)
            self.rect = self.image.get_rect(x=x, y=y)
    
    player1, player2 = Player('square.png', 100, 100), Player('square1.png', 200, 200)
    players = pygame.sprite.Group(player1, player2)
    
    while True:
        screen.fill(black)
    
        if player1.rect.colliderect(player2.rect):
            print 'collision!'
    
        for event in pygame.event.get():
            if event.type == KEYDOWN:
                if event.key == K_w:
                    player1.rect.move_ip(0, -10) 
                elif event.key == K_s:
                    player1.rect.move_ip(0, 10)
                elif event.key == K_a:
                    player1.rect.move_ip(-10, 0)
                elif event.key == K_d:
                    player1.rect.move_ip(10, 0)
                if event.key == K_UP:
                    player2.rect.move_ip(0, -10)
                elif event.key == K_DOWN:
                    player2.rect.move_ip(0, 10)
                elif event.key == K_LEFT:
                    player2.rect.move_ip(-10, 0)
                elif event.key == K_RIGHT:
                    player2.rect.move_ip(10, 0)
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
        players.draw(screen)
        pygame.display.update()
    

    碰撞检测是一个广泛的主题,但这应该可以帮助您入门。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多