Pygame, 取消选择字符
Pygame, unselecting character
首先可能有两个简短的信息:我只学了 7 天就开始编程,而且我的英语不是很完美,所以请记住这一点:)。
那么,我想让这个程序做什么:
如果我点击角色(这里是一个绿色方块),我希望他被选中。之后,下一次单击会将其移动到该位置,并且不再选择该字符。如果我想把他调到一个新的位置,他需要再次被选中。
它的作用:
好吧,它在大部分情况下都有效,但偶尔(我猜是十分之一)我将能够移动角色两次而不是一次。谁能告诉我为什么?
代码:
import pygame, sys
from pygame.locals import*
MAP_WIDTH=20
MAP_HEIGHT=20
TILESIZE=40
clickAt=(None,None)
justClicked=False
newPos=False
pygame.init()
DISPLAYSURFACE=pygame.display.set_mode((MAP_WIDTH*TILESIZE,MAP_HEIGHT*TILESIZE))
###############################
class Character:
def __init__(self, name, x, y, texture):
self.name=name
self.x=x//40
self.y=y//40
self.texture=texture
self.selected=False
def draw(self):
pygame.draw.rect(DISPLAYSURFACE, (0, 0, 0), (self.x*TILESIZE,self.y*TILESIZE, TILESIZE, TILESIZE))
if self.selected==True:
self.x=clickAt[0]//40
self.y=clickAt[1]//40
self.selected=False
pygame.draw.rect(DISPLAYSURFACE, (0, 255, 0), (self.x*TILESIZE,self.y*TILESIZE, TILESIZE, TILESIZE))
Mustermann=Character('Frodo', 33, 79, 'test')
Characters=[Mustermann]
##################################
while True:
#checking the events#
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
print ("mouse at (%d, %d)" % event.pos)
clickAt=event.pos
justClicked=True
#render characters#
for char in Characters:
#check if character is about to be placed on a new position
if clickAt[0]!=None and (clickAt[0]//40)!=char.x and (clickAt[1]//40)!=char.y:
newPos=True
char.draw()
#if placed on a new position let char.seletcted in False until character is clicked on again
if newPos==True:
newPos=False
justClicked=False
#check if klicked on character#
for char in Characters:
if clickAt[0]!=None and justClicked==True and (clickAt[0]//40)==char.x and (clickAt[1]//40)==char.y:
char.selected=True
pygame.display.update()
在此先感谢您的帮助:)
我认为问题在于您在实际将 Character 的选定成员设置为 True 之前调用了 char.draw() 方法(它改变了方块的位置)。
您的代码存在以下检查问题:
if clickAt[0] != None and (clickAt[0]//40) != char.x and (clickAt[1]//40) != char.y:
假设clickAt[0] != None
为真,进行以下检查:
clickAt[0] != char.x and clickAt[1] != char.y
因此,为了使条件成立, 您点击的 X 和 Y 位置都需要与原始位置不同。这允许以下效果:
所以基本上,只要 X 或 Y 位置保持不变,您就可以随意移动角色。而且您也不必总是只更改 X 或 Y 位置,您可以在每次点击之间切换。
要解决此问题,您必须调整检查以检查 任何 位置变化:
(clickAt[0] != char.x or clickAt[1] != char.y)
这也是您稍后进行的检查(检查 De Morgan’s laws)的实际逆向:
(clickAt[0]//40) == char.x and (clickAt[1]//40) == char.y
所以你的完整条件是这样的:
if clickAt[0] is not None and ((clickAt[0]//40) != char.x or (clickAt[1]//40) != char.y):
newPos = True
首先可能有两个简短的信息:我只学了 7 天就开始编程,而且我的英语不是很完美,所以请记住这一点:)。
那么,我想让这个程序做什么: 如果我点击角色(这里是一个绿色方块),我希望他被选中。之后,下一次单击会将其移动到该位置,并且不再选择该字符。如果我想把他调到一个新的位置,他需要再次被选中。
它的作用: 好吧,它在大部分情况下都有效,但偶尔(我猜是十分之一)我将能够移动角色两次而不是一次。谁能告诉我为什么?
代码:
import pygame, sys
from pygame.locals import*
MAP_WIDTH=20
MAP_HEIGHT=20
TILESIZE=40
clickAt=(None,None)
justClicked=False
newPos=False
pygame.init()
DISPLAYSURFACE=pygame.display.set_mode((MAP_WIDTH*TILESIZE,MAP_HEIGHT*TILESIZE))
###############################
class Character:
def __init__(self, name, x, y, texture):
self.name=name
self.x=x//40
self.y=y//40
self.texture=texture
self.selected=False
def draw(self):
pygame.draw.rect(DISPLAYSURFACE, (0, 0, 0), (self.x*TILESIZE,self.y*TILESIZE, TILESIZE, TILESIZE))
if self.selected==True:
self.x=clickAt[0]//40
self.y=clickAt[1]//40
self.selected=False
pygame.draw.rect(DISPLAYSURFACE, (0, 255, 0), (self.x*TILESIZE,self.y*TILESIZE, TILESIZE, TILESIZE))
Mustermann=Character('Frodo', 33, 79, 'test')
Characters=[Mustermann]
##################################
while True:
#checking the events#
for event in pygame.event.get():
if event.type==QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
print ("mouse at (%d, %d)" % event.pos)
clickAt=event.pos
justClicked=True
#render characters#
for char in Characters:
#check if character is about to be placed on a new position
if clickAt[0]!=None and (clickAt[0]//40)!=char.x and (clickAt[1]//40)!=char.y:
newPos=True
char.draw()
#if placed on a new position let char.seletcted in False until character is clicked on again
if newPos==True:
newPos=False
justClicked=False
#check if klicked on character#
for char in Characters:
if clickAt[0]!=None and justClicked==True and (clickAt[0]//40)==char.x and (clickAt[1]//40)==char.y:
char.selected=True
pygame.display.update()
在此先感谢您的帮助:)
我认为问题在于您在实际将 Character 的选定成员设置为 True 之前调用了 char.draw() 方法(它改变了方块的位置)。
您的代码存在以下检查问题:
if clickAt[0] != None and (clickAt[0]//40) != char.x and (clickAt[1]//40) != char.y:
假设clickAt[0] != None
为真,进行以下检查:
clickAt[0] != char.x and clickAt[1] != char.y
因此,为了使条件成立, 您点击的 X 和 Y 位置都需要与原始位置不同。这允许以下效果:
所以基本上,只要 X 或 Y 位置保持不变,您就可以随意移动角色。而且您也不必总是只更改 X 或 Y 位置,您可以在每次点击之间切换。
要解决此问题,您必须调整检查以检查 任何 位置变化:
(clickAt[0] != char.x or clickAt[1] != char.y)
这也是您稍后进行的检查(检查 De Morgan’s laws)的实际逆向:
(clickAt[0]//40) == char.x and (clickAt[1]//40) == char.y
所以你的完整条件是这样的:
if clickAt[0] is not None and ((clickAt[0]//40) != char.x or (clickAt[1]//40) != char.y):
newPos = True