Найти - Пользователи
Полная версия: Прошу помочь ответить на маленький вопрос
Начало » Центр помощи » Прошу помочь ответить на маленький вопрос
1 2 3
zantal
Уважаемые коллеги! Столкнулся с такой проблемой:
до основного цикла 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)

PEHDOM
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
>>>
в итоге вам нужно или поместить p = (x, y, rect_width, rect_height) внутрь цикла, или “p” вместо кортежа сделать списком и менять непосредственно элементы списка, но вообще по правильному вам нужно не кортеж скармливать а объеект типа pygame.Rect
 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)
zantal
PEHDOM

Спасибо Вам огромное за развёрнутый ответ!

У меня после этого возникло два небольших вопроса:


1. Я преобразовал кортеж p вне цикла while в список (т.е. изменяемый объект). потом опять в цикле сделал:
pygame.draw.rect(sc, BLUE, p) и все опять не работает. А это почему может быть так? Список ведь изменяемый объект.

2. А по какой причине лучше скармливать объект типа .Rect, а не кортеж? какие преимущества?
PEHDOM
zantal
1. Я преобразовал кортеж p вне цикла while в список (т.е. изменяемый объект). потом опять в цикле сделал:
pygame.draw.rect(sc, BLUE, p) и все опять не работает. А это почему может быть так? Список ведь изменяемый объект.
список изменяемый объект, int неизменяемый. у вас х типа int и когда вы делаете x += 3 то создаеться новый объект. котороый никак не завязан на кортеж/список $p

zantal
2. А по какой причине лучше скармливать объект типа .Rect, а не кортеж? какие преимущества?
В даной реализации никакой,но если вы задумаете чтото посложнее то там есть куча полезных методов типа проверка на пересечение/включение с другими прямоугольниками, изменение размера, перемещение, обьединение с другим прямоугольником и пр… подробнее тут https://www.pygame.org/docs/ref/rect.html
что может существенно упростить вам жизнь.
zantal
PEHDOM

Всё понял!
Спасибо Вам огромное!
Johapaf
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>
Rickypoelt
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>
FrankKag
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>
FrankKag
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>
FrankKag
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>
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB