2017-05-04 68 views
0

我正在创建一个游戏,其中玩家是必须躲避流星的船只。我有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

,而不是比较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画布上的文档,好像你刚刚开始学习!不过希望这会有所帮助。

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

+0

TypeError:find_overlapping()缺少3个必需的位置参数:'y1','x2'和'y2' –

+0

已解决:刚刚用coords替换了ship_coords。 –