我正在尝试在 pygame 中重新创建游戏蛇作为介绍,但是我正在努力解决如何在蛇移动时为蛇的每个方块创建渐变。我的其余代码都是有效的。
我编写了以下代码:
import colorsys
class Snake:
def __init__(self):
self.body = [Vector2(5,no_cell/2), Vector2(4,no_cell/2), Vector2(3,no_cell/2)]
self.direction = Vector2(1,0)
self.new_block = False
self.start_hue = 0.0
self.end_hue = 0.7
self.num_steps = 20
def generate_gradient(self, start_hue, end_hue, num_steps):
hues = []
for i in range(num_steps):
hue = start_hue + (end_hue - start_hue) * (i / (num_steps - 1))
hues.append(hue % 1.0)
colours = [colorsys.hsv_to_rgb(hue, 1.0, 1.0) for hue in hues]
return colours
def draw_snake(self):
colours = self.generate_gradient(self.start_hue, self.end_hue,
self.num_steps)
for rgb in colours:
for block in self.body:
x_pos = int(block.x * cell_size)
y_pos = int(block.y * cell_size)
block_rect = pygame.Rect(x_pos + grid_border, y_pos +
heading_border + grid_border, cell_size, cell_size)
rgb = tuple(int(value * 255) for value in rgb)
pygame.draw.rect(screen, rgb, block_rect)
当我运行此代码时,出现以下错误: “pygame.draw.rect(屏幕,rgb,block_rect) ValueError:无效的颜色参数”
遇到的错误是因为在
pygame.draw.rect()
中传递了一个无效的
rgb
值。这可能是由于以下代码行导致的:
rgb = tuple(int(value * 255) for value in rgb)
这里的问题是正在迭代
rgb
元组本身,并将每个值 (r、g、b) 乘以 255,然后尝试将其转换为整数。这将导致超出 0 到 255 范围的值,而 Pygame 不允许这样做。
以下是如何修复代码以正确应用渐变的方法:
import pygame
import colorsys
from pygame.math import Vector2
class Snake:
def __init__(self):
self.body = [Vector2(5, no_cell / 2), Vector2(4, no_cell / 2), Vector2(3, no_cell / 2)]
self.direction = Vector2(1, 0)
self.new_block = False
self.start_hue = 0.0
self.end_hue = 0.7
self.num_steps = len(self.body) # 渐变步骤数应与蛇身段数一致
def generate_gradient(self, start_hue, end_hue, num_steps):
hues = [start_hue + (end_hue - start_hue) * (i / (num_steps - 1)) for i in range(num_steps)]
colours = [colorsys.hsv_to_rgb(hue, 1.0, 1.0) for hue in hues]
return colours
def draw_snake(self):
colours = self.generate_gradient(self.start_hue, self.end_hue, self.num_steps)
for i, block in enumerate(self.body):
x_pos = int(block.x * cell_size)
y_pos = int(block.y * cell_size)
block_rect = pygame.Rect(x_pos + grid_border, y_pos + heading_border + grid_border, cell_size, cell_size)
rgb = tuple(int(value * 255) for value in colours[i]) # 获取当前段的颜色
pygame.draw.rect(screen, rgb, block_rect)
更改:
-
渐变步骤数:
我们将
self.num_steps
设置为len(self.body)
,以便每个蛇身段都获得唯一的颜色。 -
颜色应用:
在
draw_snake
中,我们使用enumerate
迭代蛇身段及其索引。然后,我们使用索引i
从colours
列表中获取相应的颜色。 -
颜色转换:
我们只在绘制每个段时才将当前段的颜色
colours[i]
转换为 RGB 元组。
通过这些更改,代码现在应该能够正常工作,并为蛇身创建平滑的渐变效果。
标签:python,colors,pygame From: 78326655