Я пытаюсь запрограммировать игру с использованием библиотеки pygame, но по какой-то причине она продолжает выдавать ошибку TypeError: ожидался целочисленный аргумент, получено число с плавающей запятой для следующих строк:
if surface.get_at((player["x"], player["y"] + player["height"])) == (0,0,0,255):
leftOfPlayerOnPlatform = False
if surface.get_at((player["x"] + player["width"], player["y"] + player["height"])) == (0,0,0,255):
rightOfPlayerOnPlatform = False
if leftOfPlayerOnPlatform is False and rightOfPlayerOnPlatform is False and (player["y"] + player["height"]) + player["vy"] < windowHeight:
player["y"] += player["vy"]
Полный код моей проблемы:
import pygame, sys, random
import pygame.locals as GAME_GLOBALS
import pygame.event as GAME_EVENTS
import pygame.time as GAME_TIME
pygame.init()
clock = pygame.time.Clock()
title_image = pygame.image.load("assets/title.jpg")
game_over_image = pygame.image.load("assets/game_over.jpg")
windowWidth = 400
windowHeight = 600
surface = pygame.display.set_mode((windowWidth, windowHeight))
pygame.display.set_caption('Drop!')
leftDown = False
rightDown = False
gameStarted = False
gameEnded = False
gamePlatforms = []
platformSpeed = 3
platformDelay = 2000
lastPlatform = 0
platformsDroppedThrough = -1
dropping = False
gameBeganAt = 0
timer = 0
player = {
"x" : windowWidth / 2,
"y" : 0,
"height" : 25,
"width" : 10,
"vy" : 5
}
def drawPlayer():
pygame.draw.rect(surface, (255,0,0), (player["x"], player["y"],player["width"], player["height"]))
def movePlayer():
global platformsDroppedThrough, dropping
leftOfPlayerOnPlatform = True
rightOfPlayerOnPlatform = True
if surface.get_at((player["x"], player["y"] + player["height"])) == (0,0,0,255):
leftOfPlayerOnPlatform = False
if surface.get_at((player["x"] + player["width"], player["y"] + player["height"])) == (0,0,0,255):
rightOfPlayerOnPlatform = False
if leftOfPlayerOnPlatform is False and rightOfPlayerOnPlatform is False and (player["y"] + player["height"]) + player["vy"] < windowHeight:
player["y"] += player["vy"]
if dropping is False:
dropping = True
platformsDroppedThrough += 1
else :
foundPlatformTop = False
yOffset = 0
dropping = False
while foundPlatformTop is False:
if surface.get_at((player["x"], (player["y"] + player["height"]) - yOffset )) == (0,0,0,255):
player["y"] -= yOffset
foundPlatformTop = True
elif (player["y"] + player["height"]) - yOffset > 0:
yOffset += 1
else :
gameOver()
break
if leftDown is True:
if player["x"] > 0 and player["x"] - 5 > 0:
player["x"] -= 5
elif player["x"] > 0 and player["x"] - 5 < 0:
player["x"] = 0
if rightDown is True:
if player["x"] + player["width"] < windowWidth and (player["x"] + player["width"]) + 5 < windowWidth:
player["x"] += 5
elif player["x"] + player["width"] < windowWidth and (player["x"] + player["width"]) + 5 > windowWidth:
player["x"] = windowWidth - player["width"]
def createPlatform():
global lastPlatform, platformDelay
platformY = windowHeight
gapPosition = random.randint(0, windowWidth - 40)
gamePlatforms.append({"pos" : [0, platformY], "gap" : gapPosition})
lastPlatform = GAME_TIME.get_ticks()
if platformDelay > 800:
platformDelay -= 50
def movePlatforms():
# print("Platforms")
for idx, platform in enumerate(gamePlatforms):
platform["pos"][1] -= platformSpeed
if platform["pos"][1] < -10:
gamePlatforms.pop(idx)
def drawPlatforms():
for platform in gamePlatforms:
pygame.draw.rect(surface, (255,255,255), (platform["pos"][0], platform["pos"][1], windowWidth, 10))
pygame.draw.rect(surface, (0,0,0), (platform["gap"], platform["pos"][1], 40, 10) )
def gameOver():
global gameStarted, gameEnded
platformSpeed = 0
gameStarted = False
gameEnded = True
def restartGame():
global gamePlatforms, player, gameBeganAt, platformsDroppedThrough, platformDelay
gamePlatforms = []
player["x"] = windowWidth / 2
player["y"] = 0
gameBeganAt = GAME_TIME.get_ticks()
platformsDroppedThrough = -1
platformDelay = 2000
def quitGame():
pygame.quit()
sys.exit()
# 'main' loop
while True:
surface.fill((0,0,0))
for event in GAME_EVENTS.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
leftDown = True
if event.key == pygame.K_RIGHT:
rightDown = True
if event.key == pygame.K_ESCAPE:
quitGame()
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
leftDown = False
if event.key == pygame.K_RIGHT:
rightDown = False
if event.key == pygame.K_SPACE:
if gameStarted == False:
restartGame()
gameStarted = True
if event.type == GAME_GLOBALS.QUIT:
quitGame()
if gameStarted is True:
# Play game
timer = GAME_TIME.get_ticks() - gameBeganAt
movePlatforms()
drawPlatforms()
movePlayer()
drawPlayer()
elif gameEnded is True:
# Draw game over screen
surface.blit(game_over_image, (0, 150))
else :
# Welcome Screen
surface.blit(title_image, (0, 150))
if GAME_TIME.get_ticks() - lastPlatform > platformDelay:
createPlatform()
clock.tick(60)
pygame.display.update()
Я использую Тонни для запуска кода. Если бы кто-то мог помочь мне с моей проблемой, я был бы очень признателен.
Пожалуйста, предоставьте Полный, минимальный, проверяемый пример






Вы используете Python 2.7 или 3.x?
Если вы используете 3.x, по умолчанию будет применяться деление с плавающей запятой, поэтому строка
player["x"] = windowWidth / 2
создаст поплавок. PyGame требует, чтобы все координаты были целыми числами. В Python 3.x используйте // для целочисленного деления
player["x"] = windowWidth // 2 # or use
player["x"] = int(windowWidth / 2)
Это вполне может быть то, что подразумевается под TypeError: ожидаемый аргумент целое число, получил плавать, поскольку указанные вами строки действительно будут ссылаться на координаты.
Не все координаты в pygame должны быть целыми числами, например, pygame.Surface.blit также принимает числа с плавающей запятой, но pygame.Surface.get_at, вызывающий здесь ошибку, принимает только кортеж целых чисел в качестве аргумента.
@skrx спасибо, я не знал об этом - я использовал PyGame для забавных проектов, но теперь, как правило, я склонен преобразовывать числа с плавающей запятой в целые числа "по умолчанию"
Я поместил int () вокруг каждого аргумента в вызове функции surface.get_at (). Это решило мою проблему. Я использую Python3 и тот же учебник.
Пример: От (с ошибкой)
if surface.get_at(( player["x"] , player["y"] + player["height"] )) == (0,0,0,255):
leftOfPlayerOnPlatform = False
Кому (без ошибок)
if surface.get_at((int(player["x"]), int(player["y"] + player["height"]))) == (0,0,0,255):
leftOfPlayerOnPlatform = False
Было три случая, когда я менял код.
Как только я это сделал, я смог запустить drop.py из Thonny.
Пожалуйста, прочтите и следуйте инструкциям по публикации в справочной документации, как было предложено при создании этой учетной записи. Здесь применяется Минимальный, полный, проверяемый пример. Мы не сможем эффективно помочь вам, пока вы не опубликуете свой код MCVE и точно не опишете проблему. Мы сможем вставить ваш опубликованный код в текстовый файл и воспроизвести описанную вами проблему.