Использование функции закрывает окно Pygame - PullRequest
2 голосов
/ 01 марта 2020

Ниже приведен класс String. Использование функции draw из этого класса в моем главном l oop немедленно закрывает игру без ошибок, и пока я ее не включаю, игра работает нормально. Это выдает мне следующее предупреждение:

Warning (from warnings module):
  File "C:\Users\rahul\OneDrive\Documents\A level python codes\shootingGame.py", line 44
    D.blit(self.player, (self.pos[0], self.pos[1]))
DeprecationWarning: an integer is required (got type float).  Implicit conversion to integers using __int__ is deprecated, and may be removed in a future version of Python.

import math, sys, os, pygame
from pygame.locals import *

pygame.init()

win = pygame.display
D = win.set_mode((1200, 600))

class String:
    def __init__(self, x, y):
        self.pos = [x, y]
        self.dx = 0
        self.dy = 0
        self.string = pygame.Surface((1, 1)).convert_alpha()
        self.string.fill((0, 255, 0))

    def draw(self):
        angle = pygame.transform.rotate(self.string, (player.orbital_angle))
        length = math.hypot(self.dx, self.dy)
        self.string = pygame.Surface((3, length))
        D.blit(angle, (self.pos[0], self.pos[1]))

string = String(600, 300)
While True:
    string.draw()

У меня изначально было все в функции draw в разных rnet функциях, но во время отладки он немного запутался. последние две строки в draw(), которые вызывают окно к sh т.е.

self.string = pygame.Surface((3, length))
D.blit(angle, (self.pos[0], self.pos[1]))

1 Ответ

2 голосов
/ 01 марта 2020

Аргумент позиции ( dest ) для pygame.Surface.blit() должен быть кортежем из 2 целых чисел.
В вашем случае self.pos[0] и / или self.pos[1] кажется числом с плавающей точкой.

Вы можете избавиться от предупреждения, округлив координаты с плавающей точкой до целых координат (round):

D.blit(self.player, (round(self.pos[0]), round(self.pos[1])))

Кроме того, вы создали Поверхность с целой длиной, и вам нужно повернуть поверхность после того, как она (ре) создана:

class String:
    # [...]

    def draw(self):

        # compute INTEGRAL length        
        length = math.hypot(self.dx, self.dy)
        length = max(1, int(length))

        # create surface
        self.string = pygame.Surface((1, length)).convert_alpha()
        self.string.fill((0, 255, 0))

        # roatet surface
        angle = pygame.transform.rotate(self.string, player.orbital_angle)

        # blit rotated surface
        D.blit(angle, (round(self.pos[0]), round(self.pos[1])))
...