豌豆射手

豌豆射手

李兴球Python植物大战僵尸里的豌豆射手动画演示


植物大战僵尸里的豌豆射手,可以用鼠标指针拖动它们。以下是部分源码。

"""
   豌豆射手.py
   本程序定义了一个Shooter类,它继承自Turtle类。
   实例化后,它会启动一个不断切换造型的线程。
   但是它的子弹是用屏幕的定时器功能实现不断地移动的。
"""
import time
from random import randint
from PIL import Image,ImageTk
from threading import Thread
from turtle import Turtle,Screen,Shape

def appendcostume(imagefile,screen):
    """添加图形到屏幕的造型字典"""
    pass                              # 这里省略部分代码 
    
class Shooter(Turtle):
    def __init__(self,frames,pos):
        Turtle.__init__(self,shape='blank')
        self.penup()
        self.speed(0)
        self.goto(pos)
        self.index = 0
        self.frames = frames
        self.amounts = len(frames)
        pass                              # 这里省略部分代码    
        self.sw = self.screen.window_width()
        self.sh = self.screen.window_height()
        
    def altcostume(self):
        """不断地切换造型,这在一个线程中"""
        while True:
            self.shape(self.frames[self.index])
            self.index += 1
            self.index %= self.amounts
            time.sleep(0.2)
            if randint(1,10)==1 and not self.bullet.isvisible():
                self.bullet.showturtle()
                self.begin_shoot()
                
    def begin_shoot(self):
        """开始准备发射"""
        if  self.bullet.isvisible():
            self.bullet.setx(self.xcor() + 10)
            self.bullet.sety(self.ycor() + 10)
            self.shooting()
            
    def shooting(self):
        """如果是可见的,则移动。
           在移动的过程中,如果超过边缘就隐藏
           否则不断地调用shooting,实现‘重复执行’。
        """
        if self.bullet.isvisible():
            self.bullet.fd(10)
            if self.bullet.xcor()>self.sw//2:
                self.bullet.ht()
            else:
                self.screen.ontimer(self.shooting,50)        

def main():
    screen = Screen()
    screen.delay(0)
    screen.bgpic('院子.png')
    screen.setup(960,720)
    frames = [f"wd/{i}.png" for i in range(22)]
    [appendcostume(frame,screen) for frame in frames]

    for y in range(150,-250,-80):
       Shooter(frames,(-200,y))
    screen.mainloop()

if __name__ == "__main__":
    main()

需要完整源代码和素材请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

李兴球

李兴球的博客是Python创意编程原创博客