Столкновение с изображениями - PullRequest
2 голосов
/ 14 октября 2019

Я должен сделать игру в 2d, используя Pygame, и я не знаю, как обнаружить столкновения с изображениями

Я проверил столкновения с прямоугольниками, и это работает, но когда я пытаюсь столкнуться с прямоугольникомс изображением, сбой приложения

import pygame,sys
from pygame.locals import *
from random import randint

pygame.init()
ventana=pygame.display.set_mode((1200,600))
pygame.display.set_caption("Jueguiño")

imageVida= pygame.image.load("vida.jpg")
posX= randint(0,1200)
posY= randint(0,0)

rectangulo=pygame.Rect(0,0,100,50)


velocidad=0.5

Blanco=(255,255,255)

while True:
    ventana.fill(Blanco)
    ventana.blit(imageVida,(posX,posY))
    pygame.draw.rect(ventana,(180,70,70),rectangulo)

    rectangulo.left,rectangulo.top=pygame.mouse.get_pos()
    if rectangulo.colliderect(imageVida):
        velocidad=0
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    if posY<1200:
        posY+=velocidad
    pygame.display.update()

Ответы [ 2 ]

3 голосов
/ 14 октября 2019

PyGame не проверяет изображения с прямоугольниками, а сталкивает прямоугольники с прямоугольниками. Таким образом, код должен отслеживать положение изображения, как если бы оно было прямоугольником .

Это довольно просто. Изначально получите прямоугольную форму изображения с .get_rect(), это дает объекту PyGame rect объект. Тогда код должен только перемещаться и сталкиваться с прямоугольником, но также должен обеспечивать, чтобы изображение всегда рисовалось по координатам прямоугольника, чтобы все синхронизировалось.

import pygame,sys
from pygame.locals import *
from random import randint

pygame.init()
ventana=pygame.display.set_mode((1200,600))
pygame.display.set_caption("Jueguiño")

imageVida= pygame.image.load("vida.jpg")
vidaRect = imageVida.get_rect()            # <-- Get the Image's Rectangle
posX= randint(0,1200)
posY= randint(0,0)
vidaRect.center = ( posX, posY )           # <-- Position the Rectangle

rectangulo=pygame.Rect(0,0,100,50)

velocidad=0.5

Blanco=(255,255,255)

while True:
    ventana.fill(Blanco)
    ventana.blit( imageVida, ( vidaRect.x, vidaRect.y ) )  # <-- Draw at the Rectangle
    pygame.draw.rect(ventana,(180,70,70),rectangulo)

    rectangulo.left,rectangulo.top=pygame.mouse.get_pos()

    if rectangulo.colliderect( vidaRect ):  # <-- Collide-test the Rectangle
        velocidad=0
        print("Collision!")

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    if posY<1200:
        posY+=velocidad
    pygame.display.update()

Вероятно, полезно прочитать документацию по PyGame Спрайт Класс . Это полный набор функций для обработки именно такой работы. Сначала это немного сложнее, но потом значительно упрощает последующую работу - например, сталкивающиеся группы спрайтов. Есть многочисленные примеры использования спрайтов в ответах PyGame на SO.

1 голос
/ 14 октября 2019

Не пытайтесь сталкиваться с изображением напрямую. Вместо этого используйте функцию .get_rect(), чтобы получить прямоугольник для изображения, с которым можно проверить наличие столкновений.

Документация Pygame для .get_rect () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...