Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 5, 2012 22:38:31

rocket
От:
Зарегистрирован: 2012-03-21
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

pygame rotate

Мучаю PyGame и себя. Не могу понять как работает функция pygame.transform.rotate. Инструкцию прочитал

pygame.transform.rotate

rotate an image
pygame.transform.rotate(Surface, angle): return Surface

Unfiltered counterclockwise rotation. The angle argument represents degrees and can be any floating point value. Negative angle amounts will rotate clockwise.

Unless rotating by 90 degree increments, the image will be padded larger to hold the new size. If the image has pixel alphas, the padded area will be transparent. Otherwise pygame will pick a color that matches the Surface colorkey or the topleft pixel value.
Но я так и не понял относительно чего изменяеться угол .



Прикреплённый файлы:
attachment enigma.jpg (22,1 KБ)

Офлайн

#2 Дек. 6, 2012 08:50:22

Frog-king
Зарегистрирован: 2012-11-30
Сообщения: 31
Репутация: +  1  -
Профиль   Отправить e-mail  

pygame rotate

Тоже долго мучался с этим методом - место вращения получалось искривление пространства ))

Само вращение нужно совершать с копией спрайта. Вообщем смотри

import pygame
pygame.init()
pygame.key.set_repeat(1, 1)
display = pygame.display.set_mode((640, 480))  
org_spriteImg = pygame.image.load(u'1.jpeg').convert_alpha()
spriteImg = org_spriteImg
spriteRect = org_spriteImg.get_rect()
spriteRect.center = (320, 240) 
angle = 0                
run = 1
while run:
    display.fill((255, 255, 255)) 
    display.blit(spriteImg, spriteRect)
    pygame.display.flip() 
    for event in pygame.event.get(): 
        if event.type == pygame.QUIT:
            run = 0
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_1:
                run = 0
            if event.key == pygame.K_UP:
                spriteRect = spriteRect.move(0, -1)
            elif event.key == pygame.K_DOWN:
                spriteRect = spriteRect.move(0, 1)
            if event.key == pygame.K_LEFT:
                angle += 1
                spriteImg = pygame.transform.rotate(org_spriteImg, angle)
                
            elif event.key == pygame.K_RIGHT:
                angle -= 1
                spriteImg = pygame.transform.rotate(org_spriteImg, angle)
                

Но можно вращать и вокруг центра приблизительно так ( только координаты центра нужно хранить)
            elif event.key == pygame.K_RIGHT:
                angle -= 1
                spriteImg = pygame.transform.rotate(org_spriteImg, angle)
                spriteRect = spriteImg.get_rect()
                spriteRect.center = (320, 240)      

Вообщем прошу заценить и почитать исходники моей игры

Отредактировано Frog-king (Дек. 8, 2012 15:03:52)

Офлайн

#3 Дек. 7, 2012 21:58:35

rocket
От:
Зарегистрирован: 2012-03-21
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

pygame rotate

Там каким лучше метдом пользоваться , FroG-King? Вращение вокруг центра? И почему в инструкции написано что функция
screen.blit выводит на определеную координату левый-верхний угол rectangla , но я проверял в программе выводит центр прямоугольника.
Относительно чего происходит вращение я так и не понял , чесно. И это ужасно . Все так программисты работа
ют? Вводишь данные - получаешь результат. Что делают эти фреймйорки - не понятно.



Офлайн

#4 Дек. 8, 2012 15:46:56

Frog-king
Зарегистрирован: 2012-11-30
Сообщения: 31
Репутация: +  1  -
Профиль   Отправить e-mail  

pygame rotate

Мне кажется ты запутался.
По поводу blit - причём здесь blit я не понял. И как ты проверял тоже интересно (кинь как проверял)

Вообщем я не совсем правильно в прошлый раз выразился

Но можно вращать и вокруг центра приблизительно так ( только координаты центра нужно хранить)

это не вращение вокруг центра - это просто смещение картинки так чтоб вращение выгладило как вокруг центра. вот как. Дело в том что при вращении у изображения изменяется rectangle, поэтому изображение смещается. Именно поэтому лучше использовать вот так.
import pygame
pygame.init()
pygame.key.set_repeat(1, 1)
display = pygame.display.set_mode((640, 480))  
org_spriteImg = pygame.image.load(u'1.png').convert_alpha()
spriteImg = org_spriteImg
spriteRect = org_spriteImg.get_rect()
spriteRect.center = (320, 240) 
angle = 0
def rotate(alfa):
    global spriteImg, spriteRect, angle
    angle += alfa
    spriteImg = pygame.transform.rotate(org_spriteImg, angle)
    spriteRect = spriteImg.get_rect()
    spriteRect.center = (320, 240)      
run = 1
while run:
    display.fill((255, 255, 255)) 
    display.blit(spriteImg, spriteRect)
    pygame.display.flip() 
    for event in pygame.event.get(): 
        if event.type == pygame.QUIT:
            run = 0
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                rotate(1)                
            elif event.key == pygame.K_RIGHT:
                rotate(-1)
и будет тебе счастье. Лучше найди книжку в сети по пугейму и почитай. ))

ИМХО Pygame хороший фреймворк. А документация заслуживает особенного респекта, Не каждая билиотека может похвастаться такой

Отредактировано Frog-king (Дек. 8, 2012 16:04:27)

Офлайн

#5 Дек. 8, 2012 16:11:52

Frog-king
Зарегистрирован: 2012-11-30
Сообщения: 31
Репутация: +  1  -
Профиль   Отправить e-mail  

pygame rotate

вот картинка для тебя

Прикреплённый файлы:
attachment 1.png (2,7 KБ)

Офлайн

#6 Дек. 8, 2012 21:01:04

rocket
От:
Зарегистрирован: 2012-03-21
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

pygame rotate

Спасибо ,Frof-King , что отвечаешь .Читаю книгу “beginning-game-development-with-python-and-pygame-from-novice-to-professional” , но технический английский мне пока тяжеловат.



Прикреплённый файлы:
attachment pyAngle.png (2,7 KБ)

Офлайн

#7 Дек. 8, 2012 23:36:02

Frog-king
Зарегистрирован: 2012-11-30
Сообщения: 31
Репутация: +  1  -
Профиль   Отправить e-mail  

pygame rotate

Да у меня с английским тоже не лады но когда читал - интуитивно понятно было. )))
Вообще не совсем понимаю зачем ты так замарачиваешься, по мне так не важно как он там крутится, главное как крутить правильно. Скажи зачем тебе эта правда ? Попробуй, покрути, напиши сам и все будет pygame! ))

В этой книжке по поводу rotate тоже немного есть.

+ картинка - По моему вот так ( это по моему как по правде не знаю) )))
(заданный, простите за безграмотность

Отредактировано Frog-king (Дек. 8, 2012 23:37:34)

Прикреплённый файлы:
attachment 1.png (4,4 KБ)

Офлайн

#8 Дек. 9, 2012 00:17:29

rocket
От:
Зарегистрирован: 2012-03-21
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

pygame rotate

Да у меня мания, постоянно хочу докопаться до самых основ. И понимаю что-бы писать игры не так уж и важно как видеокарта рендит изображение на монитор , но … вообщем мания, постоянно чувство что-то потерял. Вопрос такой - эта
функция

org_spriteImg = pygame.image.load(u'1.png').convert_alpha() 
. У меня не выходит convert_alpha ,ни просто convert ,пишет
'pygame.Surface' object has no attribute 'convert_alha
. Чем это чревато? В тупую пишу org_spriteImg = pygame.image.load(u'1.png'), тогда прогамма работает. Гуглил , но так и не нашел вразумительного ответа



Отредактировано rocket (Дек. 9, 2012 00:20:15)

Офлайн

#9 Дек. 9, 2012 20:06:38

Frog-king
Зарегистрирован: 2012-11-30
Сообщения: 31
Репутация: +  1  -
Профиль   Отправить e-mail  

pygame rotate

'convert_alha
Может опечатка ? А может забыл поставить скобочки convert_alpha()

Должно всё работать. Насколько я помню этот метод делает доступным у изображения альфа-канал ( прозрачные пиксели) грубо говоря ))
его необязательно использовать если изображение прозрачности не имеет. но разработчики рекомендуют использовать всегда.

Офлайн

#10 Март 17, 2015 11:40:20

ckolobok
Зарегистрирован: 2015-03-13
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

pygame rotate

rocket
У меня не выходит convert_alpha ,ни просто convert ,пишет
Попробуйте так:
org_spriteImg = pygame.image.load('1.png').convert_alpha()

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version