不重要的序言:
您好,我正在使用Python和Pygame来创建游戏。这是为了提高我的编程技巧,而不是认真尝试游戏。我最近为Objective C休息了一段时间,但我现在回到了它。这是我在短暂休息之前遇到的一个问题,我回到了一个原本困扰我的问题。我花了很长时间研究它,我怀疑我遇到了解决方案,但却没有理解它。我为一些不好的命名惯例/缺乏评论道歉。我正在努力改善这一点。
问题的实质:
无论如何,我已经附上了我正在使用的四张图片。该程序使用一个简单的功能来定位屏幕上的各种瓷砖。鼠标光标是一把剑。这是整个图像,但我稍后会改变它。每当光标与Tile发生碰撞时,我都会在shell中将程序类型设置为“blue”。我的目标是当它与那种颜色的“任何”瓷砖碰撞时发生这种情况。
长期来说,我希望能够修改这些tile sprite的属性。各种游戏片段会互动,我需要保存每个精灵的状态。我也会为其他精灵设置互动。
现在精灵们都在生成图像,但是我的Tile碰撞矩形只是在每个图像生成后移动。我认为这在代码中是有意义的,但我需要一种方法来处理多个精灵,每个精灵都有一个矩形用于碰撞。
由于
编辑:由于新用户限制,我无法添加图片。它们可用enter link description here我想我读到的地方人们可以(并且做)在这里编辑帖子。因此,如果有人能够将图像移动到此线程中,那么欢迎这样做。
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')
答案 0 :(得分:1)
我自己也有同样的问题!我做了一些调试,似乎我的类的所有实例都共享了相同的pygame.Rect()实例
您可能想要更改该行:
pygame.sprite.Sprite.__init__(self)
到
super.__init__(self)
这样,pygame.sprite.Sprite的init会为你的磁贴设置属性。我可能错了,我并不完全熟悉python的继承语法,但这就是我的方法。
我也可能是get_rect导致所有类使用相同的矩形,但这似乎不太可能。
我希望我能得到一些帮助,并且只记得pygame.Rect是一个对象,所以你不知何故只是实例化了一次。