VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • 用python写游戏 - 从入门到精通16

所谓3D,说到底就是利用透视原理,在2D的画面上创造出有纵深错觉(说白了也就是近大远小)的画面而已,毕竟,屏幕是平的,怎么可能真的画出距离呢?换句话说,计算机3D的本质还是2D,只不过额外多了很多东西。

 

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

距离的魔法

我们看现实中的东西,和我们看画面上的东西,最大差别在于能感受现实物体的距离。而距离的产生,则是因为我们双眼看到的东西是不同的,两眼交替闭合,你会发现眼前的东西左右移动。一只眼睛则很难正确的判断距离,虽然比上眼睛还是能感觉到远近,但更精细一点,比如很难把线穿过针眼。

 

我们在3D画面上绘图的时候,就要遵循这个规律,看看下面的代码。

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

相关教程