pyglet是一个python下的多媒体框架,利用他我们可以轻易的做出交互丰富的应用。同样的框架还有 pygame,panda3d,这两个学起来更难,学习成本更大。对于只是要熟练掌握python来讲,可以试试pyglet,轻量级。
从http://pyglet.org/download.html下载Pyglet并安装到你的电脑, 对于不同的平台,安装方法不一样,但都很简单,因为Pyglet没有额外的依赖包。
win7 64位如果提示:需要python2.4或者更新的版本,请参考StackOverflow:http://code.google.com/p/pyglet/issues/detail?id=488
本文用pyglet搭建一个小游戏,模仿雷电。
import pyglet
import random
from pyglet.window import key
from pyglet.window import mouse
#from game import resources
game_window=pyglet.window.Window(1200,700)
t=0
lable=pyglet.text.Label('Come On Babby',font_name='Times New Roman',font_size=36,x=game_window.width/2,y=game_window.height/2,anchor_x='center',anchor_y='center')
image=pyglet.image.load('D:/ps/15.jpg')
image_s=pyglet.image.load('D:/ps/QQ .jpg')
image_dabian=pyglet.image.load('D:/ps/13583948916893.jpg')
main_batch=pyglet.graphics.Batch()
#rand_x=random.randint(0,900)
#dabian=pyglet.sprite.Sprite(img=image_dabian,x=rand_x,y=500)
#dabian.scale=0.2
man=pyglet.sprite.Sprite(img=image_s,x=400,y=0);
keys = key.KeyStateHandler()
game_window.push_handlers(keys)
#def dabian_lives(num):
dabian_lives=[]
for i in range(15):
rand_x=random.randrange(0,1200,1)
new_sprite=pyglet.sprite.Sprite(img=image_dabian,x=rand_x,y=700)
new_sprite.scale=0.1
dabian_lives.append(new_sprite)
#return dabian_lives
def check_bounds(self):
if self.y<-100:
rand_x=random.randrange(-200,200,10)
self.x+=rand_x
if self.x<0:
self.x=0
elif self.x>1200:
self.x=1200
self.y=700
#lives=dabian_lives(5)
@game_window.event
def on_draw():
game_window.clear()
lable.draw()
# dabian.draw()
man.draw()
for live in dabian_lives:
live.draw()
@game_window.event
def on_mouse_press(x,y,button,modif):
if button==mouse.LEFT:
print'mouse left was pressed!'
elif button==mouse.RIGHT:
print'mouse right was pressed!'
print x
print y
#music=pyglet.media.load('D:/ps/xx.mp3')
#music.play()
#update thing
def update(dt):
if keys[key.LEFT]:
man.x-=10
elif keys[key.RIGHT]:
man.x+=10
elif keys[key.UP]:
man.y+=10
elif keys[key.DOWN]:
man.y-=10
if man.y>600:
man.y=600
elif man.y<0:
man.y=0
if man.x>1000:
man.x=1000
elif man.x<0:
man.x=0
for live in dabian_lives:
rand_y=random.randrange(0,15,2)
live.y-=rand_y
check_bounds(live)
#check_bounds(dabian)
pyglet.clock.schedule_interval(update, 1/100.0)
pyglet.app.run()
代码不长,能够实现键盘控制图片(在pyglet里面称为精灵) 实现物体的动态刷新。
首先是显示一个窗口
import pyglet
game_window = pyglet.window.Window(800, 600)
pyglet.app.run()
调用window函数构造一个800*600的窗口,在pyglet里面坐标系是左下角为(0,0)。
其次我们要加载图片资源,并且显示一个文本。
lable=pyglet.text.Label('Come On Babby',font_name='Times New Roman',font_size=36,x=game_window.width/2,y=game_window.height/2,anchor_x='center',anchor_y='center')
image=pyglet.image.load('D:/ps/15.jpg')
通过引用图片来初始化“精灵”,也就是游戏的主角。
man=pyglet.sprite.Sprite(img=image_s,x=400,y=0);
dabian_lives=[]
for i in range(15):
rand_x=random.randrange(0,1200,1)
new_sprite=pyglet.sprite.Sprite(img=image_dabian,x=rand_x,y=700)
new_sprite.scale=0.1
dabian_lives.append(new_sprite)
精灵已经初始化好了,最后我们调用on_draw()函数把他们绘制到窗口上。
@game_window.event
def on_draw():
game_window.clear()
lable.draw()
man.draw()
for live in dabian_lives:
live.draw()
这里有一个小技巧:我们用了@符号,用于函数的修饰。
@dec1
@dec2
def test(arg):
pass
相当于:dec1(dec2(test(arg)))
接下来我们要通过键盘控制精灵,使其移动。如果按键一直被按下,那么精灵就应该一直移动,而不是按一下移动一下。所以我们要检测的是按键的状态,而不是键盘是否被按下。所以我们选择获取按键的句柄。
keys = key.KeyStateHandler()
game_window.push_handlers(keys)
接下来就是关键的update()函数,其作用就是定时刷新画面,让画面动起来。同时在这里面进行按键的检测,精灵坐标的检测。check_bounds()函数用于检测精灵是否出界。pyglet.clock.schedule_interval(update, 1/100.0)用于设置刷新的频率,这里用了100hz。
def check_bounds(self):
if self.y<-100:
rand_x=random.randrange(-200,200,10)
self.x+=rand_x
if self.x<0:
self.x=0
elif self.x>1200:
self.x=1200
self.y=700
def update(dt):
if keys[key.LEFT]:
man.x-=10
elif keys[key.RIGHT]:
man.x+=10
elif keys[key.UP]:
man.y+=10
elif keys[key.DOWN]:
man.y-=10
if man.y>600:
man.y=600
elif man.y<0:
man.y=0
if man.x>1000:
man.x=1000
elif man.x<0:
man.x=0
for live in dabian_lives:
rand_y=random.randrange(0,15,2)
live.y-=rand_y
check_bounds(live)
)
pyglet.clock.schedule_interval(update, 1/100.0)
最后我么调用:
pyglet.app.run()
让整个程序跑起来!
-------------------------------------------------------------------
目前先到这里,这些我也只花了几个小时就搞定了,很简单。
不定期更新!!!~~~