проверка конфликтов между игроком и монетами [дубликат]

, если вы используете Android Studio в MAC OS X, вы можете выполнить следующую команду в своем приложении терминала:

echo 'alias adb="/Applications/Android\ Studio.app/sdk/platform-tools/adb"' >> .bashrc
exec $SHELL

и следующее:

adb devices

, и вы должен показывать список с вашими устройствами Android, подключенными через USB-кабель в вашем MAC, например, примерно так:

* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
deb7bed5        device
3
задан Darthfett 28 February 2012 в 21:06
поделиться

6 ответов

Если вы используете класс pygame Rect для представления границ вашего объекта, вы можете определить, сталкиваются ли два с помощью функции Rect.colliderect. Например:

import pygame

a = pygame.Rect((1, 1), (2, 2))
b = pygame.Rect((0, 0), (2, 2))
c = pygame.Rect((0, 0), (1, 1))
a.colliderect(b)
# 1
a.colliderect(c)
# 0
b.colliderect(c)
# 1

a сталкивается с b, а b сталкивается с c, но a не сталкивается с c. Обратите внимание, что прямоугольники, которые разделяют границу, не сталкиваются.

Pygame также поддерживает возможность использования Rect в качестве позиции для изображения, когда вы хотите «разбить» его на экране.

11
ответ дан Darthfett 18 August 2018 в 06:50
поделиться
  • 1
    Это не работает для меня, он всегда возвращает 0 – pixelgeer 16 February 2012 в 17:38

Существует множество способов обнаружения столкновений в Pygame. Методы Rect (@Darthfett) и spritecollide являются более популярными, но есть 2 других, которые вы можете использовать:

Метод 1:

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

Что вы делаете, это выбрать определенный цвет, проверить цвета пикселей вокруг объекта и заставить его столкнуться, если вы обнаружите определенный цвет. Это позволяет использовать простые игры, такие как «Не позволяйте своей мыши касаться цвета черного» и другие простые программы.

Способ 2:

Этот метод, безусловно, мой любимый, и Я использую это в 90% всех моих программ. Вы обнаруживаете столкновение с помощью вычисления . Здесь вы берете координаты объектов 1 и 2, смотрите, насколько они близки друг к другу, и из-за этого возникают столкновения. Этот метод допускает большую гибкость при столкновениях, не слишком неряшлив, если все сделано правильно, и довольно просто. Это может занять немного времени, и вам нужно будет тестировать программу много раз, но результаты ее стоит того. Этот метод также позволяет обнаруживать между невидимыми объектами и позволяет легко регулировать коллизионные поля, например. если есть волшебник или что-то еще, и вы умираете, когда вы на некоторое расстояние от него. Этот метод действительно не так популярен, как должен, но я заверяю вас, что он работает. Две самые простые формы столкновения с этим методом - с круговыми и с прямоугольным столкновением.

0
ответ дан Douglas - 15 year old Pythoner 18 August 2018 в 06:50
поделиться

Допустим, у вас есть класс игрока, который выглядит примерно так, мне нравится использовать pygame.sprite.collide_rect (), в этом случае у нас также будет класс стены.

class Player(pygame.sprite.Sprite):
    def __init__(self,x,y):

        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((32,32))
        self.rect = Rect(x, y, 32, 32)

    def move(self, px, py):

        if px != 0:
            self.move_on_axis(px, 0)
        if py != 0:
            self.move_on_axis(0, py)

    def move_on_axis(self, px, py):
        self.rect.x += px
        self.rect.y += py

Здесь мы щекочаем за столкновения с чем-либо в группе стен, которые мы добавляем, когда когда-либо создаем новую стену.

        for wall in walls:
            if pygame.sprite.collide_rect(self, wall):   
                if px > 0:
                     self.rect.right = wall.rect.left
                if px < 0:
                    self.rect.left = wall.rect.right
                if py > 0:
                    self.rect.bottom = wall.rect.top                        
                if py < 0:
                    self.rect.top = wall.rect.bottom

class Wall(pygame.sprite.Sprite):
    def __init__(self, wx):
        super().__init__()
        all_Sprite_List.add(self)
        walls.add(self)
        self.image = pygame.Surface((32,32))
        self.rect = Rect(wx[0], wx[1], 32, 32)
0
ответ дан dustin bennett 18 August 2018 в 06:50
поделиться
import pygame
pygame.init()
class Sprite(pygame.sprite.Sprite):
    def __init__(self, image, location):
        self.image = pygame.image.load(urimage)
...

, затем создайте группы столкновений и используйте pygame.sprite.spritecollide()

0
ответ дан Henry 18 August 2018 в 06:50
поделиться

Да, но обязательно используйте классы спрайтов для прямоугольников, sprite info, доступных здесь. Итак, для каждого спрайта сделайте rect:

class object(pygame.sprite.Sprite):
def __init__(self):
    pygame.sprite.Sprite.__init__(self)
    self.x = 0
    self.y = 0
    self.image = pygame.image.load('object.png')
    self.rect = pygame.Rect(self.x,self.y,32,32) #The rect for collision detection.

Я это знаю похоже, много, и вот что я подумал, когда начал с спрайтов, но поверьте мне, это того стоит.

2
ответ дан Nick Panagakis 18 August 2018 в 06:50
поделиться

Создайте функцию, которая проверяет периметры x, y, w, h обоих объектов и создает оператор if как таковой, который будет проверять, сталкиваются ли эти два объекта:

def col_check(x,y,w,h,x2,y2,w2,h2):
if (x < (x2 + w2) and (x + w) > x2 and y < (y2 + h2) and (h + y) > y2):                     
    # Do something here                                                

Теперь вы может просто вызвать функцию с периметрами объектов в качестве аргументов.

0
ответ дан Person 18 August 2018 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: