使用pygame实现创意游戏《勇闯BUBU星》
窗口与坐标
游戏效果在Pygame窗口中显示,要把窗口设置成合适的大小。
设置窗口大小
Pygame中,用WIDTH和HEIGHT分别表示窗口的宽和高,设置变量的值,就可以改变窗口大小。
<br />
import pgzrun #先导入pgzrun<br />
WIDTH = 500 #设置窗口的宽<br />
HEIGHT = 700 #设置窗口的高<br />
pgzrun.go() #写在程序最后,启动Pygame<br />
宽(WIDTH)和高(HEIGHT)变量名的字母都要大写。
窗口的坐标
1 窗口的坐标原点在左上角,坐标为(0, 0)
2 水平方向用x坐标表示,越向右,x坐标越大
竖直方向用y坐标表示,越向下,y坐标越大
3 一对儿x和y坐标,能确定窗口中的一个位置
Actor() 创建角色
Actor()用于创建角色,括号中需要填写一个图片名称,作为角色的造型。
创建角色:Actor()
格式
角色名 = Actor(图片名)
<br />
player = Actor('小王子')<br />
使用Actor()首字母A要大写,创建出的角色要存储在一个变量中,比如player。
创建角色,并显示角色
<br />
import pgzrun<br />
WIDTH = 500<br />
HEIGHT = 700</p>
<p>#创建角色<br />
player = Actor('小王子')</p>
<p>def draw():<br />
#显示角色<br />
player.draw()<br />
pgzrun.go()<br />
总结
Pygame中使用Actor()创建角色,括号中的参数为图片名,数据类型是字符串; 将角色存储在一个变量中,之后可以使用这个变量操作角色。
draw() 窗口绘制
draw()用于在窗口中绘制背景、角色等内容,所有在窗口中显示内容的代码,都需要写在这个函数中。
窗口绘制:draw()
程序会自动调用draw()函数, 只需要定义函数,不需要写调用函数的代码。
def draw():
绘制背景和绘制角色
绘制背景
<br />
def draw():<br />
screen.blit(背景图片, 图片位置)<br />
<br />
def draw():<br />
screen.blit('星球', [0. 0])<br />
绘制角色
<br />
def draw():<br />
角色.draw()<br />
<br />
player = Actor('小王子')<br />
def draw():<br />
player.draw()<br />
on_key_down() 按键控制
on_key_down()可以实现按键控制,当有按键被按下时, 函数就会执行。
按键控制:on_key_down()
有键被按下时,程序自动调用函数,只需要定义。
<br />
def on_key_down(key): #参数key,存储被按下的按键名<br />
#分别判断key的值,可以实现多按键控制<br />
if key == 按键1:<br />
......<br />
if key == 按键2:<br />
......<br />
侦测按键从抬起到落下,即使一直按住按键,函数也只会执行一次。
update()更新状态
update是“更新”的意思,游戏运行时,会不断地重复调用update()函数,写在函数中的代码会不断地重复执行。
更新状态:update()
程序会以60次/秒的速度不停地调用update()函数,函数中的代码会不断地重复执行,直到游戏结束。
<br />
def update():<br />
函数体<br />
<br />
weapons = []<br />
def draw():<br />
screen.blit('星球', [0,0])<br />
player.draw()<br />
for w in weapons: #遍历存储所有子弹角色的列表,依次绘制每个子弹<br />
w.draw()</p>
<p>def on_key_down(key):<br />
#按下空格键创建子弹角色<br />
if key == keys.SPACE:<br />
weapon = Actor('子弹')<br />
weapon.x = player.x<br />
weapon.y = player.y<br />
weapons.append(weapon)</p>
<p>def update():<br />
#在update()中让每个子弹的y坐标减小5,子弹会一直向上飞<br />
for w in weapons:<br />
w.y -= 5<br />
on_key_down()和update()下都可以书写键盘控制的代码。
<br />
def on_key_down(key):<br />
if key == keys.LEFT:<br />
player.x -= 5<br />
if key == keys.RIGHT:<br />
player.y += 5<br />
实现每按下左、右方向键时,角色会对应向左右移动一次。
<br />
key == keys.按键<br />
按键 —-> 大写字母
<br />
def update():<br />
if keyboard.left:<br />
player.x -= 5<br />
if keyboard.right<br />
plaer.x += 5<br />
实现每按下左、右方向键时,角色会对应向左右移动,如果按住不放,角色可以连续移动。
<br />
keyboard.按键<br />
按键 —-> 小写字母
总结
运行机制
on_key_down()函数,只有按下按键时,会执行一次;
update()函数,在程序启动之后就一直重复执行。
按键判断
on_key_down()函数可以通过参数key来判断哪个按键被按下。
而update()函数没有参数,要通过keyboard.键的形式判断。
在update()中实现了通过按住键不放,控制子弹连续发射以及小核桃的连续移动。
BUBU兽的随机重复出现
游戏中,3只BUBU兽从窗口最上方随机位置出现,飞出窗口之后,还会重新回到窗口最上方。
BUBU兽在随机位置出现
<br />
bubus = []<br />
for i in range(3):<br />
b = Actor('bubu')<br />
b.x = random.randint(0,500)<br />
bubus.append(b)<br />
创建BUBU兽角色,设置随机的初始位置。
◆ 生成随机数:
<br />
random.randint(起始数,结束数)<br />
BUBU兽随机重复地出现
<br />
def update():<br />
for b in bubus:<br />
if b.y > 700:<br />
b.x = random.randint(0,500)<br />
b.y = 0<br />
角色如果飞出边界,就重新设置它的坐标。
◆判断条件: 'b.y > 700'是根据窗口大小,以及要飞出哪个边界来确定的。
实现角色的随机重复移动:先使用random.randint()设置初始位置,再使用if判断坐标,超出范围就重新设置初始坐标。
colliderect()碰撞检测
colliderect()用于判断两个角色是否发生碰撞,如果发生碰撞返回True,没有发生碰撞返回False。
碰撞检测:colliderect()
格式: 角色1.colliderect(角色2)
<br />
if hemu.colliderect(xiaohetao):<br />
print('碰到了~~')<br />
◆colliderect函数的返回值是布尔类型,因此常作为if后的判断条件。
游戏中,BUBU兽碰到子弹后,重新设置BUBU兽的初始坐标。
<br />
#bubu兽和子弹碰撞后回到初始位置<br />
for b in bubus:<br />
for w in weapons:<br />
if b.colliderect(w):<br />
b.x = random.randint(0,500)<br />
b.y = 0<br />
游戏结束
bubu兽碰到了小核桃,游戏结束,小核桃切换失败造型。
设置角色造型
格式:角色.image = 图片名
<br />
for b in bubus:<br />
if b.colliderect(player):<br />
player.image = '小核桃失败'<br />
◆ 遍历bubus列表,如果bubu兽碰到了小核桃,小核桃切换成失败造型。
游戏结束以后还要清空窗口的子弹角色和bubu兽角色。
<br />
def draw():<br />
screen.blit('星球', pos=[0,0])<br />
player.draw()</p>
<p> if player.image != '小核桃失败'<br />
for w in weapons:<br />
w.draw()<br />
for b in bubus:<br />
b.draw()<br />
◆ 只要小核桃不是失败造型,游戏就没有结束,需要绘制子弹和BUBU兽, 否则就不再绘制了。
背景音乐
pygame中可以使用music模块,给游戏添加音效。让游戏变得更加生动有趣。
播放音乐
<br />
music.play(音乐名)<br />
停止播放音乐
<br />
music.stop()<br />
游戏启动前,播放音乐,小核桃碰到了bubu兽,音乐停止。
<br />
def update():<br />
for b in bubus:<br />
if b.colliderect(player):<br />
player.image = '小核桃失败'<br />
music.stop()<br />
music.play('music1')<br />
pgzrun.go()<br />
注意:播放音乐的代码需要书写在pgzrun.go()之前。
感谢分享,赞一个