【发布时间】:2018-08-15 15:29:25
【问题描述】:
我最近在我的游戏中实施了一个健康系统(尽管是一个非常基本的系统),它的工作原理是,如果我的玩家与敌人发生碰撞,我就会失去健康。但是,我面临的问题是,只要我与敌人保持接触,我每秒就会失去 60 次生命值。
我真正想要的是:每次玩家与敌人碰撞时,它都会损失一大块生命值,但至少要等到一秒钟后才能再损失生命值。我试过使用 time.sleep ,但这似乎只是冻结了整个程序,而不仅仅是健康系统。这是我的代码;
主游戏
import pygame
from constants import *
from player import Player
from enemy import Enemy
import time
pygame.init()
screen = pygame.display.set_mode([500, 500])
pygame.display.set_caption('Labyrinth')
# Spawn player
player = Player(50, 50)
all_sprites_list = pygame.sprite.Group()
all_sprites_list.add(player)
# Spawn enemy
enemy = Enemy(150, 150)
enemy_sprites = pygame.sprite.Group()
enemy_sprites.add(enemy)
clock = pygame.time.Clock()
done = False
# ----- Event Loop
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
player.changespeed(-3, 0)
elif event.key == pygame.K_RIGHT:
player.changespeed(3, 0)
elif event.key == pygame.K_UP:
player.changespeed(0, -3)
elif event.key == pygame.K_DOWN:
player.changespeed(0, 3)
elif event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
player.changespeed(3, 0)
elif event.key == pygame.K_RIGHT:
player.changespeed(-3, 0)
elif event.key == pygame.K_UP:
player.changespeed(0, 3)
elif event.key == pygame.K_DOWN:
player.changespeed(0, -3)
# ----- Game Logic
all_sprites_list.update()
enemy_sprites.update(player)
player_hit_list = pygame.sprite.spritecollide(player, enemy_sprites, False)
for hit in player_hit_list:
player.health -= 10
time.sleep(1)
if player.health <= 0:
done = True
screen.fill(WHITE)
all_sprites_list.draw(screen)
enemy_sprites.draw(screen)
pygame.display.flip()
clock.tick(60)
pygame.quit()
播放器类
from constants import *
import pygame
class Player(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface([15, 15])
self.image.fill(BLACK)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.health = 10
self.change_x = 0
self.change_y = 0
def changespeed(self, x, y):
self.change_x += x
self.change_y += y
def update(self):
self.rect.x += self.change_x
self.rect.y += self.change_y
敌人等级
from constants import *
import pygame
class Enemy(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface([10, 10])
self.image.fill(RED)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
(常量文件只定义了黑色、红色和白色)
任何帮助都将不胜感激!
【问题讨论】:
-
这绝对是可行的(正如 Matthew Horst 的回答所示),但是您要解决的问题是每帧损失 10 hp 甚至 1 hp 是否太致命了?如果您只是使用浮点值来表示健康并且每帧损失 1/6 马力怎么办?无论如何,这绝对是一种不同的游戏体验,你可能有充分的理由想要这个;我只是想确保您知道这两种选择都很容易,因此您可以选择适合您游戏的任何一种,而不是您知道如何实施的任何一种。
-
在我刚刚给出的示例中,我只是使用了一些占位符值。在我的最终产品中,我的目标是有一个健康栏,每次命中都会带走一半的心,并且你有 x 数量的心,就像在其他游戏中看到的一样,例如以撒的绑定等。我可以想象这是一个非常困难的游戏,如果玩家死得跟示例中一样快!
-
当然可以,但你可以每 1/60 秒夺走 1/120 的心脏。您可以将其“四舍五入”到最近的半心进行展示。难度不会比每1秒夺走1/2颗心脏更糟糕。同样,两种设计都是合理的;您可以找到兼具这两种方式的街机(和复古)游戏,因此,如果您出于游戏设计的原因而不是看起来最容易实现的设计来选择您的设计,那就太好了。