Отскакивание изображения полигональным способом с pygame

Эй, ребята, новичок в pygame. Мне нужно сделать мяч image ball.jpg чтобы отскочить в полигональном порядке. У меня также есть еще одно изображение шара, которое работает в квадратной форме. Что мне нужно, это добавить еще одно изображение шарика и отскок это полигонально. Мой код

 import pygame from itertools import cycle pygame.init() screen = pygame.display.set_mode((300, 300)) s_r = screen.get_rect() ball = pygame.image.load('ball.jpg') player = pygame.Rect((100, 100, 50, 50)) timer = pygame.time.Clock() speed = 5 up, down, left, right = (0, -speed), (0, speed), (-speed, 0), (speed, 0) dirs = cycle([up, right, down, left]) dir = next(dirs) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: raise # move player player.move_ip(dir) # if it's outside the screen if not s_r.contains(player): # put it back inside player.clamp_ip(s_r) # and switch to next direction dir = next(dirs) screen.fill(pygame.color.Color('Black')) screen.blit(ball,player) pygame.display.flip() timer.tick(25) 

Этот код отлично работает с одним изображением. Что мне нужно, это добавить другое изображение, и оно должно работать в полигональной форме на окне pygame ..

Надеюсь, вы, ребята, можете мне помочь. Спасибо.

One Solution collect form web for “Отскакивание изображения полигональным способом с pygame”

Для этого вам понадобится векторная математика.

Создайте список точек, описывающих путь, по которому должен двигаться объект, а затем вычислите вектор, описывающий направление от текущей позиции до целевой позиции. Затем переместите объект с помощью этого вектора. Как только вы нажмете свою цель, постарайтесь двигаться дальше.

Вот пример:

 import pygame import math from itertools import cycle # some simple vector helper functions, stolen from http://stackoverflow.com/a/4114962/142637 def magnitude(v): return math.sqrt(sum(v[i]*v[i] for i in range(len(v)))) def add(u, v): return [ u[i]+v[i] for i in range(len(u)) ] def sub(u, v): return [ u[i]-v[i] for i in range(len(u)) ] def dot(u, v): return sum(u[i]*v[i] for i in range(len(u))) def normalize(v): vmag = magnitude(v) return [ v[i]/vmag for i in range(len(v)) ] screen = pygame.display.set_mode((300, 300)) clock = pygame.time.Clock() class Ball(object): def __init__(self, path): self.x, self.y = (0, 0) self.speed = 2.5 self.color = (200, 200, 200) self.path = cycle(path) self.set_target(next(self.path)) @property def pos(self): return self.x, self.y # for drawing, we need the position as tuple of ints # so lets create a helper property @property def int_pos(self): return map(int, self.pos) @property def target(self): return self.t_x, self.t_y @property def int_target(self): return map(int, self.target) def next_target(self): self.set_target(self.pos) self.set_target(next(self.path)) def set_target(self, pos): self.t_x, self.t_y = pos def update(self): # if we won't move, don't calculate new vectors if self.int_pos == self.int_target: return self.next_target() target_vector = sub(self.target, self.pos) # a threshold to stop moving if the distance is to small. # it prevents a 'flickering' between two points if magnitude(target_vector) < 2: return self.next_target() # apply the balls's speed to the vector move_vector = [c * self.speed for c in normalize(target_vector)] # update position self.x, self.y = add(self.pos, move_vector) def draw(self): pygame.draw.circle(screen, self.color, self.int_pos, 4) pygame.init() quit = False path = [(26, 43), (105, 110), (45, 225), (145, 295), (266, 211), (178, 134), (250, 56), (147, 12)] path2 = [(26, 43), (105, 10), (45, 125), (150, 134), (150, 26), (107, 12)] ball = Ball(path) ball.speed = 1.9 ball2 = Ball(path2) ball2.color = (200, 200, 0) balls = [ball, ball2] while not quit: quit = pygame.event.get(pygame.QUIT) pygame.event.poll() map(Ball.update, balls) screen.fill((0, 0, 0)) map(Ball.draw, balls) pygame.display.flip() clock.tick(60) 

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


Вот пример без специального класса:

 import pygame import math from itertools import cycle # some simple vector helper functions, stolen from http://stackoverflow.com/a/4114962/142637 def magnitude(v): return math.sqrt(sum(v[i]*v[i] for i in range(len(v)))) def sub(u, v): return [ u[i]-v[i] for i in range(len(u)) ] def normalize(v): vmag = magnitude(v) return [ v[i]/vmag for i in range(len(v)) ] screen = pygame.display.set_mode((300, 300)) clock = pygame.time.Clock() pygame.init() quit = False path = [(26, 43), (105, 110), (45, 225), (145, 295), (266, 211), (178, 134), (250, 56), (147, 12)] path = cycle(path) target = next(path) ball = pygame.rect.Rect(target[0], target[1], 10, 10) speed = 3.6 while not quit: quit = pygame.event.get(pygame.QUIT) pygame.event.poll() if ball.topleft == target: target = next(path) target_vector = sub(target, ball.topleft) if magnitude(target_vector) < 2: target = next(path) else: move_vector = [c * speed for c in normalize(target_vector)] ball.move_ip(move_vector) screen.fill((0, 0, 0)) pygame.draw.rect(screen, pygame.color.Color('Grey'), ball) pygame.display.flip() clock.tick(60) 
  • Невозможно получить ввод с клавиатуры pygame
  • Пигаме сломался?
  • Установка pygame
  • Как я могу создать позицию второго щелчка в Pygame?
  • Есть ли что-нибудь, что мне нужно знать об использовании Tkinter и pygame вместе?
  • Как вставить консоль в окно pyGame?
  • SVG-рендеринг в приложении PyGame
  • Обнаружение мыши на изображении в Pygame
  • Может ли постоянный ввод ключа перемещать спрайт постоянно?
  • MIDI на Python / PyGame, Ubuntu 12.04
  • PyGame Обнаружение столкновений для понга и хранение весла на экране
  •  
    Interesting Posts for Van-Lav

    Как определить подпроцесс.Popen () не удалось, когда shell = True

    Как сохранить пароль пользователя для стороннего сервиса в Python?

    Где функция mimetools.choose_boundary в Python3?

    усреднение матрицы

    извлекать верхнюю / нижнюю треугольную часть матричной матрицы?

    «Невозможно запустить новую ошибку потока» в Python

    Использовать приоритет сельдерея с помощью широковещательных задач

    python преобразует строку в список аргументов

    Адресация векторных элементов в C / openCL

    Pandas: групповая и разностная таблица

    Что должен сделать itertools.product () при наличии пустого списка?

    Как обеспечить пользовательскую функцию для python blaze с помощью sqlite-бэкэнд?

    Возможно ли создать столбец в SQLAlchemy, который будет автоматически заполняться временем, когда он вставлен / обновлен в прошлый раз?

    Как перенаправить подпроцесс python stderr и stdout в несколько файлов?

    Запрос массива во встроенном списке

    Python - лучший язык программирования в мире.