如何用Pygame写游戏(十七)

本文转自http://eyehere.net/2011/python-pygame-novice-professional-17/

最近有些忙,没有更新这个系列,不行啊不行,抓紧更新一篇,这几次可是3D啊3D,多么诱人的词啊……

游戏通常希望营造一个真实的世界,越接近真实越好啊,这样的代入感会很强。在早期,由于硬件的限制,游戏只能提供一些2D的图像,因为这对于电脑绘图是最容易的。还好随着技术发展,现在的显卡已经可以画出很逼真的3D画面了,所以“硬件杀手”游戏层出不穷,贫困游戏迷的噩梦啊。

3D游戏画面

在开开心心的继续之前,是不是有记忆力好的人想起这个系列第一篇里面我说过,pygame不适合做3D,怎么这里又厚颜无耻的开始说3D了?这不是搬石头砸自己的脚么:)这里我要仔细说明一下,所谓3D,说到底就是利用透视原理,在2D的画面上创造出有纵深错觉(说白了也就是近大远小)的画面而已,毕竟,屏幕是平的,怎么可能真的画出距离呢?换句话说,计算机3D的本质还是2D,只不过额外多了很多东西。

在纯pygame中,我们画3D画面就是通过计算在2D图像上画一些大小不一的东西:)


   
   
  1. import pygame
  2. from pygame.locals import *
  3. from random import randint
  4. class Star(object):
  5. def __init__(self, x, y, speed):
  6. self.x = x
  7. self.y = y
  8. self.speed = speed
  9. def run():
  10. pygame.init()
  11. screen = pygame.display.set_mode(( 640, 480)) #, FULLSCREEN)
  12. stars = []
  13. # 在第一帧,画上一些星星
  14. for n in xrange( 200):
  15. x = float(randint( 0, 639))
  16. y = float(randint( 0, 479))
  17. speed = float(randint( 10, 300))
  18. stars.append( Star(x, y, speed) )
  19. clock = pygame.time.Clock()
  20. white = ( 255, 255, 255)
  21. while True:
  22. for event in pygame.event.get():
  23. if event.type == QUIT:
  24. return
  25. if event.type == KEYDOWN:
  26. return
  27. # 增加一颗新的星星
  28. y = float(randint( 0, 479))
  29. speed = float(randint( 10, 300))
  30. star = Star( 640., y, speed)
  31. stars.append(star)
  32. time_passed = clock.tick()
  33. time_passed_seconds = time_passed / 1000.
  34. screen.fill(( 0, 0, 0))
  35. # 绘制所有的星
  36. for star in stars:
  37. new_x = star.x - time_passed_seconds * star.speed
  38. pygame.draw.aaline(screen, white, (new_x, star.y), (star.x+ 1., star.y))
  39. star.x = new_x
  40. def on_screen(star):
  41. return star.x > 0
  42. # 星星跑出了画面,就删了它
  43. stars = filter(on_screen, stars)
  44. pygame.display.update()
  45. if __name__ == “__main__”:
  46. run()

这里你还可以把FULLSCREEN加上,更有感觉。

这个程序给我的画面,发挥一下你的想象,不是一片宇宙么,无数的星云穿梭,近的速度更快,远的则很慢。而实际上看代码,我们只是画了一些长短不同的线而已!虽然很简单,还是用了不少不少python的技术,特别是函数式编程的(小)技巧。不过强大的你一定没问题:)但是pygame的代码,没有任何没讲过的,为什么这样就能有3D的效果了?感谢你的大脑,因为它知道远的看起来更慢,所以这样的错觉就产生了。

理解3D空间

3D空间的事情,基本就是立体几何的问题,高中学一半应该就差不多理解了,这里不多讲了。你能明白下图的小球在(7, 5, 10)的位置,换句话说,如果你站在原点,面朝Z轴方向。那么小球就在你左边7,上面5,前面10的位置。这就够了~

3D坐标

使用3D向量

我们已经学习了二维向量来表达运动,在三维空间内,当然要使用三维的向量。其实和二维的概念都一样,加减缩放啥的,这里就不用三个元素的元组列表先演练一番了,直接祭出我们的gameobjects神器吧!


   
   
  1. from gameobjects.vector3 import *
  2. A = Vector3( 6, 8, 12)
  3. B = Vector3( 10, 16, 12)
  4. print "A is", A
  5. print "B is", B
  6. print "Magnitude of A is", A.get_magnitude()
  7. print "A+B is", A+B
  8. print "A-B is", A–B
  9. print "A normalized is", A.get_normalized()
  10. print "A*2 is", A * 2

运行一下看看结果吧,有些无趣?确实,光数字没法展现3D的美啊,下一次,让我们把物体在立体空间内运动起来。












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值