首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎样才能改变弹丸在游戏中的位置而不改变它面对的每一个循环?

我怎样才能改变弹丸在游戏中的位置而不改变它面对的每一个循环?
EN

Stack Overflow用户
提问于 2014-05-17 22:59:47
回答 1查看 55关注 0票数 0

我已经写了下面的代码,在我看来它应该工作,但它似乎"firedir“经常被设置为”面向“,而不仅仅是鼠标点击。用这段代码,当字符改变方向时,或面对屏幕上的任何投射物也会改变方向。(这是Python3.3版)

我写它的方式有什么问题?有什么更好的方法来实现这一点吗?

代码语言:javascript
复制
def update(char1, laser_list, facing, firedir):
 keys = pygame.key.get_pressed()
 if (keys[pygame.K_LEFT] or keys[pygame.K_a]): 
    char1.rect.x -= 2
    facing = "left"
 elif (keys[pygame.K_DOWN] or keys[pygame.K_s]): 
    char1.rect.y += 2
    facing = "down"
 elif (keys[pygame.K_UP] or keys[pygame.K_w]): 
    char1.rect.y -= 2
    facing = "up"
 elif (keys[pygame.K_RIGHT] or keys[pygame.K_d]): 
    char1.rect.x += 2
    facing = "right"

 if laser_list:
    #Move the laser
    if firedir == "up":
        laser.rect.y -= 4
    elif firedir == "down":
        laser.rect.y += 4
    elif firedir == "left":
        laser.rect.x -= 4
    elif firedir == "right":
        laser.rect.x += 4


 return(facing)

#main loop
done = False
while not done:
 for event in pygame.event.get():
    if event.type == pygame.QUIT:
        done = True

    if event.type == pygame.MOUSEBUTTONDOWN:
        if not laser_list:
            laser = Laser(facing)
            laser.rect.x = (char1.rect.x + 10)
            laser.rect.y = (char1.rect.y + 10)
            all_sprites_list.add(laser)
            laser_list.add(laser)

            firedir = facing


#update sprites
facing = update(char1, laser_list, facing, facing)  
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-18 00:13:31

这个问题是,您将facing作为firedir传递,此时您应该读取传递给Laser构造函数的面向。我不知道保存在哪里(因为您没有显示Laser类定义),但我认为您想让update执行如下操作:

代码语言:javascript
复制
def update(char1, laser_list): # fewer parameters
    # key reading stuff, as before, which sets the local variable `facing`

    for laser in laser_list:       # loop over all lasers in the list
        if laser.firedir == "up":  # check an attribute of the laser for its direction
            laser.rect.y -= 4
        elif laser.firedir == "down":
            laser.rect.y += 4
        elif laser.firedir == "left":
            laser.rect.x -= 4
        elif laser.firedir == "right":
            laser.rect.x += 4

    return facing  # the returned facing will be used for lasers fired in the next frame!

另一种可能比较容易的方法是在激光上存储一个velocity矢量,而不是一个方向字符串。然后,您可以使用相同的更新代码,不管激光瞄准的方向(即使是对角线,如果你允许的话,将只是工作)。我不知道Laser设置代码是什么,但是update逻辑是:

代码语言:javascript
复制
 laser.rect.x += laser.velocity.x
 laser.rect.y += laser.velocity.y
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23716919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档