Проблемы с Pygame Multiple Bullet - PullRequest
0 голосов
/ 13 февраля 2019

Я новичок в сцене Pygame и пытаюсь создать свой первый проект Pygame.Это 2-й платформенный боковой скроллер, и у меня несколько проблем с объектами пули.

  1. Пули движутся только в одном направлении
  2. Экран прокручивается при движении игрока, и пули идутвне экрана и несмотря на наличие функции удаления, пули вновь появляются на экране (в направлении выстрела) через 2/3 минуты.
  3. Движение пули связано с движением игрока, так что когда игрок возвращается назад,все объекты пули также перемещаются назад на одинаковую величину, создавая иллюзию, что они остановились.Будучи недавно новичком, я не совсем уверен, как решить эти проблемы.Любые предложения будут с благодарностью.

import pygame
import math, random, sys, time
from pygame.locals import *
pygame.init()
jump = False
jump_offset = 0
jump_height = 250

k = pygame.key.get_pressed()


#Window Settings
w = 1280
h = 720
half_w = w /2
half_h = h /2
AREA = w*h

#Defining colours
BLACK = (   0,   0,   0)
WHITE = ( 255, 255, 255)

#Initialising the window
display = pygame.display.set_mode((w,h))
pygame.display.set_caption("Platformer") 
Clock = pygame.time.Clock()
FPS = 300

def events():
        for event in pygame.event.get():
                if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
                        pygame.quit()
                        sys.exit()

def do_jumping():
        global jump_height
        global jump
        global jump_offset
        if jump:
                jump_offset += 3

                if jump_offset >= jump_height:
                        jump = False
        elif jump_offset > 0 and jump == False:
                jump_offset -= 3

bg = pygame.image.load("background.png").convert()
bgWidth, bgHeight = bg.get_rect().size

stageWidth = bgWidth*2 
stagePosX = 0 

startScrollPosX = half_w

circleRadius = 25
circlePosX = circleRadius

pPosX = circleRadius
pPosY = 602
pVelX = 0

playersprite = pygame.image.load("playerSprite.png").convert_alpha()
playersprite = pygame.transform.scale(playersprite, (130,130))
bullets = []
bulletSprite = pygame.image.load("Bullet1.png").convert_alpha()
bulletSprite = pygame.transform.scale(bulletSprite, (20,10))
#------------------------MAIN PROGRAM LOOP------------------------#
next_bullet_time = 0
bullet_delay = 300
while True:
    current_time = pygame.time.get_ticks()
    events()
    do_jumping()
    k = pygame.key.get_pressed()
    if k[K_RIGHT]:
        pVelX = 2
    if k[K_LEFT]:
        pVelX = -2
    if k[K_UP] and jump == False and jump_offset == 0:
            jump = True
    if not k[K_RIGHT] and not k[K_LEFT]:
            pVelX = 0
    if k[K_SPACE]:
            if current_time > next_bullet_time:
                    next_bullet_time = current_time + bullet_delay
                    bullets.append([circlePosX+30, pPosY-20 - jump_offset])

    pPosX += pVelX
    if pPosX > stageWidth - circleRadius-25: pPosX = stageWidth - circleRadius-25
    if pPosX < circleRadius+55:pPosX = circleRadius+55
    if pPosX < startScrollPosX: circlePosX = pPosX
    elif pPosX > stageWidth - startScrollPosX: circlePosX = pPosX - stageWidth + w
    else:
        circlePosX = startScrollPosX
        stagePosX += -pVelX

    for b in range(len(bullets)):
            bullets[b][0] += 2

    for bullet in bullets[:]:
            if bullet[0] < 0:
                    bullets.remove(bullet)

    rel_x = stagePosX % bgWidth
    display.blit(bg,(rel_x - bgWidth, 0))
    if rel_x < w:
            display.blit(bg, (rel_x, 0))

    for bullet in bullets:
            display.blit(bulletSprite, pygame.Rect(bullet[0], bullet[1], 0, 0,))

    display.blit(playersprite, (int(circlePosX-80),pPosY-100 - jump_offset))

    pygame.display.update()
    Clock.tick(FPS)
    display.fill(BLACK)

1 Ответ

0 голосов
/ 13 февраля 2019
Экран прокручивается при движении игрока, и пули исчезают с экрана, и, несмотря на наличие функции удаления, пули вновь появляются на экране (в направлении выстрела) через 2/3 минуты.

Это вызвано интегральным переполнением чисел.Пуля никогда не удаляется из списка bullets после того, как пуля покинула экран слева.Координата x пули непрерывно увеличивается до тех пор, пока она не переполнится.Таким образом, значение координаты x переключается с максимально возможного значения на минимально возможное значение.Это приводит к тому, что пуля снова «появляется» в правой части экрана через некоторое время.

Удалите пули из списка bullets после того, как пуля покинула экран:

w = display.get_width()
for b in [b for b in bullets if b[0] < 0 or b[0] > w]:
    bullets.remove(b)
Движение пули связано с движением игрока, так что когда игрок возвращается назад, все объекты пули также перемещаются назад на одинаковую величину, создавая иллюзию, что они остановились.Будучи недавно новичком, я не совсем уверен, как решить эти проблемы.Будем очень благодарны за любые предложения.

Количество прокрутки должно быть компенсировано при перемещении пуль.Обратите внимание на расстояние прокрутки в каждом кадре и добавьте сумму к позиции маркера:

pPosX += pVelX
scroll = 0
if pPosX > stageWidth - circleRadius-25: pPosX = stageWidth - circleRadius-25
if pPosX < circleRadius+55:pPosX = circleRadius+55
if pPosX < startScrollPosX: circlePosX = pPosX
elif pPosX > stageWidth - startScrollPosX: circlePosX = pPosX - stageWidth + w
else:
    circlePosX = startScrollPosX
    stagePosX += -pVelX
    scroll = -pVelX

for b in range(len(bullets)):
    bullets[b][0] += 2 + scroll

Но обратите внимание, скорость игрока, а также прокрутка и скорость пуль равны.Это приводит к тому, что пули останавливаются, если игрок движется вперед, потому что пули и игрок движутся вперед с равной скоростью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...