跳转至

PygameZero助手(比照Scratch而做的增强)

pygameZeroHelper.png

本文由黄复雄译自aposteriori.com.sg,这是一家新加坡的STEAM教育机构。这里介绍的Pygame Zero Helper(PygameZero助手)这个库,是专门比照Scratch而做的很多增强,尤其对于用过Scratch的老师或孩子有很大的帮助。


Pygame Zero少了一些Scratch中有的、游戏常用的函数。Pygame Zero Helper(PygameZero助手)就是为了弥补这一不足,提供了这些缺少的功能。

在这里下载PygameZero助手

用法是,在你的程序头部,在导入pgzrun后,即从pgzhelper(PygameZero助手的模块名)导入*(所有)。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import pgzrun
from pgzhelper import *

alien = Actor('alien')
alien.flip_x = True

def draw():
    alien.draw()

pgzrun.go()

pgzhelper提供了如下这些函数:

Actor.flip_x, Actor.flip_y#

以X或Y轴翻转图像。例如:

1
2
alien = Actor('alien')
alien.flip_x = True

Actor.scale#

缩放图像。接受一个浮点数作为倍数。例如:

1
2
3
    alien = Actor('alien')
    alien.scale = 0.5  # 0.5倍大小
    alien.scale = 2    # 2倍大小

Actor.move_forward(), Actor.move_back(), Actor.move_right(), Actor.move_left()#

面向(正脸向前)移动Actor。默认情况下,Actor是面朝右边的,你可以先改变角度。例如:

1
2
3
alien = Actor('alien')
alien.angle = 45
alien.move_forward(50)  # Moves towards the North-East

Actor.direction, Actor.move_in_direction()#

按设定的方向移动actor。与anglemove_forward()不同的是,它不会旋转actor的图像。

1
2
3
alien = Actor('alien')
alien.direction = 45        # Does not rotate the actor
alien.move_in_direction(50) # Moves towards the North-East

Actor.distance_to(), Actor.direction_to()#

获取一个actor到另一个actor的距离或方向。

1
2
3
4
alien = Actor('alien')
hero = Actor('hero')
print(alien.distance_to(hero))
print(hero.direction_to(alien))

Actor.move_towards(), Actor.point_towards()#

将actor移向或指向另一个actor。使用move_towards会使actor移动而不转动。使用point_towards会使actor不移动而转动。

1
2
3
4
alien = Actor('alien')
hero = Actor('hero')
hero.move_towards(alien, 5)
alien.point_towards(hero)

Actor.get_rect()#

取得Actor图像的rectangle(方框)。例如:

1
2
alien = Actor('alien')
screen.draw.rect(alien.get_rect(), (255,0,0)) # 相当于给alien画方框

Actor.images, Actor.next_image()#

设置图像列表。更换图像列表中的下一个图像。(相当于精灵列表/图单)

1
2
3
4
5
6
7
8
alien = Actor('alien_run1')
alien.images = ['alien_run1','alien_run2','alien_run3']

def update():
    alien.next_image()

def draw():
    alien.draw()

Actor.fps, Actor.animate()#

作用类似于Actor.next_image(),不过是按指定的帧率(FPS,默认是每秒5帧)更换图片。必须先设置好Actor.images

1
2
3
4
5
6
7
8
9
    alien = Actor('alien_run1')
    alien.images = ['alien_run1','alien_run2','alien_run3']
    alien.fps = 10 # 设置帧率

    def update():
      alien.animate() # 动画

    def draw():
      alien.draw()

Actor.collidepoint_pixel(), Actor.collide_pixel(), Actor.collidelist_pixel(), Actor.collidelistall_pixel()#

Rect(方框)碰撞的像素完美(Pixel perfect)版。和Scratch一样,在检测碰撞时会忽略透明区域。警告:这可能会导致性能不佳和actor卡顿。通常最好使用普通的Rect碰撞。

1
2
3
4
5
alien = Actor('alien')

def on_mouse_down(pos):
    if alien.collidepoint_pixel(pos):
    print("Eek!")

Actor.obb_collidepoint(), Actor.obb_collidepoints()#

检测一个点与旋转边框 (obb, oriented bounding box) 的碰撞。 Pygame和Pygame Zero正常使用的碰撞检测用的是对齐坐标轴的边框(aabb, axis aligned bounding box ), 速度很快,但Actor旋转后效果很差。像素完美(Pixel perfect)的碰撞检测精确,但很慢。这里提供的OBB碰撞检测速度快,对旋转过的actor表现好,不过只能检测与一个点的碰撞。适于检测与子弹和鼠标这样的小对象的碰撞。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def update():
    # bullets是一个actor列表
    hit = alien.obb_collidepoints(bullets)
    if hit != -1:
    bullets.pop(hit)
    print("Eek!")

def on_mouse_down(pos):
    if alien.obb_collidepoint(pos):
    print("Ook!")

Actor.circle_collidepoint(), Actor.circle_collidepoints()#

检测碰撞时使用的是由你指定半径的一个圆。适用于你的图形接近圆形的时候。速度快,但只能检测与一个点的碰撞。可以指定圆的半径,与图形的尺寸无关。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def update():
    # bullets是一个actor列表
    # 50是碰撞检测的半径
    hit = ufo.circle_collidepoints(50, bullets)
    if hit != -1:
    bullets.pop(hit)
    print("Eek!")

def on_mouse_down(pos):
    if ufo.obb_collidepoint(50, pos):
    print("Ook!")

set_fullscreen(), set_windowed(), toggle_fullscreen(), hide_mouse(), show_mouse()#

设为全屏模式:set_fullscreen();设为窗口模式(非全屏):set_windowed();在全屏与否间切换:toggle_fullscreen();影藏鼠标:hide_mouse();显示鼠标:show_mouse()

1
2
3
4
5
hide_mouse()

def update():
    if keyboard.f:
    toggle_fullscreen()

评论