파이 게임의 마스크 충돌 감지 문제

벤 도버

pygame rn으로 소행성 스타일의 게임을 만들고 있지만 마스크 충돌을 작동 시키려고 할 때 문제가 발생했습니다. 충돌 여부를 확인하기 위해 충돌이 감지 될 때마다 "hit"을 출력하는 기능을 사용했습니다. 문제는 프로그램을 실행했을 때 인쇄가 멈추지 않고 인쇄되기 시작했다는 것입니다. 그래서 어떻게 든 배경이 가면이나 무언가가되었다고 생각합니까? Dunno 정말, 나는 전에 충돌 작업을 한 적이 없습니다. 우주선이 소행성과 충돌 할 때 게임이 종료되기를 원합니다.

어쨌든 여기에 내 코드가 있습니다.


import pygame
from math import sin, cos, pi

from random import randint

scr_width = 800
scr_height = 600
window = pygame.display.set_mode((scr_width, scr_height))
pygame.display.set_caption("Asteroids")
clock = pygame.time.Clock()
space_img = pygame.image.load("sprites/space.jpg")
red = (255, 0, 0)

class Ship:
    def __init__(self, x, y):

        self.x = x
        self.y = y
        self.width = 0
        self.vel = 0
        self.vel_max = 12
        self.angle = 0
        self.hitbox = (self.x, self.y, 10, 10)
        self.ship_img = pygame.image.load("sprites/ship_off.png")
        self.ship_img_copy = pygame.transform.rotate(self.ship_img, self.angle)
# collision stuff
        self.rect = self.ship_img_copy.get_rect()

    def draw(self):
        self.ship_img = pygame.image.load("sprites/ship_off.png")
        self.ship_img_copy = pygame.transform.rotate(self.ship_img, self.angle)

        window.blit(self.ship_img_copy,
                    (self.x - (self.ship_img_copy.get_width()) / 2, self.y - (self.ship_img_copy.get_height()) / 2))

        keys = pygame.key.get_pressed()

        if keys[pygame.K_w]:
            self.ship_img = pygame.image.load("sprites/ship_on.png")
            self.ship_img_copy = pygame.transform.rotate(self.ship_img, self.angle)
            window.blit(self.ship_img_copy,
                        (self.x - (self.ship_img_copy.get_width()) / 2, self.y - (self.ship_img_copy.get_height()) / 2))
# collision stuff
        self.mask = pygame.mask.from_surface(self.ship_img_copy)

    def move(self):
        keys = pygame.key.get_pressed()
        # todo acceleration and thrust mechanics
        if keys[pygame.K_w]:
            self.vel = min(self.vel + 1, self.vel_max)
        elif self.vel > 0:
            self.vel = self.vel - 0.4
        if keys[pygame.K_a]:
            self.angle += 7

        if keys[pygame.K_d]:
            self.angle -= 7

        self.x += self.vel * cos(self.angle * (pi / 180) + (90 * pi / 180))
        self.y -= self.vel * sin(self.angle * (pi / 180) + 90 * (pi / 180))
        if self.y < 0:
            self.y = (self.y - self.vel) % 600

        elif self.y > 600:
            self.y = (self.y + self.vel) % 600

        elif self.x < 0:
            self.x = (self.x - self.vel) % 800

        elif self.x > 800:
            self.x = (self.x + self.vel) % 800


class Asteroid:

    def __init__(self):

        self.ang_change = randint(1, 5)
        self.ang = randint(0, 90) * (pi / 180)
        y_values = [1, 599]
        self.sx = randint(0, 800)
        self.sy = y_values[randint(0, 1)]
        
        if self.sy == y_values[0]:
            self.neg = -1
        else:
            self.neg = 1
        self.speed = randint(5, 10)
        self.ang += self.ang_change
        self.asteroid_angle = randint(0, 80)
        self.asteroid_img = pygame.image.load("sprites/asteroid.png")
        self.asteroid_copy = pygame.transform.rotate(self.asteroid_img, self.ang)


    def generate(self):
        self.ang += self.ang_change
        self.asteroid_img = pygame.image.load("sprites/asteroid.png")
        self.asteroid_copy = pygame.transform.rotate(self.asteroid_img, self.ang)

        window.blit(self.asteroid_copy,
                    (self.sx - (self.asteroid_copy.get_width()) / 2, self.sy - (self.asteroid_copy.get_height()) / 2))
# collision stuff
        self.mask = pygame.mask.from_surface(self.asteroid_copy)
        self.rect = self.asteroid_copy.get_rect()


class Projectiles:

    def __init__(self, x, y, angle):
        self.x = x
        self.y = y
        self.angle = angle
        self.vel = 20

    def draw(self):
        pygame.draw.rect(window, (255, 0, 0), (self.x, self.y, 5, 5))


def redraw():
    window.blit(space_img, (0, 0))
    ship.draw()
    for asteroid in asteroids:
        asteroid.generate()
    for bullet in bullets:
        bullet.draw()

    pygame.display.update()

# collision stuff
def collisions():
    collision = pygame.sprite.spritecollide(ship, asteroids, False)
    for i in collision:
        print("hit")



run = True
ship = Ship(400, 300)
next_fire = pygame.time.get_ticks() + 400
bullets = []
asteroids = []

while run:
    clock.tick(60)
    keys = pygame.key.get_pressed()
    pygame.time.delay(35)
    # collision stuff
    collisions()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    if keys[pygame.K_SPACE]:
        if len(bullets) < 11 and pygame.time.get_ticks() >= next_fire:
            bullets.append(
                Projectiles(round(ship.x + ship.width - 6.5 // 2), round(ship.y + ship.width - 6.5 // 2), ship.angle))
            next_fire = pygame.time.get_ticks() + 400

    for bullet in bullets:
        if 800 > bullet.x > 0 and 600 > bullet.y > 0:
            bullet.x += bullet.vel * cos(bullet.angle * (pi / 180) + 90 * (pi / 180))
            bullet.y -= bullet.vel * sin(bullet.angle * (pi / 180) + 90 * (pi / 180))
        else:
            bullets.pop(bullets.index(bullet))
    
    if len(asteroids) < 5:
        asteroids.append(Asteroid())

    for asteroid in asteroids:
        if 800 > asteroid.sx > 0 and 600 > asteroid.sy > 0:
            asteroid.sx += asteroid.speed * cos(asteroid.asteroid_angle * (pi / 180) + 90 * (pi / 180))
            asteroid.sy -= asteroid.speed * sin(asteroid.asteroid_angle * (pi / 180) + 90 * (pi / 180)) * asteroid.neg
            if asteroid.sx < 0:
                asteroid.sx = (asteroid.sx - asteroid.speed) % 800

            elif asteroid.sx > 800:
                asteroid.sx = (asteroid.sx + asteroid.speed) % 800

        else:
            asteroids.pop(asteroids.index(asteroid))

    window.fill((0, 0, 0))
    ship.move()
    redraw()

pygame.quit()

Mike67

충돌 감지는 self.rect를 히트 박스로 사용합니다. self.rect는 스프라이트를 블릿 한 위치와 일치해야합니다. 몇 가지 변경 사항으로 코드를 수정할 수 있습니다.

선박 등급 (그리기)에서 :

# collision stuff
        self.mask = pygame.mask.from_surface(self.ship_img_copy)
        self.rect =  pygame.Rect(self.x - (self.ship_img_copy.get_width()) / 2, self.y - (self.ship_img_copy.get_height()) / 2,
                self.ship_img_copy.get_width(),self.ship_img_copy.get_height())

Asteroid 클래스 (생성)에서 :

# collision stuff
        self.mask = pygame.mask.from_surface(self.asteroid_copy)
        #self.rect = self.asteroid_copy.get_rect()
        self.rect =  pygame.Rect(self.sx - (self.asteroid_copy.get_width()) / 2, self.sy - (self.asteroid_copy.get_height()) / 2,
                self.asteroid_copy.get_width(),self.asteroid_copy.get_height())

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

파이 게임 충돌 감지 실패

분류에서Dev

파이 게임 충돌 감지

분류에서Dev

파이 게임에서 충돌 감지

분류에서Dev

간단한 2D 플랫 포머 용 파이 게임의 충돌 감지 문제

분류에서Dev

파이 게임에서 충돌 감지가 제대로 작동하지 않음

분류에서Dev

파이 게임 스프라이트가 충돌을 감지하지 못함

분류에서Dev

파이 게임과의 충돌 지점 감지

분류에서Dev

파이 게임의 이미지 충돌

분류에서Dev

파이 게임을 사용하여 두 스프라이트의 충돌을 어떻게 감지합니까?

분류에서Dev

파이 게임 충돌 문제

분류에서Dev

파이 게임의 초기 충돌 감지

분류에서Dev

벽과의 파이 게임 충돌 감지

분류에서Dev

(파이 게임) 마우스 오버 감지 문제

분류에서Dev

파이 게임 .Rect가 마우스와 "충돌"하지 않음

분류에서Dev

충돌 감지 후 움직임이 멈춤-파이 게임

분류에서Dev

뱀이 스스로 충돌하는 문제 (뱀 게임)

분류에서Dev

충돌 감지를 허용하기 위해 JavaScript 게임의 if 문이 원하는대로 작동하지 않음

분류에서Dev

파이 게임의 충돌 감지가 작동하지 않습니다.

분류에서Dev

파이 게임에서 색상 충돌 감지

분류에서Dev

파이 게임, 회전하는 직사각형의 충돌 감지

분류에서Dev

충돌 감지 문제

분류에서Dev

충돌 감지는 잘 작동하지만 여러 충돌이 발생하기 때문에 점수가 급등합니다. (파이 게임)

분류에서Dev

자바 스크립트 게임 충돌 감지

분류에서Dev

자바 스크립트 게임에서 충돌 감지

분류에서Dev

파이 게임에서 Sprite 클래스의 일부인 두 표면 객체 간의 충돌을 어떻게 감지합니까?

분류에서Dev

파이 게임 충돌 체크 버그

분류에서Dev

Python 스프라이트 충돌 감지

분류에서Dev

파이 게임 : 두 이미지의 충돌

분류에서Dev

파이 게임 문제 : 충돌 조건부 실행 방법?

Related 관련 기사

  1. 1

    파이 게임 충돌 감지 실패

  2. 2

    파이 게임 충돌 감지

  3. 3

    파이 게임에서 충돌 감지

  4. 4

    간단한 2D 플랫 포머 용 파이 게임의 충돌 감지 문제

  5. 5

    파이 게임에서 충돌 감지가 제대로 작동하지 않음

  6. 6

    파이 게임 스프라이트가 충돌을 감지하지 못함

  7. 7

    파이 게임과의 충돌 지점 감지

  8. 8

    파이 게임의 이미지 충돌

  9. 9

    파이 게임을 사용하여 두 스프라이트의 충돌을 어떻게 감지합니까?

  10. 10

    파이 게임 충돌 문제

  11. 11

    파이 게임의 초기 충돌 감지

  12. 12

    벽과의 파이 게임 충돌 감지

  13. 13

    (파이 게임) 마우스 오버 감지 문제

  14. 14

    파이 게임 .Rect가 마우스와 "충돌"하지 않음

  15. 15

    충돌 감지 후 움직임이 멈춤-파이 게임

  16. 16

    뱀이 스스로 충돌하는 문제 (뱀 게임)

  17. 17

    충돌 감지를 허용하기 위해 JavaScript 게임의 if 문이 원하는대로 작동하지 않음

  18. 18

    파이 게임의 충돌 감지가 작동하지 않습니다.

  19. 19

    파이 게임에서 색상 충돌 감지

  20. 20

    파이 게임, 회전하는 직사각형의 충돌 감지

  21. 21

    충돌 감지 문제

  22. 22

    충돌 감지는 잘 작동하지만 여러 충돌이 발생하기 때문에 점수가 급등합니다. (파이 게임)

  23. 23

    자바 스크립트 게임 충돌 감지

  24. 24

    자바 스크립트 게임에서 충돌 감지

  25. 25

    파이 게임에서 Sprite 클래스의 일부인 두 표면 객체 간의 충돌을 어떻게 감지합니까?

  26. 26

    파이 게임 충돌 체크 버그

  27. 27

    Python 스프라이트 충돌 감지

  28. 28

    파이 게임 : 두 이미지의 충돌

  29. 29

    파이 게임 문제 : 충돌 조건부 실행 방법?

뜨겁다태그

보관