类属性变量未更新

时间:2017-05-04 19:43:58

标签: python-3.x if-statement tkinter

我正在创造一个游戏,其中玩家是一艘必须躲避坠落的流星的船。我有2个班,船和流星。通过使它们的画布对象沿y轴向下移动并且它们的y坐标被作为移动函数的数字减去,流星“下降”。我有一个if语句,用于检测流星是否已经通过画布的边界,它会删除这些流星,并在屏幕顶​​部创建新的流星,从而使得有多个流星似乎正在下降。船级具有类似的功能,可检测船是否已经越过画布的两侧,从而触发死亡功能。我在流星类中有一个功能,可以在Sneaky Turtle的回答的帮助下检测它是否重叠。现在,它几乎完成了,我只有一个问题。在3“轮”之后,流星应该变得更快。我如何实现这个是通过一个if语句来检查一个变量是否超过3.如果没有,变量加1.当它达到3时,它重置并添加(速度量)到流星的速度属性,这是在它移动时使用。问题是它只适用于第一个“波”之后,速度属性保持不变。所有声音功能都被注释掉,因此我不必上传文件。 代码:

from random import *
from tkinter import *
from time import *
print('''****Meteor Run****
Don't let the meteors hit you!
     A-Left D-Right ''')
sleep(1.25)
#from game_sounds import*
root=Tk()
c = Canvas(width=800,height=600,bg="#37061a")
c.pack()
m1=0
m2=0
m3=0
m4=0
m5=0
m6=0
m7=0
m8=0
direction=0
speed=0
score = 0
cont=True
class ship:
    def __init__(self,x1,y1,x2,y2):
        self.x1=x1
        self.y1=y1
        self.x2=x2
        self.y2=y2
        self.hitbox3=387.5 + x1
        self.shape=c.create_polygon(353+x1,380+y1,387.5+x1,310+y1,
                                    420+x1,380+y1,fill="Blue")
    def move(self):
     global direction
     if direction=="L":
      self.x1 = self.x1-10
      self.hitbox3 = self.hitbox3-10
      c.move(self.shape,-10,0)
      sleep(0.001)
      root.update()
     if direction=="R":
      self.x1 = self.x1+10
      self.hitbox3 = self.hitbox3+10
      c.move(self.shape,10,0)
      root.update()
      self.test_lost_in_space()
      sleep(0.001)
    def death(self):
     root.destroy()
     print("You Lost!")
     print("Score:",score)
#     death_sound()

    def test_lost_in_space(self):
        if self.hitbox3<=0:
            self.death()
        if self.hitbox3 >=800:
            self.death()
    def ship_explode(self):
        overlap = c.find_overlapping(353+self.x1,380+self.y1,420+self.x1,310+self.y1)
        if overlap != (self.shape,):
         self.death()
class meteor:
 def __init__(self,x1,y1):
     self.x1=x1
     self.y1=y1
     self.hitbox=89+x1
     self.speed=.75
     self.shape =c.create_polygon(1+x1,50+y1,34+x1,23+y1,67+x1,23+y1,
                                  89+x1,57+y1,64+x1,71+y1,27+x1,71+y1,fill="brown")
 def meteor_return(self):
     global m1
     global m2
     global m3
     global m4
     global m5
     global m6
     global m7
     global m8
     global speed
     global score
     if self.y1 >=600:
      c.delete(self)
      m1=meteor(randrange(0,700),randrange(6,12))
      m2=meteor(randrange(0,700),randrange(6,12))
      m3=meteor(randrange(0,700),randrange(6,12))
      m4=meteor(randrange(0,700),randrange(6,12))
      m5=meteor(randrange(0,700),randrange(6,12))
      m6=meteor(randrange(0,700),randrange(6,12))
      m7=meteor(randrange(0,700),randrange(6,12))
      m8=meteor(randrange(0,700),randrange(6,12))
      if speed!=3:
         speed=speed +1
         score = score + 1
 #        lvl_up()
      if speed==3: 
        speed=0
        self.speed= self.speed + .5
        print(self.speed)
        score = score + 5
  #      lvl_up_2()
 def meteor_fall(self):
     global speed
     self.y1 = self.y1 + self.speed
     c.move(self.shape,0,self.speed)
     root.update()
     self.meteor_return()
  #   ship1.ship_explode()
def ship_move(event):
    global direction
    if event.keysym=="a":
     direction="L"
     ship1.move()
    if event.keysym=="d":
     direction="R"
     ship1.move()
ship1 =ship(0,0,0,0)
m1=meteor(randrange(0,200),randrange(6,12))
m2=meteor(randrange(200,400),randrange(6,12))
m3 =meteor(randrange(400,600),randrange(6,12))
m4=meteor(randrange(600,800),randrange(6,12))
m5 =meteor(randrange(400,600),randrange(6,12))
m6=meteor(randrange(600,800),randrange(6,12))
m7 =meteor(randrange(400,600),randrange(6,12))
m8=meteor(randrange(600,800),randrange(6,12))
c.bind_all("<KeyPress-a>",ship_move)
c.bind_all("<KeyPress-d>",ship_move)
while cont ==True:
    m1.meteor_fall()
    m2.meteor_fall()
    m3.meteor_fall()
    m4.meteor_fall()
    m5.meteor_fall()
    m6.meteor_fall()
    m7.meteor_fall()
    m8.meteor_fall()
c.bind_all("<KeyPress-a>",ship_move)
c.bind_all("<KeyPress-d>",ship_move)
ship1.death()

1 个答案:

答案 0 :(得分:1)

我不会比较每个流星的x和y坐标,看它们是否在船舶坐标的范围内,而是使用find_overlapping来检测实际上与船舶重叠的地方。

如果除了流星和船只之外你的画布上什么都没有,你可以实现类似的东西:

ship_coords = c.coords(self.shape)
overlap = c.find_overlapping(*ship_coords)
if overlap != (self.shape, ):
    #Code to run when the meteors collide with the ship.
    ...

(self.shape, )是从您传递给find_overlapping的坐标返回的元组。我建议在Tkinter画布上阅读文档,看起来你刚刚开始学习!希望这对当下有所帮助。

如果您需要专门检测哪些项目与您的船舶重叠,那么Stack Overflow上有很多关于find_overlapping的其他问题和答案。