PyGame почему фигура не движется?

Когда происходит клик под ним появляется круг. Круг должен вылетать из нижнего края окна и лететь вверх, т.е. изменяться должна только координата y.

Пока летит один, другой не должен появляться. У меня нет идей почему круг не двигается. Я выносил if в основной цикл , менял if на while (но во всех этих случаях вылетает ошибка).

import pygame as pg
import sys

WHITE = (255, 255, 255)
RED = (225, 0, 50)

sc = pg.display.set_mode((400, 300))
sc.fill(WHITE)
pg.display.update()

while True:
    for i in pg.event.get():
        if i.type == pg.QUIT:
            sys.exit()
        if i.type == pg.MOUSEBUTTONDOWN:
            if i.button == 1:
                x, pos_y = i.pos
                y = 300
                pg.draw.circle(
                    sc, RED, (x, y), 20)
                if y != pos_y:
                    y -= 10
                pg.display.update()

    pg.time.delay(20)


Ответы (1 шт):

Автор решения: S. Nick

Я не совсем понял вашу задумку с кликами, поэтому покажу вам пример движения изображения.

Клавиши K_UP, K_DOWN, K_LEFT, K_RIGHT и их сочетания в вашем распоряжении, попробуйте:

import sys
import pygame as pg

pg.init()

width = 800
height = 600
size = (width, height)

window = pg.display.set_mode(size)
clock = pg.time.Clock()
all_sprites = pg.sprite.Group()


class Sprite(pg.sprite.Sprite):
    def __init__(self, x=width/2, y=height/2):
        super().__init__()

        self.image = pg.image.load("ball.png").convert()
        
        self.image.set_colorkey((0, 0, 0))
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)

    def update(self, *args):
        up, down, right, left = args

        if self.rect.x > width:
            self.rect.x = 0
        if self.rect.x < 0:
            self.rect.x = width
        if self.rect.y > height:
            self.rect.y = 0
        if self.rect.y < 0:
            self.rect.y = height

        if right:
            self.rect.x += 10
        if left:
            self.rect.x -= 10
        if up:
            self.rect.y -= 10
        if down:
            self.rect.y += 10


sprite_1 = Sprite()
all_sprites.add(sprite_1)

while True:
    keys = pg.key.get_pressed()
    clock.tick(60)
    for event in pg.event.get():
        if event.type == pg.QUIT:sys.exit()

    if keys[pg.K_UP] or keys[pg.K_DOWN] or keys[pg.K_LEFT] or keys[pg.K_RIGHT]:
        up, down, right, left = keys[pg.K_UP], keys[pg.K_DOWN], keys[pg.K_RIGHT], keys[pg.K_LEFT]
        all_sprites.update(up, down, right, left)

    window.fill((255,255,255))
    all_sprites.draw(window)
    pg.display.update()

введите сюда описание изображения

ball.png

введите сюда описание изображения


Update

при нажатии ЛКМ создаю круг, и по идее он должен двигаться вверх пока его координата y не совпадет с координатой y в месте клика, но он не движется

import sys
import pygame as pg

pg.init()

width = 800
height = 600
size = (width, height)
flag = False
m_x, m_y, _m_y = 0, 0, 0

window = pg.display.set_mode(size)
clock = pg.time.Clock()
all_sprites = pg.sprite.Group()


class Sprite(pg.sprite.Sprite):
    def __init__(self, x=width/2, y=height/2):
        super().__init__()
        self.image = pg.image.load("ball.png").convert()              # ball.png
        self.image.set_colorkey((0, 0, 0))
        self.rect = self.image.get_rect()
        self.rect.center = (x, height+20)
        self.n = 7

    def update(self, *args):
        m_x, m_y, flag = args
        self.rect.center = (m_x, height-self.n)
        self.n += 7
          
        if flag and m_y > 0:
            self.rect.y -= 7

sprite_1 = Sprite()
all_sprites.add(sprite_1)

while True:
    keys = pg.key.get_pressed()
    clock.tick(60)
    for event in pg.event.get():
        if event.type == pg.QUIT:sys.exit()
        
    if event.type == pg.MOUSEBUTTONDOWN:
        if event.button == 1:
            m_x, m_y = event.pos
            _m_x, _m_y = event.pos
            flag = True

    if height - _m_y - sprite_1.n > 0 and flag:
        m_y = sprite_1.rect.y
        all_sprites.update(m_x, m_y, flag)
    else:
        flag = False
        m_y = 0
        _m_y = 0
        sprite_1.n = 7
        

    window.fill((255, 255, 255))
    all_sprites.draw(window)
    pg.display.update()

введите сюда описание изображения

→ Ссылка