区块.碰撞点检测(点位置)如果点与区块重叠(碰撞),则该函数返回 True。
我们利用这个功能做一个用鼠标拖动矩形的实例. 使用该方法以检查鼠标单击是否发生在区块内。 如果是这种情况,我们通过鼠标拖动矩形.
变量移动中是在鼠标按钮在区块内按下时设置的。 在按钮鼠标松开之前,它保持 True。区块仅在鼠标单击区块时移动 。当区块移动时,我们添加一个蓝色轮廓。
from zwpy import *
import zwpy.pygame_zw as g
g.初始化()
屏幕=g.显示.设置模式( (500, 200) )
矩形区块 = g.区块类(50, 60, 200, 80)
移动中=假
while 真:
for 事件 in g.事件.获取():
if 事件.类型 == g.退出事件:
g.退出游戏()
退出程序()
elif 事件.类型 == g.鼠标按下事件:
if 矩形区块.碰撞点检测(事件.鼠标位置):
移动中 = 真
elif 事件.类型 == g.鼠标松开事件:
移动中 = 假
elif 事件.类型 == g.鼠标移动事件 and 移动中:
# 下面`事件.鼠标相对位置`前面的*是拆分出相对移动的x,y, 因为移动_ip方法必须是两个参数
矩形区块.移动_ip(*事件.鼠标相对位置)
屏幕.填充('gray')
g.绘图.矩形(屏幕, 'red', 矩形区块)
if 移动中:
g.绘图.矩形(屏幕, 'blue', 矩形区块, 4)
g.显示.更新()
区块与多个点碰撞
与多个点碰撞, 可以使用点列表循环检查. 在下面的程序中,我们创建 100 个随机点, 如果它们落在矩形内,将它们涂成红色,矩形外则涂成蓝色。
每次按下 R 键时,都会创建 100 个新的随机点。
rom zwpy import *
import zwpy.pygame_zw as g
def 产生随机点(数目):
点列表 = 列表()
for _ in 范围(数目):
x = 随机整数(0, 500)
y = 随机整数(0, 200)
点列表.添加((x, y))
return 点列表
g.初始化()
屏幕宽度,屏幕高度=500, 200
屏幕=g.显示.设置模式( (屏幕宽度,屏幕高度) )
矩形区块 = g.区块类(50, 60, 200, 80)
随机点 = 产生随机点(100)
while 真:
for 事件 in g.事件.获取():
if 事件.类型 == g.退出事件:
g.退出游戏()
退出程序()
if 事件.类型 == g.键盘按下事件:
if 事件.键 == g.K_r:
随机点 = 产生随机点(100)
屏幕.填充('gray')
g.绘图.矩形(屏幕, 'green', 矩形区块, 2)
for 点位置 in 随机点:
if 矩形区块.碰撞点检测(点位置):
g.绘图.圆(屏幕, 'red', 点位置, 4, 0)
else:
g.绘图.圆(屏幕, 'blue', 点位置, 4, 0)
g.显示.更新()
区块与区块的碰撞
区块.碰撞区块检测(区块)方法检查一个区块是否与另一个区块冲突。 在下面的程序中,我们创建 50 个随机矩形,如果它们在绿色矩形内部, 就将它们着色为红色.
每次按下 R 键时,都会创建 50 个新的随机矩形。
from zwpy import *
import zwpy.pygame_zw as g
def 产生随机矩形(数目):
矩形列表 = 列表()
for _ in 范围(数目):
x = 随机整数(0, 500)
y = 随机整数(0, 200)
矩形列表.添加(g.区块类(x, y, 30, 30))
return 矩形列表
g.初始化()
屏幕宽度,屏幕高度=500, 200
屏幕=g.显示.设置模式( (屏幕宽度,屏幕高度) )
矩形区块 = g.区块类(50, 60, 200, 80)
随机矩形 = 产生随机矩形(30)
while 真:
for 事件 in g.事件.获取():
if 事件.类型 == g.退出事件:
g.退出游戏()
退出程序()
if 事件.类型 == g.键盘按下事件:
if 事件.键 == g.K_r:
随机矩形 = 产生随机矩形(30)
屏幕.填充('gray')
g.绘图.矩形(屏幕, 'green', 矩形区块, 2)
for 矩形 in 随机矩形:
if 矩形区块.碰撞区块检测(矩形):
g.绘图.矩形(屏幕, 'red', 矩形, 4)
else:
g.绘图.矩形(屏幕, 'blue', 矩形, 4)
g.显示.更新()
多个区块之间的碰撞
区块.碰撞区块检测(区块)方法检查一个区块是否与另一个区块冲突。 如果我们想知道是否有任何两个重叠的区块, 然后我们必须将每个区块相互比较。这需要进行两次的嵌套循环, 让每个区块逐个与其他区块一一比较。(这个写法有些复杂, 我们之后会使用精灵组模块的碰撞方法, 能大大简化代码)
运行下面代码, 产生30个随机矩形, 如果某个矩形与其他矩形有重叠, 就会呈现红色, 独立的矩形会呈现蓝色. 每个矩形上面还显示了它们的编号.
每次按下 R 键时,都会创建 30 个新的随机矩形。
from zwpy import *
import zwpy.pygame_zw as g
def 绘制文字(表层, 文本, 位置):
图像=字体.绘制(文本,真,'black')
表层.贴图(图像, 位置)
def 产生随机矩形(数目):
矩形列表 = 列表()
for _ in 范围(数目):
x = 随机整数(0, 500)
y = 随机整数(0, 200)
矩形列表.添加(g.区块类(x, y, 30, 30))
return 矩形列表
g.初始化()
屏幕宽度,屏幕高度=500, 200
屏幕=g.显示.设置模式( (屏幕宽度,屏幕高度) )
n=30
随机矩形 = 产生随机矩形(n)
字体=g.字体.系统字体('SIMHEI', 20) # SIMHEI是电脑上黑体文字的文件名称
while 真:
for 事件 in g.事件.获取():
if 事件.类型 == g.退出事件:
g.退出游戏()
退出程序()
if 事件.类型 == g.键盘按下事件:
if 事件.键 == g.K_r:
随机矩形 = 产生随机矩形(n)
屏幕.填充('gray')
重叠的矩形 = 列表()
for i in 范围(n - 1):
r0 = 随机矩形[i]
for j in 范围(i 1, n):
r1 = 随机矩形[j]
if r0.碰撞区块检测(r1):
重叠的矩形.添加(r0)
重叠的矩形.添加(r1)
break
for i, 矩形 in 枚举(随机矩形):
颜色 = 'red' if 矩形 in 重叠的矩形 else 'blue'
g.绘图.矩形(屏幕, 颜色, 矩形)
绘制文字(屏幕, 字符串(i),矩形.顶左)
g.显示.更新()
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved