Функция isCollision в Pygame - PullRequest
       13

Функция isCollision в Pygame

1 голос
/ 25 марта 2020

Я недавно начал программировать в pygame, и мне было интересно, почему не работает моя функция isCollision. Вам на самом деле не нужно запускать код, потому что вам нужно будет загрузить картинки, чтобы он выполнялся. Если вы можете, просто скажите мне, почему функция isCollision не работает. В mainl oop, где для i находится диапазон (num_of_obstacles) l oop, есть оператор if iscollision. Если вы хотите посмотреть, что делает программа, вот все необходимые файлы: Кстати, не переписывайте весь код, пожалуйста. name it rectangle.png(the first image)[![][1]] 2 [enter image description here] 3

Не обращайте внимания на комментарии, потому что они в полисе sh. Вот мой код:

import pygame
import math
import random

#inicjowanie pygame (to trzeba zawsze dać)
pygame.init()

screen = pygame.display.set_mode((800, 600))

pygame.display.set_caption('Kosmiczna Przygoda')

playericon = pygame.image.load('rocket.png')
player2icon = pygame.image.load('rocket.png')

backgroundImg = pygame.image.load('1083.jpg')


num_of_obstacles = 10
obstacleImg = []

obsX = [random.randint(0, 400) for i in range(num_of_obstacles // 2)]
obs2X = [random.randint(400, 800) for i in range(num_of_obstacles // 2)]

for i in obs2X:
    obsX.append(i)

obsY = []

for i in range(num_of_obstacles):
    obstacleImg.append(pygame.image.load('rectangle.png'))


for i in range(num_of_obstacles):
    obsY.append(random.randint(50, 300))

# pierwsze koordynaty
PlayerX, PlayerY = 200, 480
Player2X, Player2Y = 500, 480





PlayerY_change, PlayerX_change = 1, 1
Player2Y_change, Player2X_change = 1, 1



def player(x,y,x2,y2):
    screen.blit(playericon, (x, y))
    screen.blit(player2icon, (x2, y2))


winFont = pygame.font.Font('freesansbold.ttf', 64)
won1, won2 = False, False

def player1Wins():
    win_text = winFont.render('PLAYER 1 WON!',True,(255,255,255))
    screen.blit(win_text,(30,30))


def player2Wins():
    win_text = winFont.render('PLAYER 2 WON!',True,(255,255,255))
    screen.blit(win_text,(150,30))

# wzór matematyczny na odległość koordynatów dwóch punktów (sprawdzabnie czy się dotykają)
def isCollision(obsX,obsY,pX,pY):
    distance = math.sqrt(math.pow(obsX - pX, 2) + math.pow(obsY - pY, 2))
    if distance >= 27:
        return True
    else:
        return False

running = True
won = False

while running:
    # tło (blit to rysowanie)
    screen.blit(backgroundImg, (0, 0))


    # event to wydarzenie zarejestrowane przez program
    # jeżeli klikne krzyzyk w prawym gornym rogu to program sie zamknie
    # jeżeli nacisne np strzalke w prawo to rakieta przesuwa się na ukos w prawo

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_a:
                PlayerX_change = -1
            if event.key == pygame.K_d:
                PlayerX_change = 1
            if event.key == pygame.K_LEFT:
                Player2X_change = -1
            if event.key == pygame.K_RIGHT:
                Player2X_change = 1
            if event.key == pygame.K_w:
                PlayerY_change = 2
            if event.key == pygame.K_UP:
                Player2Y_change = 2
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                PlayerY2_change = 0.75
            if event.key == pygame.K_w:
                PlayerY_change = 0.75

    for enemy in range(num_of_obstacles):
        if won:
            screen.blit(obstacleImg[enemy], (2000, 2000))
        else:
            #if isCollision(obsX[enemy], obsY[enemy],PlayerX,PlayerY):
                #player2Wins()


            screen.blit(obstacleImg[enemy], (obsX[enemy], obsY[enemy]))

    # Granice Ekranu
    if PlayerX <= 0:
        PlayerX = 0
    elif PlayerX >= 736:
        PlayerX = 736
    if PlayerY <= 0:
        won, won1 = True, True
        PlayerY, Player2Y = 480, 480
        PlayerX, Player2X = 200, 500

    if Player2X <= 0:
        Player2X = 0
    elif Player2X >= 736:
        Player2X = 736
    if Player2Y <= 0:
        won, won2 = True, True
        PlayerY, Player2Y = 480, 480
        PlayerX, Player2X = 200, 500

    if won1:
        player1Wins()
        PlayerX_change, PlayerY_change = 0, 0
        Player2X_change, Player2Y_change = 0, 0
    if won2:
        player2Wins()
        PlayerX_change, PlayerY_change = 0, 0
        Player2X_change, Player2Y_change = 0, 0

    # Zmiana kordynatów rakiety

    PlayerX += PlayerX_change
    PlayerY -= PlayerY_change
    Player2X += Player2X_change
    Player2Y -= Player2Y_change

    player(PlayerX, PlayerY, Player2X, Player2Y)
    pygame.display.update()

1 Ответ

2 голосов
/ 25 марта 2020

Если вы проверяете, является ли расстояние <= 27, а не >= 27?

def isCollision(obsX, obsY, pX, pY):
    distance = math.sqrt(math.pow(obsX - pX, 2) + math.pow(obsY - pY, 2))
    return distance <= 27
...