Боковой скроллер Pygame работает не так, как ожидалось - PullRequest
0 голосов
/ 07 января 2019

Я планирую сделать простую игру с боковым скроллером с использованием pygame, но прокрутка немного сбивает меня с толку. Я свободно следовал руководству YouTube, чтобы помочь мне в этом, но код, который я сделал, работает не так, как ожидалось. Я использую Python 3.6 и использую PyCharm.

Я просмотрел части учебника, который использовал, и все, что у меня есть, соответствует правильно. В учебнике использовался Python 2.7, но я не думаю, что это должно повлиять на него слишком сильно. Я относительно новичок в программировании и Python, поэтому я не могу сказать, что не так

import pygame
from pygame.locals import *

black = (0, 0, 0, 255)
white = (255, 255, 255, 255)

w = 1280
h = 720
hw = w / 2
hh = h / 2

pygame.init()
clock = pygame.time.Clock()
ds = pygame.display.set_mode((w, h))
pygame.display.set_caption("Side Scroller!")
FPS = 500

bg = pygame.image.load("mountains.png").convert()
bg_width, bg_height = bg.get_rect().size

stageWidth = bg_width * 2
stagePosX = 0

startScrollingPosX = hw

circleRadius = 25
circlePosX = circleRadius

playerPosX = circleRadius
playerPosY = 585
PlayerVelocityX = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False

    k = pygame.key.get_pressed()

    if k[K_RIGHT]: 
        playerVelocityX = 1
    elif k[K_LEFT]: 
        playerVelocityX = -1
    else: 
        playerVelocityX = 0

    playerPosX += playerVelocityX

    if playerPosX > stageWidth - circleRadius:
        playerPosX = stageWidth - circleRadius

    if playerPosX < circleRadius: 
        playerPosX = circleRadius
    if playerPosX < startScrollingPosX: 
        circlePosX = playerPosX
    elif playerPosX > stageWidth - startScrollingPosX: 
        circlePosX =  playerPosX - stageWidth + w
    else:
        circlePosX = startScrollingPosX
        stagePosX += -playerVelocityX

    rel_x = stagePosX % bg_width
    ds.blit(bg, (rel_x, 0))
    if rel_x < w:
        ds.blit(bg, (rel_x, 0))

    pygame.draw.circle(ds, white, (circlePosX, playerPosY - 25), 
    circleRadius, 0)

    pygame.display.update()
    clock.tick(FPS)
    ds.fill(black)

Фон должен начать прокручиваться, как только шарик достигнет середины экрана, но вместо этого он падает, когда шарик попадает в середину экрана. Кроме того, фон отображается не полностью, а фон обрезается в направлении y.

1 Ответ

0 голосов
/ 07 января 2019

В будущем вы должны опубликовать то, что терминал сообщает вам, когда он выходит из строя, там много информации.

Traceback (most recent call last):
File "test.py", line 69, in <module>
pygame.draw.circle(ds, white, (circlePosX, playerPosY - 25), circleRadius, 0)
TypeError: integer argument expected, got float

сообщает нам, что в файле "test.py" (как я назвал файл на моем компьютере) есть ошибка в строке 69,

затем показывает строку с ошибкой

pygame.draw.circle(ds, white, (circlePosX, playerPosY - 25), circleRadius, 0)

и что он ожидал целое число, но вместо этого получил число с плавающей запятой.

когда белый шар достигает середины, circlePosX больше не является целым (например, 67), а становится плавающим (например, 44,5).

«Решение» - это:

pygame.draw.circle(ds, white, (int(circlePosX), playerPosY - 25), circleRadius, 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...