Pygame Inquiry - Генерация нескольких спрайтов в одном классе - PullRequest
1 голос
/ 05 октября 2011

Незначительная преамбула:

Здравствуйте, я использую Python и Pygame для создания игры.Это сделано для улучшения моих навыков программирования, а не для серьезной попытки создания игры.В последнее время я взял перерыв от Python для Objective C, но сейчас я возвращаюсь к нему.Это проблема, с которой я столкнулся до того, как сделал небольшой перерыв, и я вернулся к вопросу, который меня изначально озадачил.Я потратил довольно много времени на его изучение, и у меня есть подозрение, что я наткнулся на решение и просто не смог его понять.Я извиняюсь за некоторые плохие соглашения об именах / отсутствие комментариев.Я работаю над улучшением этого.

Вещество вопроса:

В любом случае, я прикрепил четыре изображения, которые я использую.Программа использует простую функцию для позиционирования различных плиток на экране.Курсор мыши - это меч.Это целое изображение, но я изменю это позже.Я сделал тип программы "синий" в оболочке всякий раз, когда курсор сталкивается с тайлом.Моя цель состоит в том, чтобы это произошло, когда он сталкивается с «ЛЮБОЙ» плиткой этого цвета.

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

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

Спасибо

РЕДАКТИРОВАТЬ: я не смог добавить изображения из-за новогоПользовательское ограничение.Они доступны введите описание ссылки здесь Мне кажется, я где-то читал, что люди могут (и делают) редактировать сообщения здесь.Так что если кто-то, кто может перемещать изображения в эту ветку, может это сделать.

import random,math,sys,os
import pygame
from pygame.locals import *

pygame.init() #Initializing Pygame

#Colors
black=(0,0,0)

#Screen
screen=pygame.display.set_mode((1200,800),0,0)
pygame.display.set_caption("Nero's Sandbox")
pygame.mouse.set_visible(False)
clock=pygame.time.Clock()
fps=40

#Game Functions:

def terminate():
    pygame.quit()
    sys.exit()

def numgen(x,y):
    return random.randint(x,y)

#Loop Variables
tri=2

#Groups:

allsprites = pygame.sprite.Group()
alltiles = pygame.sprite.Group()
allmice = pygame.sprite.Group()

#Mouse Classes

class Pointy(pygame.sprite.DirtySprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.image.load('redsword.png').convert() #31x32 image
        self.image.set_colorkey(black)
        self.rect=self.image.get_rect()
        self.set=pygame.sprite.Group()
        self.add(allmice, allsprites, self.set)
        pygame.sprite.RenderPlain((self.set,allmice,allsprites))

    def update(self):
        screen.fill(black)
        alltiles.draw(screen)
        if event.type == pygame.MOUSEMOTION:
            pos = pygame.mouse.get_pos()
            self.rect.topright = pos
            self.set.draw(screen)

#Tile Sprites - only one rect is being recognized.

class Tile(pygame.sprite.Sprite):
    def __init__(self, graphic):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(graphic).convert()
        self.image = pygame.transform.scale((self.image),(50,50))
        self.rect=self.image.get_rect()
        self.add(alltiles, allsprites)
        self.set=pygame.sprite.RenderPlain((self))

    def update(self, x, y):
        pos = (x,y)
        self.rect.topleft = pos

#Micers
pointy1=Pointy()

#Game Loops

while True:  #Ensures all loops within program are constantly called when conditions are met.  
    screen.fill(black)
    while tri==2:                                   
        for event in pygame.event.get():
            if event.type == QUIT:
                terminate()
        pygame.display.flip()
        x = 0
        y = 50
        w = 0
        while  x!=600:
               x=x+50
               w = w+1
               if w%2==0:
                    purpletile1=Tile('purplesquare.png')
                    purpletile1.set.update(x,y)
                    purpletile1.set.draw(screen)
               else:
                   c=numgen(1,2)
                   if c==1:
                           bluetile1=Tile('lightbluesquare.png')
                           bluetile1.set.update(x,y)
                           bluetile1.set.draw(screen)
                   if c==2:
                           redtile1=Tile('redsquare.png')
                           redtile1.set.update(x,y)
                           redtile1.set.draw(screen)
               if x>=600 and y!=450:
                    if y<450:
                        x = 0
                        y = y+50
                        w=w-1
                    if y>=450:
                       tri=3

    while tri==3:
        for event in pygame.event.get():
           if event.type == QUIT:
               terminate()
           alltiles.draw(screen)
           pointy1.set.update()
           pointy1.set.draw(screen)
           pygame.display.flip()
           clock.tick(fps)
           if pygame.sprite.collide_rect(pointy1,bluetile1):
               print('blue')

1 Ответ

1 голос
/ 29 февраля 2012

У меня была такая же проблема сама!Я провел некоторую отладку, и оказалось, что все экземпляры моего класса использовали один и тот же экземпляр pygame.Rect ()

Вы можете изменить строку:

pygame.sprite.Sprite.__init__(self)

на

super.__init__(self)

Таким образом, init pygame.sprite.Sprite установит атрибуты вашей плитки.Я могу ошибаться, я не совсем знаком с синтаксисом наследования python, но это то, как я это делаю.

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

Я надеюсь, что мне помогли, и просто запомните, что pygame.Rect - это объект, так что каким-то образом вы создаете экземпляр только один раз.

...