我正在用Pygame制作一个简单的基于平铺的游戏。
目前,它显示一个随机选择的10x10网格。这部分工作得很好,但是突出显示我有问题。
当您将鼠标悬停在图块上时,它应该以大约一半的不透明度加载灰色图块。它加载,但不透明度无法正常工作。如果将鼠标放在图块上,则会使用不透明度和所有图像正确加载。但是如果你在瓷砖周围移动鼠标,它会变为正常,没有不透明度。
我认为这种情况正在发生,因为它每次发生事件时都会加载突出显示图块,但我不确定如何修复它。
我正在使用一个名为Tilemap的类来生成和绘制tilemap。我认为draw()
函数中的某些东西导致了所有这些。
import pygame
import sys
import random
from pygame.locals import *
running = True
class Tilemap:
tilemap = []
ht = None # ht = highlight texture
def __init__(self, height, width, tilesize, textures):
self.height = height # How many tiles high it is
self.width = width # How many tiles wide it is
self.tilesize = tilesize # How many pixels each tile is
self.textures = textures # The textures
self.size = (self.width*self.tilesize,self.height*self.tilesize)
def generate_random(self):
# Generate a random tilemap
self.tilemap = [[random.randint(0, len(
self.textures)-1) for e in range(self.width)] for e in range(
self.height)]
def draw(self, display, mouse=None):
mouse = mouse
# Draw the map
for row in range(self.width):
for column in range(self.height):
texture = self.textures[self.tilemap[row][column]]
# Highlight a tile (this is where the problem is)
if self.ht != None:
if mouse[0] >= (column*self.tilesize) and mouse[0] <= (
column*self.tilesize)+self.tilesize:
if mouse[1] >= (row*self.tilesize) and mouse[1] <= (
row*self.tilesize)+self.tilesize:
texture = self.ht
display.blit(texture,
(column*self.tilesize, row*self.tilesize))
tilemap = Tilemap(10,10,40,
# Load the textures
{0: pygame.image.load("tile1.png"),
1: pygame.image.load("tile2.png")
}
)
tilemap.generate_random() # Generate a random tilemap
pygame.init()
DISPLAYSURF = pygame.display.set_mode((tilemap.size))
# Load the highlighter
tilemap.ht = pygame.image.load("highlight.png").convert_alpha()
while running:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
# Draw the tilemap
tilemap.draw(DISPLAYSURF, pygame.mouse.get_pos())
pygame.display.update()
如果您需要更多解释,请随时提出!
答案 0 :(得分:1)
如果您在tilemap.ht.set_alpha(<VALUE>)
while running:
# Load the highlighter
tilemap.ht = pygame.image.load("highlight.png").convert(8)
tilemap.ht.set_alpha(64)
瓷砖将是透明的。该值介于0到255之间(含)。我还将convert_alpha()
更改为convert(8)
,因此它是8位。
来源:
how to use pygame set_alpha() on a picture
附加说明:您可能希望实现跟踪哪个方框突出显示,以便在选择新图块之前不会再次绘制。此时,当鼠标移动时,它将继续在所选图块上绘制正方形,从而使其变得不那么透明。
示例:
初始选择与继续选择
答案 1 :(得分:0)
每次在Pygame中绘制曲面时,前一帧的数据都会持续存在。 由于您正在绘制alpha,因此先前的部分透明绘图仍位于相同位置,并且您在每个帧的同一点上绘制部分透明的平铺。这导致该正方形越来越接近最终颜色。你通常会做的是擦除你正在进行的区域,然后重新绘制。在这种情况下,您需要在display.blit:
之前执行此操作display.fill((0,0,0), (0, 0, column*self.tilesize, row*self.tilesize))
display.blit(texture, (column*self.tilesize, row*self.tilesize))
只要您的背景为黑色,这将有效。如果你最终得到一个背景图像,你只需在那里blit背景图像切片。
此代码未经测试,因为我没有您的示例PNG,但如果您有问题,请告诉我,我会更新答案。