Я пытался сделать игру в PyGame, и детектор столкновений не работает - PullRequest
1 голос
/ 01 июля 2019

Я пытался изучить основы PyGame, поэтому я пытался сделать очень простую игру. Игра (должна) состоять из красного квадрата, который перемещается и проигрывает, если попадает в один из синих квадратов, падающих с неба. Все работает правильно, кроме детектора столкновений, который ничего не обнаруживает. Может кто-нибудь мне помочь? Вот код:

import pygame as pg
import sys
import random as rd

pg.init()

winWidth = 850
winHeight = 600
red = (255, 0, 0)
blue = (0, 0, 255)
speed = 10
player_pos = [int(winWidth/2-25), winHeight-100]
enemyList = []

clock = pg.time.Clock()
win = pg.display.set_mode((winWidth, winHeight))
pg.display.set_caption('Game')

# creates the position of the enemy and returns it
def createEnemy():
    enemy = [rd.randrange(0, winWidth-50, 50), 0]
    return enemy

# draws an enemy in the position received
def drawEnemy(enemy_pos):
    pg.draw.rect(win, blue, (enemy_pos[0], enemy_pos[1], 50, 50))

# if the enemy is inside the screen, it is moved downwards.
# else, it is deleted from the list.
def updateEnemy(enemy_pos):
    if 0 <= enemy_pos[1] < winHeight:
        enemy_pos[1] += speed
    else:
        enemyList.remove(enemy_pos)

# detects collisions
def collisionDetector(enemy):
    if enemy[0] == player_pos[0] and enemy[1] >= player_pos[1] + 50 >= enemy[1] + 50:
        return True
    elif enemy[0] == player_pos[0] and enemy[1] >= player_pos[1] >= enemy[1] + 50:
        return True
    return False


while True:
    # keeps 10 enemies on screen always
    while len(enemyList) < 11:
        enemyList.append(createEnemy())

    # moves the player
    for event in pg.event.get():
        if event.type == pg.QUIT:
            sys.exit()
        if event.type == pg.KEYDOWN:
            if event.key == pg.K_LEFT:
                player_pos[0] -= 50
            elif event.key == pg.K_RIGHT:
                player_pos[0] += 50

    for enemy_pos in enemyList:
        updateEnemy(enemy_pos)

    for enemy in enemyList:
        if collisionDetector(enemy):
            sys.exit()

    win.fill((0, 0, 0))

    pg.draw.rect(win, red, (player_pos[0], player_pos[1], 50, 50))
    for enemy_pos in enemyList:
        drawEnemy(enemy_pos)

    clock.tick(30)
    pg.display.update()

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Я рекомендую использовать pygame.Rect объекты и .colliderect() для проверки столкновения с прямоугольниками:

# detects collisions
def collisionDetector(enemy):
    playerRect = pg.Rect(*player_pos, 50, 50)
    enemyRect = pg.Rect(*enemy, 50, 50)
    return playerRect.colliderect(enemyRect)
1 голос
/ 01 июля 2019

Перепроверьте свои условия обнаружения столкновений. Это сработало, но нуждается в тонкой настройке.

if enemy[0] == player_pos[0] and enemy[1] <= player_pos[1] + 50 <= enemy[1] + 50:
    return True
elif enemy[0] == player_pos[0] and enemy[1] <= player_pos[1] <= enemy[1] + 50:
    return True
return False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...