2015-03-21 4 views
0

У меня есть игра, в которой пользователь может перемещать игрока («mrhinckleberg») с помощью клавиш со стрелками. Есть также два «врага», которые автоматически отскакивают вверх и вниз.Проблема обнаружения столкновений в pygame

Как я могу обнаружить столкновение между игроком и врагом?

Вот мой код, который я до сих пор:

import pygame 
import time 
pygame.init() 
window = pygame.display.set_mode((800,800)) 
pygame.display.set_caption("Yues") 
theboard = pygame.image.load('theboard.png') 
enemy = pygame.image.load('mrenemy.png') 
mrhinckleberg = pygame.image.load('MrHinckleBerg.png') 
mrhincklebergdead = pygame.image.load('MrHinckleBergdead.png') 
deathscreen = pygame.image.load('deathscreen.png') 
black = (0,0,0) 
clock1 = pygame.time.Clock() 
def quitt(): 
    pygame.quit() 
    quit() 
playerx = 750 
playery = 450 
enemydirection = 'down' 
enemyx = 500 
enemyy = 50 
enemyspeed = 100 
enemydirection2 = 'up' 
enemyx2 = 350 
enemyy2 = 750 
enemyspeed2 = 50 
enemydirection3 = 'down' 
enemyx3 = 200 
enemyy3 = 50 
enemyspeed3 = 150 


while True: 
    window.blit(theboard, (0,0)) 
    if enemydirection == 'down': 
     enemyy += enemyspeed 
     if enemyy >= 790: 
      enemydirection = 'up' 
    elif enemydirection == 'up': 
     enemyy -= enemyspeed 
     if enemyy <= 10: 
      enemydirection = 'down' 


    if enemydirection2 == 'up': 
     enemyy2 -= enemyspeed2 
     if enemyy2 <= 10: 
      enemydirection2 = 'down' 
    elif enemydirection2 == 'down': 
     enemyy2 += enemyspeed2 
     if enemyy2 >= 790: 
      enemydirection2 = 'up' 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      quitt() 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_RIGHT: 
       playerx += 12 
      elif event.key == pygame.K_LEFT: 
       playerx -= 12 
      elif event.key == pygame.K_UP: 
       playery -= 12 
      elif event.key == pygame.K_DOWN: 
       playery += 12 
    if playerx == enemyx and playery == enemyy: 
      print("hai") 
    window.blit(theboard, (0,0)) 
    window.blit(mrhinckleberg, (playerx,playery)) 
    window.blit(enemy, (enemyx,enemyy)) 
    window.blit(enemy, (enemyx2,enemyy2)) 
    window.blit(enemy, (enemyx3,enemyy3)) 
    pygame.display.update() 
+0

Этот код действительно должен быть более организованным. И вы должны использовать прямоугольники, а не пучок отдельных переменных. И ваше движение будет очень изменчивым. И вы не указали проблему. У этого списка нет конца. –

+0

Я не могу понять, как это сделать, когда два изображения имеют одинаковые x и y, они что-то делают. Я знаю, что он не организован хорошо и не так, но я новичок в pygame. @MalikBrahimi –

+0

Используйте прямоугольники Pygame, у них есть встроенные методы для столкновения и перекрытия. –

ответ

0

В моей opionion проблема заключается в том, что вы проверяете, например, если переменная playerxравно к enemyx, но это никогда не будет верно, так как вы меняете переменная enemyx только в определенных интервалах (добавьте или вычтите 12).

Чтобы избежать этого вы можете проверить, если playerx/playery и enemyx/enemyy в ** определенный диапазон **:

if (playerx <= enemyx <= playerx + playerWidth) and \ 
    (playery <= enemyy <= playery + playerHeight): 
     print("hai") 

Обратите внимание, что в сравнениях Python может быть прикован. Это означает, что 5 < x <= 10 эквивалентен 5 < x and x <= 10. Для получения дополнительной информации см. Built-in Types -> Comparisons.


Обновленный код:

import pygame 
import time 
pygame.init() 

window = pygame.display.set_mode((800,800)) 
pygame.display.set_caption("Yues") 

theboard = pygame.image.load('theboard.png') 

enemy = pygame.image.load('mrenemy.png') 

mrhinckleberg = pygame.image.load('MrHinckleBerg.png') 
mrhincklebergdead = pygame.image.load('MrHinckleBergdead.png') 

deathscreen = pygame.image.load('deathscreen.png') 

playerWidth = mrhinckleberg.get_rect().width 
playerHeight = mrhinckleberg.get_rect().height 

black = (0,0,0) 

clock1 = pygame.time.Clock() 
def quitt(): 
    pygame.quit() 
    quit() 

playerx = 750 
playery = 450 

enemydirection = 'down' 
enemyx = 500 
enemyy = 50 
enemyspeed = 3 

enemydirection2 = 'up' 
enemyx2 = 350 
enemyy2 = 750 
enemyspeed2 = 2 

enemydirection3 = 'down' 
enemyx3 = 200 
enemyy3 = 50 
enemyspeed3 = 1 


while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      quitt() 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_RIGHT: 
       playerx += 12 
      elif event.key == pygame.K_LEFT: 
       playerx -= 12 
      elif event.key == pygame.K_UP: 
       playery -= 12 
      elif event.key == pygame.K_DOWN: 
       playery += 12 

    if enemydirection == 'down': 
     enemyy += enemyspeed 
     if enemyy >= 790: 
      enemydirection = 'up' 
    elif enemydirection == 'up': 
     enemyy -= enemyspeed 
     if enemyy <= 10: 
      enemydirection = 'down' 

    if enemydirection2 == 'up': 
     enemyy2 -= enemyspeed2 
     if enemyy2 <= 10: 
      enemydirection2 = 'down' 
    elif enemydirection2 == 'down': 
     enemyy2 += enemyspeed2 
     if enemyy2 >= 790: 
      enemydirection2 = 'up' 

    if (playerx <= enemyx <= playerx + playerWidth) and (playery <= enemyy <= playery + playerHeight): 
     print("hai") 

    window.blit(theboard, (0,0)) 

    window.blit(mrhinckleberg, (playerx,playery)) 

    window.blit(enemy, (enemyx,enemyy)) 
    window.blit(enemy, (enemyx2,enemyy2)) 
    window.blit(enemy, (enemyx3,enemyy3)) 

    pygame.display.update() 

Я надеюсь, что это помогает :)

+0

Где я могу получить playerWidth и PlayerHeight? –

+0

@SilverFire: 'mrhinckleberg.get_rect(). Width' или' mrhinckleberg.get_rect(). Height' :) – elegent

+0

Где бы я разместил tht, и возвращает ли это ширину, которая идет на место playerWidth? Im confused –

Смежные вопросы