这是代码:
import pygame,sys
from pygame.locals import *
from random import randint
ancho = 1280
alto = 720
class Snake(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.ImageS = pygame.image.load("sprites/disparo1.png")
self.ImageSnake = pygame.image.load("sprites/cazador1 der.png")
self.rect = self.ImageSnake.get_rect()
self.rectS = self.ImageS.get_rect()
self.rect.centerx = 80
self.rect.centery = 80
self.ShotList= []
self.vel = 1
self.velS = 5
self.vidas = 3
self.viviendo = True
self.AS = False
def draw(self, ventana):
ventana.blit(self.ImageSnake, self.rect)
def move(self):
keys = pygame.key.get_pressed()
if keys[K_DOWN]:
self.rect.y += self.vel
if self.rect.bottom > 720:
self.rect.bottom = 720
if keys[K_UP]:
self.rect.y -= self.vel
if self.rect.top < 0:
self.rect.top = 0
if keys[K_RIGHT]:
self.rect.x += self.vel
if self.rect.right > 1280:
self.rect.right = 1280
if keys[K_LEFT]:
self.rect.x -= self.vel
if self.rect.left < 0:
self.rect.left = 0
def shoot(self, ventana):
keys = pygame.key.get_pressed()
if keys[K_SPACE] and not self.AS:
self.AS = True
self.rectS.right = self.rect.right + 10
self.rectS.top = self.rect.centery
if self.AS:
self.rectS.left = self.rectS.left + self.velS
if self.rectS.right > 1280:
self.AS = False
def drawShoot(self, ventana):
if self.AS:
ventana.blit(self.ImageS, self.rectS)
ventana.blit(self.ImageSnake, self.rect)
pygame.display.flip()
class zombieN1(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)
self.ImageEnemy1 = pygame.image.load("sprites/zombie1 izq.png")
self.rect = self.ImageEnemy1.get_rect()
self.s = Snake()
self.y = self.s.rect.top
self.x = randint(1016,1280)
self.rect.top = self.y
self.rect.right = self.x
self.vel = 1
self.viviendo = True
self.vidas = 1
def movement(self):
self.rect.left = self.rect.left - self.vel
def destroy(self):
pass
def draw(self, ventana):
ventana.blit(self.ImageEnemy1, self.rect)
def Game():
pygame.init()
pygame.key.set_repeat(1,25)
ventana = pygame.display.set_mode((ancho, alto))
pygame.display.set_caption("Game")
Player = Snake()
Enemy1 = zombieN1()
BG = pygame.image.load("sprites/fondo.png")
InGame = True
ronda1 = True
while True:
Enemy1.destroy()
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if InGame == True:
Player.move()
Player.shoot(ventana)
ventana.fill((205,69,159))
if ronda1 == True:
Enemy1.draw(ventana)
Enemy1.movement()
Enemy1.follow()
Player.draw(ventana)
Player.drawShoot(ventana)
pygame.display.update()
Game()
zombieN1
它不断向左移动,如您的def movement()
. 我希望当它与 中的一个发生zombieN1
碰撞时,它会被破坏。你们有人能帮我吗?如果您需要更多信息或更好的解释,请告诉我。我使用 Python 3.6.3。disparo(rectS)
Snake
zombieN1
该类的一些方法
pygame.sprite
旨在做到这一点,检测碰撞并销毁这样做的精灵。只要他们允许这样做pygame.sprite.spritecollide
。pygame.sprite.groupcollide
第一个允许检测精灵与一组精灵的碰撞,第二个检测两组之间的碰撞。我个人会对您的代码进行两项更改,特别是如果您希望能够同时在屏幕上显示多个“子弹”和多个“僵尸”:
你的“镜头”精灵应该有自己的类。视频游戏是 OOP 存在的令人信服的原因之一。如果需要,拥有自己的类将允许您(除了更好地封装代码之外)非常轻松地处理不同数量的镜头和不同类型,以及更轻松地处理碰撞和其他事件。
使用精灵组 (
pygame.sprite.Group()
)。如果您创建组来存储具有相同特征(敌人、射击等)的所有精灵,则由于上述方法,检测碰撞的任务要容易得多。我最终改变了很多东西,但是你可以做的一个例子如下:
我一直使用
groupcollide
它,因为作为一般规则,您同时有几个敌人和几个射击:前两个参数是观察碰撞的两组精灵,接下来的两个参数指示当每组中的一个碰撞时是否应该摧毁它们。
请注意,它会
groupcollide
返回一个包含它检测到的冲突的字典,您可以使用它来处理它们:字典
colisiones
将采用以下形式:pygame.sprite.collide_rect(sprite1, sprite2)
如果您只想拥有一个敌人和一枪,并且您不打算使用组,则可以使用以下内容:
同样的想法可以应用于你的角色和敌人来检测碰撞。
使用上面的代码和一些值得 Blender XD 大师的精灵,我们有以下内容:
版:
如果你想让一个敌人有几个生命,你只需要在它的类中创建那个属性,然后遍历返回的字典并从每个僵尸中减去一个生命,当它的生命属性小于或等于 0 时
groupcollide
调用它的方法kill
.一个非常灵活的选项是您可以
health
在敌人的类上定义一个属性并将其设为整数。当你造成伤害时,你会减去一定数量的生命,使其在达到零时被摧毁。这样做的好处是你可以使用不同的“武器”来造成不同的伤害。我给你一个使用这个想法的例子,在这种情况下,生命值为 300,每失去一颗子弹,你会损失 100。子弹的伤害在
damage
其类的属性中定义。你可以有另一种类型的“子弹”,造成 50 点伤害,另外 10 点,等等。我在 aproperty
旁边使用 asetter
,这样当它的生命达到零时,对象本身就会被销毁,面向对象的编程非常适合这些东西 :)在你的类
Bullet
中添加__init__
属性self.damage = 100
在类中
ZombieN1
添加属性self._health = 300
,__init__
然后我们定义属性health
和设置器:最后,在通过以下方式
while True
更改行groupcollide
:一切都会是这样的: