Pygame, перемещающий объект - PullRequest
2 голосов
/ 09 декабря 2011

Итак, я пытаюсь просто переместить объект в Pygame.Я искал учебники, но все, что я могу найти, это как сделать так, чтобы шел снег, лол.Я пытался реализовать этот метод для перемещения объекта, но мне не повезло.Все, что я хочу сделать, это переместить объект по экрану, и когда он достигнет конца экрана, он сбрасывается и возвращается снова.Поэтому я пытаюсь переместить объект, который я вставил в свой код (два многоугольника, линия и круг) по экрану, по горизонтали или по вертикали, на самом деле не имеет значения.

import pygame, sys, time, random
from pygame.locals import *

pygame.init()

windowSurface = pygame.display.set_mode((500, 400), 0, 32)
pygame.display.set_caption("Paint")

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

windowSurface.fill(WHITE)

pygame.draw.polygon(windowSurface,BLUE,((146, 0), (250, 100), (230, 265), (44, 250), (0,110)))
pygame.draw.polygon(windowSurface,RED,((70, 0), (150, 200), (0, 50)))
pygame.draw.line(windowSurface,BLACK,(60, 60), (120, 60), 8)
pygame.draw.circle(windowSurface, GREEN , (150,150), 15, 0)


pygame.display.update()

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

Ответы [ 4 ]

3 голосов
/ 09 декабря 2011

С вашим подходом вы не можете.Идея использования Pygame заключается в том, чтобы нарисовать все объекты, которые вы хотите нарисовать, в каждом кадре.Сначала вы должны переместить рисунок внутри вашей петли while True.Затем, поскольку вы рисуете все в каждом кадре, вы можете:

  • создать объект / переменные для хранения положения и направления вашего объекта
  • проверить, достигает ли объект одной границыэкрана
  • используйте новую позицию для рисования многоугольника

Таким образом, в конце вы можете получить что-то подобное (ваша задача - перейти на объект)

# ... pygame and app initialization

# get screen size
info = pygame.display.Info()
sw = info.current_w
sh = info.current_h

# initial position
x = y = 0
# initial direction
dx = 5
dy = 2

while True:

    # update position with direction
    x += dx
    y += dy

    # check bounds
    if x - dx < 0 or x + dx > sw:
        dx = -dx
    if y - dy < 0 or y + dy > sh:
        dy = -dy

    # then draw and use x/y in your drawing instructions!
    # ... pygame events ...
1 голос
/ 04 ноября 2016

Это совсем не сложно. Сначала мы решим вашу проблему на перемещении ваших объектов:

import pygame, sys, time, random
from pygame.locals import *

pygame.init()

windowSurface = pygame.display.set_mode((500, 400), 0, 32)
pygame.display.set_caption("Paint")

BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

windowSurface.fill(WHITE)

x, y = 250, 200

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    pressed = pygame.key.get_pressed()
    if pressed[K_UP]: y - 5
    if pressed[K_DOWN]: y + 5
    if pressed[K_LEFT]: x - 5
    if pressed[K_RIGHT]: x + 5

    pygame.display.update()

pygame.draw.polygon(windowSurface,BLUE,((x - 104, y - 200), (x, y - 100), (x - 20, y + 65), (x - 206, y + 50), (x - 250, y - 90)))
pygame.draw.polygon(windowSurface,RED,((x - 180, y - 200), (x - 100, y), (x - 250, y - 150)))
pygame.draw.line(windowSurface,BLACK,(x - 190, y - 140), (x - 130, y - 140), 8)
pygame.draw.circle(windowSurface, GREEN , (x - 100, y - 50), 15, 0)

В приведенных выше строках кода все координаты преобразуются в форму переменных x, y. Когда нажимаются клавиши со стрелками, в переменные вносятся изменения, в результате чего изменяются координаты и положения ваших фигур.

1 голос
/ 01 сентября 2012

Чтобы сделать то, что вы пытаетесь сделать, вам нужно что-то изменить в цикле «while True:». Вот пример кода, который будет делать то, что вы пытаетесь сделать:

import pygame, sys, pygame.locals#1
pygame.init()#2
window=pygame.display.set_mode((500, 400), 0, 32)#3
pygame.display.set_caption("Paint")#4
BLACK = (0, 0, 0)#5
WHITE = (255, 255, 255)#6
RED = (255, 0, 0)#7
GREEN = (0, 255, 0)#8
BLUE = (0, 0, 255)#9
pentagon=pygame.Surface((250, 265))#10
pentagon.fill((0, 0, 0))#11
pygame.draw.polygon(pentagon, BLUE, ((146, 0), (250, 100), (230, 265), (44, 250), (0,110)))#12
pentagon.set_colorkey((0, 0, 0))#13
triangle=pygame.Surface((150, 200))#14
triangle.fill((0, 0, 0))#15
pygame.draw.polygon(triangle, RED, ((70, 0), (150, 200), (0, 50)))#16
triangle.set_colorkey((0, 0, 0))#17
line=pygame.Surface((60, 8))#18
line.fill(BLACK)#19
circle=pygame.Surface((30, 30))#20
circle.fill((0, 0, 0))#21
pygame.draw.circle(circle, GREEN , (15, 15), 15, 0)#22
circle.set_colorkey((0, 0, 0))#23
rects={'pentagon': pentagon.get_rect(), 'triangle': triangle.get_rect(), 'line': line.get_rect(), 'circle': circle.get_rect()}#24
rects['line'].centery=60#25
rects['line'].left=60#26
rects['circle'].centerx=150#27
rects['circle'].centery=150#28
while True:#29
    for event in pygame.event.get():#30
        if event.type==pygame.locals.QUIT:#31
            pygame.quit()#32
            sys.exit()#33
    for rect in rects:#34
        rects[rect].right+=1#35
        if rects[rect].right>500:#36
            if rect=='line':#37
                rects['line'].centery=60#38
                rects['line'].left=60#39
            elif rect=='circle':#40
                rects['circle'].centerx=150#41
                rects['circle'].centery=150#42
            else:#43
                rects[rect].topleft=(0, 0)#44
    window.fill(WHITE)#45
    window.blit(pentagon, rects['pentagon'])#46
    window.blit(triangle, rects['triangle'])#47
    window.blit(line, rects['line'])#48
    window.blit(circle, rects['circle'])#49
    pygame.time.Clock().tick(40)#50
    pygame.display.update()#51

Я сделаю все возможное, чтобы объяснить этот код как можно лучше.

Строки 1-9, вы уже знаете.

Строка 10 начинается с того, о чем вы, вероятно, не знаете. Поверхностные объекты - это тип прямоугольного изображения, которое можно прикрепить к любой другой поверхности или нарисовать с помощью pygame.draw. Верьте этому или нет, окно - фактически поверхность.

Линия 10 создает поверхность, линия 11 заполняет ее черным, а линия 12 рисует на ней пятиугольник.

В строке 13 все пиксели черного цвета прозрачны.

Строки 14-17, теперь вы должны понимать.

Линия 18 создает новый объект поверхности для линии, но вместо того, чтобы рисовать линию на ней, она заполняется черным и остается одна. Это потому, что если вы посмотрите на строку в вашей старой программе, то увидите, что на самом деле это просто прямоугольник и ничего больше.

Строки 20-23, вы должны понимать.

Строка 24 составляет словарь прямоугольников. Прямоугольники показывают местоположение поверхностного объекта и необходимы для того, чтобы нарисовать их на чем-либо.

Линии 25-28 меняют местоположение линии и круга. Я сделал это потому, что подумал, что вам это может понравиться, учитывая, что в вашей программе нет линии и круга в левом верхнем углу.

Строки 29-33, вы должны понимать.

Строка 34 запускает цикл for, который проходит через все каналы.

Строка 35 перемещается вправо каждого из каналов на один пиксель вправо.

Строка 36 проверяет, попала ли правая часть прямоугольника в правый край окна.

Строка 37 проверяет, является ли линия, попавшая в сторону, линией, и, если это так, строки 38-39 перемещают ее в то место, где она была у вас.

Строка 40 проверяет, является ли тот, который ударяет в сторону, кругом, и, если это так, строки 41-42 перемещают его в то место, где он был у вас.

Линии 43-44 помещают прямоугольник в верхний левый угол, где начинались две другие фигуры.

Строка 45, которую вы должны знать.

Строки 46-49 используют функцию surface.blit (). Первый аргумент этой функции - поверхность, а второй - прямоугольник.

Строка 50 не позволяет передавать более 40 кадров в секунду.

Строка 51 обновляет экран.

Я действительно надеюсь, что это помогло, и я был бы признателен, если бы вы проголосовали или приняли мой ответ, учитывая, сколько времени мне понадобилось, чтобы написать его. Если у вас есть какие либо вопросы, пожалуйста спрашивайте. Спасибо!

0 голосов
/ 27 июня 2012

Это очень хороший учебник, он даже включает некоторый код, очень похожий на ваш, для начала работы с базовой графикой

http://inventwithpython.com/chapter17.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...