Pygame,未选择ch

2024-06-26 00:17:03 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,可能有两个简短的信息:我是字面上的编程,因为只有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()

提前感谢您的帮助:)


Tags: andselfnoneeventfalsetruemapif
2条回答

我认为问题在于你把字符绘制()方法(用于更改正方形的位置),然后将角色的选定成员实际设置为True。你知道吗

代码的问题在于以下检查:

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位置都需要与原始位置不同。这会产生以下效果:

example scenario

所以基本上,只要X或Y的位置保持不变,就可以随意移动角色。你不需要总是只改变X或Y的位置,你可以在每次点击之间切换。你知道吗

要解决此问题,您必须调整检查以检查任何位置更改:

(clickAt[0] != char.x or clickAt[1] != char.y)

这也是您稍后执行的检查(checkDe 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

相关问题 更多 >