Форум сайта python.su
Уважаемые коллеги! Столкнулся с такой проблемой:
до основного цикла while я хотел задать параметры отрисовываемого синего квадрата в переменной p, а уже в теле цикла while в конструкции pygame.draw.rect вместо длинного (x, y, rect_width, rect_height) написать просто - p (то есть вместо pygame.draw.rect(sc, BLUE, (x, y, rect_width, rect_height)) я хотел указать pygame.draw.rect(sc, BLUE, p)).
Но так программа не работает, а если указать как у меня сейчас указано в коде. (pygame.draw.rect(sc, BLUE, (x, y, rect_width, rect_height))), то все ок и работает.
Почему так? Ведь p содержит x, а этот x в цикле мы постоянно модифицируем. Так почему же квадрат не появляется и не движется?
Заранее спасибо!
import pygame
FPS = 60
WIN_WIDTH = 800
WIN_HEIGHT = 400
WHITE = (255, 255, 255)
ORANGE = (255, 150, 100)
BLUE = (64, 128, 255)
pygame.init()
clock = pygame.time.Clock()
sc = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT))
rect_width = 150
rect_height = 150
x = 0 - rect_width
y = (WIN_HEIGHT // 2) - (rect_height // 2)
p = (x, y, rect_width, rect_height)
direction = 1
while 1:
sc.fill(WHITE)
for i in pygame.event.get():
if i.type == pygame.QUIT: exit()
pygame.draw.rect(sc, BLUE, (x, y, rect_width, rect_height))
pygame.display.update()
if direction == 1:
if x >= WIN_WIDTH - rect_width:
direction = -1
else:
x += 3
else:
if x <= 0:
direction = 1
else:
x -= 3
clock.tick(FPS)
Офлайн
zantalМ-да, вам бы прочитать про атомарные и ссылочные типы данных.
Почему так? Ведь p содержит x, а этот x в цикле мы постоянно модифицируем.
Все объекты делятся на ссылочные и атомарные. К атомарным относятся int, long (в версии 3 любое число int, так как в версии 3 нет ограничения на размер), complex и некоторые другие. При присваивании атомарных объектов копируется их значение, в то время как для ссылочных копируется только указатель на объект, таким образом, обе переменные после присваивания используют одно и то же значение.https://ru.wikipedia.org/wiki/Python
>>> x,y = 10, 20 >>> p=(x, y) >>> p[0] 10 >>> x=50 >>> p[0] 10 >>>
import pygame FPS = 60 WIN_WIDTH = 800 WIN_HEIGHT = 400 WHITE = (255, 255, 255) ORANGE = (255, 150, 100) BLUE = (64, 128, 255) pygame.init() clock = pygame.time.Clock() sc = pygame.display.set_mode((WIN_WIDTH, WIN_HEIGHT)) rect_width = 150 rect_height = 150 x = 0 y = (WIN_HEIGHT // 2) - (rect_height // 2) p = pygame.Rect(x, y, rect_width, rect_height) direction = 1 while 1: sc.fill(WHITE) for i in pygame.event.get(): if i.type == pygame.QUIT: exit() pygame.draw.rect(sc, BLUE, p) pygame.display.update() if direction == 1: if p.x >= WIN_WIDTH - rect_width: direction = -1 else: p.x += 3 else: if p.x <= 0: direction = 1 else: p.x -= 3 clock.tick(FPS)
[code python][/code]
Отредактировано PEHDOM (Ноя. 29, 2019 16:10:37)
Офлайн
PEHDOM
Офлайн
zantalсписок изменяемый объект, int неизменяемый. у вас х типа int и когда вы делаете x += 3 то создаеться новый объект. котороый никак не завязан на кортеж/список $p
1. Я преобразовал кортеж p вне цикла while в список (т.е. изменяемый объект). потом опять в цикле сделал:
pygame.draw.rect(sc, BLUE, p) и все опять не работает. А это почему может быть так? Список ведь изменяемый объект.
zantalВ даной реализации никакой,но если вы задумаете чтото посложнее то там есть куча полезных методов типа проверка на пересечение/включение с другими прямоугольниками, изменение размера, перемещение, обьединение с другим прямоугольником и пр… подробнее тут https://www.pygame.org/docs/ref/rect.html
2. А по какой причине лучше скармливать объект типа .Rect, а не кортеж? какие преимущества?
[code python][/code]
Отредактировано PEHDOM (Ноя. 29, 2019 16:51:52)
Офлайн
PEHDOM
Офлайн
Generic! Smile more. people
<a href=https://usabuyciali.com>cialis 5mg how long</a>
See you in New Year USA 2020
<a href=https://usabuyciali.com>Cialis low price</a>
Офлайн
usabuycialis delivery! Comfort. Joy.
<a href=https://usabuyciali.com>tadalafil cheapest</a>
See you in New Year USA 2020
<a href=https://usabuyciali.com>generic Cialis cheap</a>
Офлайн
Hello everyoneMy name is Mary.
Who will register and find me on the site,
will receive a gift from me and my phone number!
https://clck.ru/F96Y3
<a href=https://ibb.co/5k6zDS7><img src="https://i.ibb.co/5k6zDS7/1412335-big-1-1541004190.jpg"></a>
<a href=https://ibb.co/4PnKRY2><img src="https://i.ibb.co/4PnKRY2/Jz-XHe-Fau0.jpg"></a>
Офлайн
Hello everyoneMy name is Mary.
Who will register and find me on the site,
will receive a gift from me and my phone number!
https://clck.ru/F96Y3
<a href=https://ibb.co/5k6zDS7><img src="https://i.ibb.co/5k6zDS7/1412335-big-1-1541004190.jpg"></a>
<a href=https://ibb.co/0s8pnwB><img src="https://i.ibb.co/0s8pnwB/2323022779.jpg"></a>
Офлайн
Hello everyoneMy name is Mary.
Who will register and find me on the site,
will receive a gift from me and my phone number!
https://clck.ru/F96Y3
<a href=https://ibb.co/5k6zDS7><img src="https://i.ibb.co/5k6zDS7/1412335-big-1-1541004190.jpg"></a>
<a href=https://ibb.co/1MTSMQV><img src="https://i.ibb.co/1MTSMQV/Si-Sq-Lk-Vdd-MI.jpg"></a>
Офлайн