简介
pyglet是一个python下的多媒体框架,利用他我们可以轻易的做出交互丰富的应用。同样的框架还有 pygame,panda3d,这两个学起来更难,学习成本更大。对于只是要熟练掌握python来讲,可以试试pyglet,轻量级。
安装Pyglet
从http://pyglet.org/download.html下载Pyglet并安装到你的电脑, 对于不同的平台,安装方法不一样,但都很简单,因为Pyglet没有额外的依赖包。
win7 64位如果提示:需要python2.4或者更新的版本,请参考*: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_d*=pyglet.image.load(‘D:/ps/13583948916893.jpg‘) main_batch=pyglet.graphics.Batch() #rand_x=random.randint(0,900) #d*=pyglet.sprite.Sprite(img=image_d*,x=rand_x,y=500) #d*.scale=0.2 man=pyglet.sprite.Sprite(img=image_s,x=400,y=0); keys = key.KeyStateHandler() game_window.push_handlers(keys) #def d*_lives(num): d*_lives=[] for i in range(15): rand_x=random.randrange(0,1200,1) new_sprite=pyglet.sprite.Sprite(img=image_d*,x=rand_x,y=700) new_sprite.scale=0.1 d*_lives.append(new_sprite) #return d*_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=d*_lives(5) @game_window.event def on_draw(): game_window.clear() lable.draw() # d*.draw() man.draw() for live in d*_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 d*_lives: rand_y=random.randrange(0,15,2) live.y-=rand_y check_bounds(live) #check_bounds(d*) 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);
d*_lives=[] for i in range(15): rand_x=random.randrange(0,1200,1) new_sprite=pyglet.sprite.Sprite(img=image_d*,x=rand_x,y=700) new_sprite.scale=0.1 d*_lives.append(new_sprite)
精灵已经初始化好了,最后我们调用on_draw()函数把他们绘制到窗口上。
@game_window.event def on_draw(): game_window.clear() lable.draw() man.draw() for live in d*_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 d*_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()
让整个程序跑起来!
-------------------------------------------------------------------
目前先到这里,这些我也只花了几个小时就搞定了,很简单。
不定期更新!!!~~~