сбой события с pygame

Я работаю над простым проектом pygame, и в настоящее время в нем падают бомбы, которые падают из верхней части экрана и направляются в нижнюю часть экрана. Если игрок попадает в бомбу, он умирает. До сих пор все работает хорошо. Проблема в том, что когда бомба миновала игрока, но еще не покинула экран, она все равно убьет игрока. Это означает, что бомба минует нижнюю часть игрока, но если вы пересечете ее, прежде чем она пересечет нижнюю часть экрана, вы умрете. Он мой код:

   if player.rect.y < thing_starty + thing_height:
        if player.rect.x > thing_startx and player.rect.x < thing_startx + thing_width or player.rect.x  + 28 > thing_startx and player.rect.x  + 28 < thing_startx + thing_width: 
            gameOver = True

значения следующие:

thing_startx = random.randrange(0, S_WIDTH)
thing_starty = -300
thing_speed = 3
thing_width = 128
thing_height = 128

значение player.rect.x колеблется от 120 до 500 в зависимости от того, где находится игрок на экране. (Экран также будет прокручиваться слева направо по мере вашего движения.) Число 28 зависит от ширины изображения персонажа.

код падающего объекта следующий:

if thing_starty > S_HEIGHT:
        pygame.mixer.Sound.play(bomb_sound)
        thing_starty = 0 - thing_height
        thing_startx = random.randrange(0, S_WIDTH)
        dodged += 1
        thing_speed += .5

Я работал над этим около недели и не добился прогресса. Спасибо за любую помощь.


person ravenUSMC    schedule 01.11.2016    source источник
comment
pygame имеет pygame.Rect () для сохранения положения и размера объекта, и one_rect.colliderect (other_rect), чтобы проверить столкновение.   -  person furas    schedule 01.11.2016


Ответы (2)


Как уже сказал Нил, вы просто проверяете, не превышает ли значение y значение y игрока.

Но мой совет: прекратите использовать такой код:

 if player.rect.y < thing_starty + thing_height:
    if player.rect.x > thing_startx and player.rect.x < thing_startx + thing_width or player.rect.x  + 28 > thing_startx and player.rect.x  + 28 < thing_startx + thing_width: 
        gameOver = True

и просмотрите документацию для класса Rect, чтобы найти множество удобных функций , например colliderect.

Используйте Rect, чтобы обозначить положение вашей бомбы * (как вы для player), и вы можете использовать такой код:

if player.rect.colliderect(thing.rect):
    gameOVer = True

* который, вероятно, должен иметь собственный класс, унаследованный от Sprite, но это уже другая тема

person sloth    schedule 02.11.2016

Я не знаю python, но ясно, что ваше условное выражение, которое вы используете для проверки на столкновение, просто проверяет, больше ли значение y, чем значение y игрока, что, конечно, будет истинным даже после того, как оно пройдет внизу экрана. Итак, вам где-то нужен операнд AND.

псевдокод (потому что я не знаю python ... или что-то еще, что вы используете)

if (bomb.y >= player.y AND bomb.y <= player.y + player.height){
    run bomb hits player logic
}

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

псевдокод

if (bomb.y >= player.y){
    if (bomb.y <= player.y + player.height){
        run bomb collision logic
    }
 }

таким образом, логика столкновения не запускается, если бомба находится ниже экрана игрока / вне экрана. Конечно, он также должен пройти тест на положение x, но, похоже, вы уже разобрались с этим.

person Neal Davis    schedule 01.11.2016