pgzero游戏开发(碰撞点击与线的绘制)

 一、素材准备

              

  蓝色小球     红色小球 

运行效果显示 

 

二、准备工作

一、代码框架

import pgzrun


def draw():
    pass


def update():
    pass


pgzrun.go()

二、窗口的设置

WIDTH=400
HEIGHT=400

设置宽和高的大小,创建一个400x400的屏幕

三、设置背景颜色

screen.fill('yellow')

在def draw()函数内添加背景填充,填充的颜色为黄色。

三、代码书写

一、获取坐标

def on_mouse_down(pos):
    lines.append(pos)
    print(lines)

定义了一个on_mouse_down的pzero内置获取鼠标按下的函数,只需要输入这个函数,我们在窗口中点击屏幕时就能获取到pos的返回值。并且将它放入一个列表内,以供后续的使用。通过print打印查看坐标内容。

二、直线绘制

通过两点确定一条直线,所以我们需要获取到至少两个点的坐标数据。

直线的绘制方式

screen.draw.line(起始坐标,终点坐标,(R,G,B))

screen.draw.line(起始坐标,终点坐标,'颜色')

def draw():
    screen.fill('yellow')
    if len(lines)>=2:#确保列表长度大于等于2   
        screen.draw.line(lines[0],lines[1],'red')#拿取列表中的第一位数据和第二位数据

三、小球的生成与绘制

from random import randint#导入randint函数
lines=[]
dots=[]
N=10
def make_dot(n):
    for i in range(n):
        dot=Actor('dot')
        dot.pos=randint(10,390),randint(10,390)
        dots.append(dot)
make_dot(N)
def draw():
    screen.fill('yellow')
    for dot in dots:
        dot.draw()
    if len(lines)>=2:#确保列表长度大于等于2   
        screen.draw.line(lines[0],lines[1],'red')#拿取列表中的第一位数据和第二位数据
    pass

创建一个make_dot函数,这个函数用于循环创建指定次数的小球。

四、为每个小球生成一个数字,根据小球生成排序来一次绘制数字。

#生成数字
def make_number():
    for n,dot in enumerate(dots):#获取次数和内容
        screen.draw.text(f'{n}',center=dot.pos,fontsize=20)#将次数当做内容输出    

可以看到这里用到了screen.draw.text()函数,它用用于显示文本的

screen.draw.text(text,fontname=,fontsize=,center=,color)

fnotname需要文字文件,并建立一个名为fonts的文件夹,将文字文件放在里面。

enumerate函数可以返回该内容的此时对应的索引值和数值。

def on_mouse_down(pos):
    global next_dot
    if dots[next_dot].collidepoint(pos):#从第一个小球开始判定,所以需要所以列表中的第一个值
        if next_dot<len(dots):#来一个值记录此时是否还在范围内
            lines.append(dots[next_dot].pos)#将此时的小球坐标存入坐标列表中
            next_dot+=1#获取下一个值
            print(lines)
    else:
        lines.clear()#如果点击的值不是按照顺序来则会清空坐标列表
        next_dot=0#将索引变回0

通过鼠标点击获取坐标点。

四、完整代码

import pgzrun
from random import randint

WIDTH=400
HEIGHT=400

dots=[]
lines=[]
next_dot=0
N=10
def make_dot(n):
    for i in range(n):
        dot=Actor('dot')
        dot.pos=randint(10,390),randint(10,390)
        dots.append(dot)
make_dot(N)


def make_number():
    for n,dot in enumerate(dots):
        screen.draw.text(f'{n}',center=dot.pos,fontsize=20)
    
def draw():
    screen.fill('yellow')
    for dot in dots:
        dot.draw()
    for i in range(1,len(lines)):
        screen.draw.line(lines[i-1],lines[i],'red')
    make_number()
def on_mouse_down(pos):
    global next_dot
    if dots[next_dot].collidepoint(pos):#从第一个小球开始判定,所以需要所以列表中的第一个值
        if next_dot<len(dots):#来一个值记录此时是否还在范围内
            lines.append(dots[next_dot].pos)#将此时的小球坐标存入坐标列表中
            next_dot+=1#获取下一个值
            print(lines)
    else:
        lines.clear()#如果点击的值不是按照顺序来则会清空坐标列表
        next_dot=0#将索引变回0
            
               
    pass




def upate():
    pass



pgzrun.go()

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值