smtmobly 发表于 2010-12-27 16:04

pygame一个强大而简单的游戏引擎(官方是这样说的)

一个想给我的pygep找一个有趣的例子,可惜到现在都没有完成.最后下决心做一个2d的虚拟生态环境,正在构思中.为了完成这个构想,我学习了L-system用以绘制植物,这个系统绘制植物的优势是你可以给每个枝条加上能力函数以方便我们的gep编程.当然,我们还需要可视化.与是pygame又重新在我的电脑的某个角落被翻了出来.上次看她的时候,因为找不到好的教程(中文)没有继续下去,现在还是不能不去看那该死的英语.
经过这几天的郁闷加痛苦终于干了个可以动的动画了,不禁想拿来显摆显摆.
下面是代码,需求(1安装python2安装pygame.)
安装python就不多说了,pygame也不用多说了,要知道python的包只要copy+paste就够了.只要找对地方.然后import就够了.
这个程序是让树枝慢慢生长出来,使用了L-system绘制树木.
try:
    import sys
    import random
    import math
    import os
    import getopt
    import pygame
    from socket import *
    from pygame.locals import *
except ImportError, err:
    print "couldn't load module. %s" % (err)
    sys.exit(2)
pygame.init()
screen = pygame.display.set_mode((640,480),0,32)

class L_system(pygame.sprite.Sprite):
    def __init__(self,rule):
      pygame.sprite.Sprite.__init__(self)
      info = rule['S']
      for _ in range(rule['iter']):
            ninfo = []
            for c in info:
                if c in rule:
                  ninfo.append(rule)
                else:
                  ninfo.append(c)
            info = "".join(ninfo)
      self.rule = rule
      self.info = info
    def get_lines(self):
      d = self.rule['direct']
      a = self.rule['angle']
      p=(0.0,0.0)
      l=1.0
      lines = []
      stack = []
      for c in self.info:
            if c in "Ff":
                r = d*math.pi/180
                t= p + l*math.cos(r),p+l*math.sin(r)
                lines.append(((p,p),(t,t)))
                p=t
            elif c == "+":
                d += a
            elif c == "-":
                d -= a
            elif c =="[":
                stack.append((p,d))
            elif c == "]":
                p,d = stack[-1]
                del stack[-1]
      return lines
rule={
      "X":"F-[+X]+F[+FX]-X",
      "F":"FF",
      "S":"X",
      "direct":-45,
      "angle":25,
      "iter":6,
      "title":"plant"
      }      
def main():
    lc=L_system(rule)
    lines=lc.get_lines()
    while True:
      for event in pygame.event.get():
            if event.type == QUIT:
                sys.exit()
      screen.fill((255,255,255))
      b_pos = pygame.mouse.get_pos()
      for x in lines:
            b_pos=x+300,x+300
            e_pos=x+300,x+300
            pygame.draw.line(screen,(222,0,222),b_pos,e_pos)
            pygame.display.update()
            pygame.time.delay(10)
if __name__ == '__main__': main()






















smtmobly 发表于 2010-12-27 16:09

再年轻点,绝对不会左手拿着<实分析与复分析>右手鼠标,眼睛看<python+pygame>,并不时切换名叫L...的外国的L-system的论文,捣鼓代码,还要考虑Lp空间的嵌入定理了.

smtmobly 发表于 2010-12-27 16:11

再说一句,在windows下我等了5+的秒的时间出现了画面,linux下,没有延迟直接出来了.
强烈推荐linux.我用ubuntu

Rainyboy 发表于 2010-12-27 17:35

回复 2 # smtmobly 的帖子

明白了……smtmobly现在是多线程并行……

smtmobly 发表于 2010-12-27 17:42

呵呵,什么叫多线程并行阿!刚在玩论坛的城市家园还又点好玩阿

Rainyboy 发表于 2010-12-27 19:18

回复 5 # smtmobly 的帖子

smtmobly,你今天受啥刺激了……全站到处都是你回帖的身影……
{:{02}:}{:{36}:}
页: [1]
查看完整版本: pygame一个强大而简单的游戏引擎(官方是这样说的)