Код: Выделить всё
File "C:\Users\XXXXXX\PycharmProjects\pythonProject\main.py", line 74, in update
if not self.rect.colliderect(self.rect, rect):
TypeError: Invalid rect, all 4 fields must be numeric
Я также поискал в Интернете если у кого-то еще была подобная проблема, и я не смог никого найти.
код должен выполнять obj.rect.colliderect(rect1, rect2)
код: (не весь мой код, я просто добавил)
Код: Выделить всё
import os
import sys
import pygame as pg
import pygame.math
CAPTION = "Delta Time"
SCREEN_SIZE = (896, 504)
TRANSPARENT = (0, 0, 0, 0)
BACKGROUND_COLOR = pg.Color("darkslategrey")
class Player(object):
"""This class will represent our user controlled character."""
SIZE = (100, 100)
def __init__(self, pos, speed):
"""
Aside from setting up our image and rect as seen previously,
in this example we create a new variable called true_pos.
Rects can only hold integers, so in order to preserve fractional
changes we need this new variable to hold the exact float position.
Without it, a body that moved slower than 1 pixel per frame would
never move.
"""
self.image = self.make_image()
self.rect = self.image.get_rect(center=pos)
self.center = list(self.rect.center)
self.vector = pg.math.Vector2(0, 0)
self.vector.x = self.center[0]
self.vector.y = self.center[1]
self.speed = speed # Speed in pixels per second.
self.w_pressed = 0
self.a_pressed = 0
self.s_pressed = 0
self.d_pressed = 0
def make_image(self):
"""
Create player image. No differences from previous.
"""
image = pg.Surface(Player.SIZE).convert_alpha()
image.fill(TRANSPARENT)
rect = image.get_rect()
pg.draw.ellipse(image, pg.Color("black"), rect)
pg.draw.ellipse(image, pg.Color("tomato"), rect.inflate(-12, -12))
return image
def update(self, keys, screen_rect, dt, rect):
"""
Update must accept a new argument dt (time delta between frames).
Adjustments to position must be multiplied by this delta.
"""
# movement by getting the value of the direction
if keys[pg.K_a] or keys[pg.K_d]:
if keys[pg.K_a] or keys[pg.K_d]:
if keys[pg.K_a]:
self.a_pressed = 1
else:
self.a_pressed = 0
if keys[pg.K_d]:
self.d_pressed = 1
else:
self.d_pressed = 0
self.vector.x = self.d_pressed - self.a_pressed
else:
self.vector.x = 0
else:
self.vector.x = 0
self.vector.y = 0
# prevents error from normalizing 0,0
if self.vector.x > 0 or self.vector.x < 0 or self.vector.y > 0 or self.vector.y < 0:
self.vector = self.vector.normalize()
# move the player
if not self.rect.colliderect(self.rect, rect):
self.vector.y = 1
self.rect.x += self.vector.x * self.speed * dt
self.rect.y += self.vector.y * self.speed * dt
self.clamp(screen_rect)
def clamp(self, screen_rect):
"""
Clamp the rect to the screen if needed and reset true_pos to the
rect position so they don't lose sync.
"""
if not screen_rect.contains(self.rect):
self.rect.clamp_ip(screen_rect)
self.true_pos = list(self.rect.center)
def draw(self, surface):
"""
Basic draw function.
"""
surface.blit(self.image, self.rect)
import pygame as pg
class Wall(object):
def __init__(self, pos, size):
self.size = size
self.image = self.make_image()
self.rect = self.image.get_rect(center=pos)
def make_image(self):
image = pg.Surface(self.size).convert_alpha()
image.fill(pg.Color("red"))
rect = image.get_rect()
pg.draw.rect(image, pg.Color("black"), rect)
return image
def draw(self, surface):
surface.blit(self.image, self.rect)
class App(object):
"""
Class responsible for program control flow.
"""
def __init__(self):
self.screen = pg.display.get_surface()
self.screen_rect = self.screen.get_rect()
self.clock = pg.time.Clock()
self.fps = 120
self.done = False
self.keys = pg.key.get_pressed()
self.player = Player(self.screen_rect.center, 300)
self.wall = Wall((0, 500), (1800, 100))
def event_loop(self):
"""
Basic event loop.
"""
for event in pg.event.get():
if event.type == pg.QUIT:
self.done = True
elif event.type in (pg.KEYDOWN, pg.KEYUP):
self.keys = pg.key.get_pressed()
def update(self, dt):
"""
Update must acccept and pass dt to all elements that need to update.
"""
self.player.update(self.keys, self.screen_rect, dt, self.wall.rect)
def render(self):
"""
Render all needed elements and update the display.
"""
self.screen.fill(BACKGROUND_COLOR)
self.player.draw(self.screen)
self.wall.draw(self.screen)
pg.display.update()
def main_loop(self):
"""
We now use the return value of the call to self.clock.tick to
get the time delta between frames.
"""
dt = 0
self.clock.tick(self.fps)
while not self.done:
self.event_loop()
self.update(dt)
self.render()
dt = self.clock.tick(self.fps) / 1000.0
def main():
"""
Initialize; create an App; and start the main loop.
"""
os.environ['SDL_VIDEO_CENTERED'] = '1'
pg.init()
pg.display.set_caption(CAPTION)
pg.display.set_mode(SCREEN_SIZE)
App().main_loop()
pg.quit()
sys.exit()
if __name__ == "__main__":
main()
Подробнее здесь: https://stackoverflow.com/questions/790 ... be-numeric