Python Pygame 敌人碰撞
Python Pygame Enemy Collision
我有一个 pygame 游戏正在开发中,问题是当玩家与 lvl1a 和/或 lvl1b 发生碰撞时,它们会被摧毁,而玩家会变大。我将如何做到这一点?我知道我必须重新绘制场景,但是当我尝试让 lvl1a 和 lvl1b 不会消失时...
#! /usr/bin/env python
import os
import random
import pygame
import math
import sys
os.environ["SDL_VIDEO_CENTERED"] = "1"
winw = 600
winh = 600
screen = pygame.display.set_mode((winw, winh))
pygame.display.set_caption(" Charger V1 Lvl1")
clock = pygame.time.Clock()
player1 = pygame.rect.Rect(32, 32, 24, 24)
rect1 = pygame.rect.Rect(550, 550, 16, 16)
rect2 = pygame.rect.Rect(500, 850, 16, 16)
class Player(object):
def __init__(self):
self.rect = player1
def handle_keys(self):
key = pygame.key.get_pressed()
dist = 1
if key[pygame.K_LEFT]:
self.rect.move_ip(-2, 0)
if key[pygame.K_RIGHT]:
self.rect.move_ip(2, 0)
if key[pygame.K_UP]:
self.rect.move_ip(0, -2)
if key[pygame.K_DOWN]:
self.rect.move_ip(0, 2)
def draw(self, surface):
pygame.draw.rect(surface, (0, 0, 128), self.rect)
class Lvl1a(object):
def __init__(self):
self.rect = rect1
self.x = 0
self.y = 0
def move(self):
self.rect.move_ip(0, -1)
def draw(self, surface):
pygame.draw.rect(surface, (100, 100, 100), self.rect)
class Lvl1b(object):
def __init__(self):
self.rect = rect2
self.x = 0
self.y = 0
def move(self):
self.rect.move_ip(0, -1)
def draw(self, surface):
pygame.draw.rect(surface, (100, 100, 100), self.rect)
pygame.init()
player = Player()
clock = pygame.time.Clock()
lvl1a = Lvl1a()
lvl1b = Lvl1b()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
break
running = False
screen.fill((255, 255, 255))
lvl1b.draw(screen)
lvl1b.move()
lvl1a.draw(screen)
player.draw(screen)
lvl1a.move()
player.handle_keys()
pygame.display.update()
clock.tick(40)
首先,您需要使用 pygame.Rect.colliderect() 为玩家开辟一条与敌人碰撞的道路。 Rect.colliderect() 上的文档是 here.
为此,您可以向播放器添加一个新功能 class,如下所示:
def collide(self,enemy,enemy_list):
if self.rect.colliderect(enemy.rect): # Tests if the player is touching an enemy
enemy_list.remove(enemy) # Removes the enemy from the enemy list (Explained lower)
然后你可以做的是把敌人放在一个列表中,然后用这样的 for 循环渲染它们:
lvl1a = Lvl1a()
lvl1b = Lvl1b()
enemies = [lvl1a,lvl1b]
然后使用 for 循环在主循环中渲染它们:
for enemy in enemies: # Runs through the enemy list
enemy.move() # Moves the enemy
player.collide(enemy,enemies) # Checks if enemy is touching player
enemy.draw(screen) # Renders Enemies in the list
这样当玩家与敌人发生碰撞时,该敌人就会从敌人列表中移除,不再渲染。
希望对您有所帮助。如果您没有得到任何信息,请 post 发表评论,我会看看是否可以澄清我的答案。 :)
固定代码应如下所示:
#! /usr/bin/env python
import os
import random
import pygame
import math
import sys
os.environ["SDL_VIDEO_CENTERED"] = "1"
winw = 600
winh = 600
screen = pygame.display.set_mode((winw, winh))
pygame.display.set_caption(" Charger V1 Lvl1")
clock = pygame.time.Clock()
player1 = pygame.rect.Rect(32, 32, 24, 24)
rect1 = pygame.rect.Rect(550, 550, 16, 16)
rect2 = pygame.rect.Rect(500, 850, 16, 16)
class Player(object):
def __init__(self):
self.rect = player1
def handle_keys(self):
key = pygame.key.get_pressed()
dist = 1
if key[pygame.K_LEFT]:
self.rect.move_ip(-2, 0)
if key[pygame.K_RIGHT]:
self.rect.move_ip(2, 0)
if key[pygame.K_UP]:
self.rect.move_ip(0, -2)
if key[pygame.K_DOWN]:
self.rect.move_ip(0, 2)
def collide(self,enemy,enemy_list):
if self.rect.colliderect(enemy.rect): # Tests if the player is touching an enemy
enemy_list.remove(enemy) # Removes the enemy from the enemy list (Explained lower)
def draw(self, surface):
pygame.draw.rect(surface, (0, 0, 128), self.rect)
class Lvl1a(object):
def __init__(self):
self.rect = rect1
self.x = 0
self.y = 0
def move(self):
self.rect.move_ip(0, -1)
def draw(self, surface):
pygame.draw.rect(surface, (100, 100, 100), self.rect)
class Lvl1b(object):
def __init__(self):
self.rect = rect2
self.x = 0
self.y = 0
def move(self):
self.rect.move_ip(0, -1)
def draw(self, surface):
pygame.draw.rect(surface, (100, 100, 100), self.rect)
pygame.init()
player = Player()
clock = pygame.time.Clock()
lvl1a = Lvl1a()
lvl1b = Lvl1b()
enemies = [lvl1a,lvl1b] # Create the enemies list
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
break
running = False
screen.fill((255, 255, 255))
for enemy in enemies: # Runs through the enemy list
enemy.move() # Moves the enemy
player.collide(enemy,enemies) # Checks if enemy is touching player
enemy.draw(screen) # Renders Enemies in the list
player.draw(screen)
player.handle_keys()
pygame.display.update()
clock.tick(40)
我有一个 pygame 游戏正在开发中,问题是当玩家与 lvl1a 和/或 lvl1b 发生碰撞时,它们会被摧毁,而玩家会变大。我将如何做到这一点?我知道我必须重新绘制场景,但是当我尝试让 lvl1a 和 lvl1b 不会消失时...
#! /usr/bin/env python
import os
import random
import pygame
import math
import sys
os.environ["SDL_VIDEO_CENTERED"] = "1"
winw = 600
winh = 600
screen = pygame.display.set_mode((winw, winh))
pygame.display.set_caption(" Charger V1 Lvl1")
clock = pygame.time.Clock()
player1 = pygame.rect.Rect(32, 32, 24, 24)
rect1 = pygame.rect.Rect(550, 550, 16, 16)
rect2 = pygame.rect.Rect(500, 850, 16, 16)
class Player(object):
def __init__(self):
self.rect = player1
def handle_keys(self):
key = pygame.key.get_pressed()
dist = 1
if key[pygame.K_LEFT]:
self.rect.move_ip(-2, 0)
if key[pygame.K_RIGHT]:
self.rect.move_ip(2, 0)
if key[pygame.K_UP]:
self.rect.move_ip(0, -2)
if key[pygame.K_DOWN]:
self.rect.move_ip(0, 2)
def draw(self, surface):
pygame.draw.rect(surface, (0, 0, 128), self.rect)
class Lvl1a(object):
def __init__(self):
self.rect = rect1
self.x = 0
self.y = 0
def move(self):
self.rect.move_ip(0, -1)
def draw(self, surface):
pygame.draw.rect(surface, (100, 100, 100), self.rect)
class Lvl1b(object):
def __init__(self):
self.rect = rect2
self.x = 0
self.y = 0
def move(self):
self.rect.move_ip(0, -1)
def draw(self, surface):
pygame.draw.rect(surface, (100, 100, 100), self.rect)
pygame.init()
player = Player()
clock = pygame.time.Clock()
lvl1a = Lvl1a()
lvl1b = Lvl1b()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
break
running = False
screen.fill((255, 255, 255))
lvl1b.draw(screen)
lvl1b.move()
lvl1a.draw(screen)
player.draw(screen)
lvl1a.move()
player.handle_keys()
pygame.display.update()
clock.tick(40)
首先,您需要使用 pygame.Rect.colliderect() 为玩家开辟一条与敌人碰撞的道路。 Rect.colliderect() 上的文档是 here.
为此,您可以向播放器添加一个新功能 class,如下所示:
def collide(self,enemy,enemy_list):
if self.rect.colliderect(enemy.rect): # Tests if the player is touching an enemy
enemy_list.remove(enemy) # Removes the enemy from the enemy list (Explained lower)
然后你可以做的是把敌人放在一个列表中,然后用这样的 for 循环渲染它们:
lvl1a = Lvl1a()
lvl1b = Lvl1b()
enemies = [lvl1a,lvl1b]
然后使用 for 循环在主循环中渲染它们:
for enemy in enemies: # Runs through the enemy list
enemy.move() # Moves the enemy
player.collide(enemy,enemies) # Checks if enemy is touching player
enemy.draw(screen) # Renders Enemies in the list
这样当玩家与敌人发生碰撞时,该敌人就会从敌人列表中移除,不再渲染。
希望对您有所帮助。如果您没有得到任何信息,请 post 发表评论,我会看看是否可以澄清我的答案。 :)
固定代码应如下所示:
#! /usr/bin/env python
import os
import random
import pygame
import math
import sys
os.environ["SDL_VIDEO_CENTERED"] = "1"
winw = 600
winh = 600
screen = pygame.display.set_mode((winw, winh))
pygame.display.set_caption(" Charger V1 Lvl1")
clock = pygame.time.Clock()
player1 = pygame.rect.Rect(32, 32, 24, 24)
rect1 = pygame.rect.Rect(550, 550, 16, 16)
rect2 = pygame.rect.Rect(500, 850, 16, 16)
class Player(object):
def __init__(self):
self.rect = player1
def handle_keys(self):
key = pygame.key.get_pressed()
dist = 1
if key[pygame.K_LEFT]:
self.rect.move_ip(-2, 0)
if key[pygame.K_RIGHT]:
self.rect.move_ip(2, 0)
if key[pygame.K_UP]:
self.rect.move_ip(0, -2)
if key[pygame.K_DOWN]:
self.rect.move_ip(0, 2)
def collide(self,enemy,enemy_list):
if self.rect.colliderect(enemy.rect): # Tests if the player is touching an enemy
enemy_list.remove(enemy) # Removes the enemy from the enemy list (Explained lower)
def draw(self, surface):
pygame.draw.rect(surface, (0, 0, 128), self.rect)
class Lvl1a(object):
def __init__(self):
self.rect = rect1
self.x = 0
self.y = 0
def move(self):
self.rect.move_ip(0, -1)
def draw(self, surface):
pygame.draw.rect(surface, (100, 100, 100), self.rect)
class Lvl1b(object):
def __init__(self):
self.rect = rect2
self.x = 0
self.y = 0
def move(self):
self.rect.move_ip(0, -1)
def draw(self, surface):
pygame.draw.rect(surface, (100, 100, 100), self.rect)
pygame.init()
player = Player()
clock = pygame.time.Clock()
lvl1a = Lvl1a()
lvl1b = Lvl1b()
enemies = [lvl1a,lvl1b] # Create the enemies list
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
break
running = False
screen.fill((255, 255, 255))
for enemy in enemies: # Runs through the enemy list
enemy.move() # Moves the enemy
player.collide(enemy,enemies) # Checks if enemy is touching player
enemy.draw(screen) # Renders Enemies in the list
player.draw(screen)
player.handle_keys()
pygame.display.update()
clock.tick(40)