簡體   English   中英

如何在python烏龜游戲中按鍵運行類或函數?

[英]How to run a class or function per key in a python turtle game?

當我按下向左或向右按​​鈕時,我的角色應該向左或向右射擊,而在游戲開始時,我的角色將射擊。 當我嘗試按向左或向右時,什么也沒有發生。 當“球”撞到汽車上時,它應該消失了。希望有人能幫忙!

import turtle, random, math, time, os, sys
from pygame import mixer
from tkinter import *

def main():

    mixer.init()

    WIDTH = 800
    HEIGHT = 600

    fenster = turtle.Screen()
    fenster.setup(WIDTH, HEIGHT,0,0)
    fenster.title("Crossy Road von Julian")
    fenster.bgpic('back.gif')
    fenster.tracer(0)

    colors = ["white", "orange", "yellow", "blue", "gray"]
    images = ["a.gif", "b.gif", "c.gif", "p.gif", "f.gif"]
    music = ["m.waf"]

    sound1 = mixer.Sound("m.wav")
    sound1.play()

    for image in images:
        turtle.register_shape(image)    

    class Bus(turtle.Turtle):
        def __init__(self):
            super(Bus, self).__init__()
            self.penup()
            self.shape("square")
            self.shapesize(4,40)
            self.pencolor("white")
            self.setpos(0, -260)
            self.in_game_speed = 0


        def update(self):
            self.goto(self.xcor() + self.in_game_speed, self.ycor())
            if self.xcor() > WIDTH:
                self.setx(-600)
                self.fillcolor("Gray")

    class ShootLeft(turtle.Turtle):
        def __init__(self):
            super(ShootLeft, self).__init__()
            self.penup()
            self.shape("circle")
            self.shapesize(0.5)
            self.pencolor("white")
            self.fillcolor("white")
            self.setpos(0,-200)
            self.directions = ["left"]
            self.direction = "left"
            self.in_game_speed = 0.3

        def update(self):
            self.goto(self.xcor() - self.in_game_speed, self.ycor())

    class ShootRight(turtle.Turtle):
        def __init__(self):
            super(ShootRight, self).__init__()
            self.penup()
            self.shape("circle")
            self.shapesize(0.5)
            self.pencolor("white")
            self.fillcolor("white")
            self.setpos(0,-200)
            self.directions = ["right"]
            self.direction = "right"
            self.in_game_speed = 0.3

        def update(self):
            self.goto(self.xcor() + self.in_game_speed, self.ycor())


    class Auto(turtle.Turtle):
        def __init__(self):
            super(Auto, self).__init__()
            self.penup()
            self.shape("square")
            self.shapesize(2,5)
            self.directions = ["left", "right"]
            self.direction = "left"
            self.in_game_speed = 0.2

        def is_collision(self, other):
            a = self.xcor() - other.xcor(self)
            b = self.ycor() - other.ycor(self)
            distance = math.sqrt((a**2) + (b**2))
            if distance < 25:
                return True
            else:
                return False


        def update(self):

            if self.is_collision(ShootLeft):
                pass
            if self.is_collision(ShootRight):
                pass
            if self.direction == "right":
                self.goto(self.xcor() + self.in_game_speed, self.ycor())
            else:
                self.goto(self.xcor() - self.in_game_speed, self.ycor())



    class Spieler(turtle.Turtle):
        def __init__(self, auto):
            super(Spieler, self).__init__()
            self.penup()
            self.shape("p.gif")
            self.shapesize(1,1)
            self.setpos(0, -200)
            self.in_game_speed = 4.3
            self.speed(0)
            self.score = 0

        def right(self):
            self.goto(self.xcor() + self.in_game_speed, self.ycor())

        def left(self):
            self.goto(self.xcor() - self.in_game_speed, self.ycor())

        def up(self):
            self.goto(self.xcor(), self.ycor() + self.in_game_speed)

        def down(self):
            self.goto(self.xcor(), self.ycor() - self.in_game_speed)

        def powershell(self):
            os.system('start powershell.exe')

        def is_collision(self, other):
            a = self.xcor() - other.xcor()
            b = self.ycor() - other.ycor()
            distance = math.sqrt((a**2) + (b**2))
            if distance < 25:
                return True
            else:
                return False

        def update(self):
            for auto in group_1:
                if self.is_collision(auto):
                    sys.exit()




    group_1 = []
    for auto in range(1):
        auto = Auto()
        auto.sety(-200)
        auto.setx(900)
        auto.in_game_append = 1
        auto.shape("a.gif")
        group_1.append(auto)



    bus = Bus()
    sl = ShootLeft()
    sr = ShootRight()
    spieler = Spieler(auto)

    turtle.listen()
    fenster.onkeypress(spieler.right,"d")
    fenster.onkeypress(spieler.left,"a")
    fenster.onkeypress(spieler.powershell,"p")

    running = True
    while running:
        fenster.update()
        spieler.update()
        for auto in group_1:
            auto.update()
        bus.update()
        fenster.onkeypress(sl.update(),"Left")
        fenster.onkeypress(sr.update(),"Right")


    turtle.mainloop()




main()

sl向左射擊,sr向右射擊

問題是這兩行:

fenster.onkeypress(sl.update(),"Left")
fenster.onkeypress(sr.update(),"Right")

首先,它們不需要處於循環中-在循環足夠之前調用它們一次。 其次,它們的第一個參數應該是要調用的函數,而不是被調用的函數。 由於slsr不返回函數,因此將是:

fenster.onkeypress(sl.update, "Left")
fenster.onkeypress(sr.update, "Right")

running = True
while running:

還有其他問題,但這似乎解決了您的直接問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM