Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
8535 superturbo 1
"""
2
a simple diversing asteroids simulation
3
"""
4
 
5
import sys
6
import math
7
import random
8
import pygame
9
if "tinypy" not in sys.version:         # not tinypy
10
    import pygame.locals
11
 
12
SCR_WIDTH   = 600
13
SCR_HEIGHT  = 600
14
NASTEROIDS  = 320       # number of asteroids
15
INIT_NASTEROIDS = 80    # initial number of asteroids
16
OFFSET      = 20        # max initial offset
17
DIV_FACTOR  = 1.1       # diverse factor
18
 
19
class Center(object):
20
    x = SCR_WIDTH / 2
21
    y = SCR_HEIGHT / 2
22
 
23
class Graphics(object):
24
    x = 0
25
    y = 0
26
    w = SCR_WIDTH
27
    h = SCR_HEIGHT
28
    center = Center()
29
    BACKGROUND = (0, 0, 0)  # black background
30
 
31
    def __init__(self):
32
        pygame.init()
33
        self.screen = pygame.display.set_mode((SCR_WIDTH, SCR_HEIGHT))
34
        self.clearScreen()
35
    def drawRect(self, sx, sy, w, h, color):
36
        sx = int(sx)
37
        sy = int(sy)
38
        dx = int(sx + w)
39
        dy = int(sy + h)
40
        for x in range(sx, dx):
41
            for y in range(sy, dy):
42
                self.screen.set_at((x, y), color)
43
    def clearScreen(self):
44
        for x in range(SCR_WIDTH):
45
            for y in range(SCR_HEIGHT):
46
                self.screen.set_at((x, y), self.BACKGROUND)
47
    def flipDisplay(self):
48
        pygame.display.flip()
49
 
50
class Asteroid(object):
51
    graphics = Graphics()
52
    def __init__(self):
53
        self.x          = 0    # x and y, set to invalid position
54
        self.y          = 0
55
        self.size       = 1
56
        self.color      = [0, 0, 0]
57
    def show(self):
58
        self.graphics.drawRect(self.x, self.y, self.size, self.size, self.color)
59
    def hide(self):
60
        self.graphics.drawRect(self.x, self.y, self.size, self.size, self.graphics.BACKGROUND)
61
    def update(self):
62
        # update asteroids[i]'s position
63
        if (self.x <= self.graphics.x or self.x >= self.graphics.w or
64
            self.y <= self.graphics.y or self.y >= self.graphics.h):
65
            self.x = self.graphics.center.x - OFFSET + OFFSET * 2 * random.random()
66
            self.y = self.graphics.center.y - OFFSET + OFFSET * 2 * random.random()
67
            self.color[0] = random.randint(20, 255)
68
            self.color[1] = random.randint(20, 255)
69
            self.color[2] = random.randint(20, 255)
70
        else:
71
            gx = self.graphics.center.x + (self.x - self.graphics.center.x) * DIV_FACTOR
72
            if (math.fabs(self.x - self.graphics.center.x) < 1e-6):
73
                gy = self.graphics.center.y + (self.y - self.graphics.center.y) * DIV_FACTOR
74
            else:
75
                k  = (gx - self.graphics.center.x) / (self.x - self.graphics.center.x)
76
                gy = self.graphics.center.y + (self.y - self.graphics.center.y) * k
77
            self.x = gx
78
            self.y = gy
79
 
80
        # update self's size
81
        self.size = int(5 * ((math.fabs(self.x - self.graphics.center.x) * 2) / self.graphics.w))
82
        if self.size <= 1:
83
            self.size = 1
84
 
85
def main():
86
    asteroids = []
87
    for i in range(INIT_NASTEROIDS):
88
        asteroid = Asteroid()
89
        asteroid.update()
90
        asteroids.append(asteroid)
91
 
92
    _quit = False
93
    while not _quit:
94
        for e in pygame.event.get():
95
            if e.type in (pygame.locals.QUIT, pygame.locals.KEYDOWN):
96
                _quit = True
97
 
98
        if (len(asteroids) < NASTEROIDS):
99
            asteroid = Asteroid()
100
            asteroid.update()
101
            asteroids.append(asteroid)
102
 
103
        for i in range(len(asteroids)):
104
            # hide asteroids[i]
105
            asteroids[i].hide()
106
 
107
            # update asteroids[i]
108
            asteroids[i].update()
109
 
110
            # show asteroids[i]
111
            asteroids[i].show()
112
 
113
        # swap display content actually
114
        Asteroid.graphics.flipDisplay()
115
 
116
if __name__ == '__main__':
117
    main()
118
    print("#OK")
119