Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 29, 2019 15:22:58

zantal
Зарегистрирован: 2019-04-16
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помочь ответить на маленький вопрос

Уважаемые коллеги! Столкнулся с такой проблемой:
до основного цикла 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)

Офлайн

#2 Ноя. 29, 2019 15:52:22

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Прошу помочь ответить на маленький вопрос

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)



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Ноя. 29, 2019 16:10:37)

Офлайн

#3 Ноя. 29, 2019 16:33:23

zantal
Зарегистрирован: 2019-04-16
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помочь ответить на маленький вопрос

PEHDOM

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

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


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

2. А по какой причине лучше скармливать объект типа .Rect, а не кортеж? какие преимущества?

Офлайн

#4 Ноя. 29, 2019 16:48:42

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Прошу помочь ответить на маленький вопрос

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
что может существенно упростить вам жизнь.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Ноя. 29, 2019 16:51:52)

Офлайн

#5 Ноя. 29, 2019 16:52:47

zantal
Зарегистрирован: 2019-04-16
Сообщения: 22
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помочь ответить на маленький вопрос

PEHDOM

Всё понял!
Спасибо Вам огромное!

Офлайн

#6 Дек. 31, 2019 00:01:37

Johapaf
Зарегистрирован: 2019-12-28
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помочь ответить на маленький вопрос

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>

Офлайн

#7 Янв. 5, 2020 08:40:32

Rickypoelt
Зарегистрирован: 2020-01-03
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помочь ответить на маленький вопрос

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>

Офлайн

#8 Янв. 12, 2020 15:14:59

FrankKag
Зарегистрирован: 2019-12-28
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помочь ответить на маленький вопрос

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>

Офлайн

#9 Янв. 12, 2020 15:15:36

FrankKag
Зарегистрирован: 2019-12-28
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помочь ответить на маленький вопрос

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>

Офлайн

#10 Янв. 12, 2020 15:16:14

FrankKag
Зарегистрирован: 2019-12-28
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Прошу помочь ответить на маленький вопрос

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>

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version