initial import of "very simple space game"
--HG-- branch : vssg
BIN
framebg.png
Normal file
After Width: | Height: | Size: 1,017 B |
BIN
img/base_star.png
Normal file
After Width: | Height: | Size: 262 B |
BIN
img/blue_dwarf1.png
Normal file
After Width: | Height: | Size: 272 B |
BIN
img/green_dwarf1.png
Normal file
After Width: | Height: | Size: 257 B |
BIN
img/red_dwarf1.png
Normal file
After Width: | Height: | Size: 250 B |
BIN
img/white_dwarf1.png
Normal file
After Width: | Height: | Size: 248 B |
BIN
img/yellow_dwarf1.png
Normal file
After Width: | Height: | Size: 249 B |
0
ships.py
Normal file
72
starmap.py
Normal file
|
@ -0,0 +1,72 @@
|
|||
import math
|
||||
import pygame
|
||||
|
||||
class Galaxy(object):
|
||||
def __init__(self, width, height):
|
||||
self.starmap = [[[] for x in range(width)] for x in range(height)]
|
||||
self.starlist = []
|
||||
|
||||
def add_star(self, star):
|
||||
self.starlist.append(star)
|
||||
self.starmap[int(star.y / 100)][int(star.x / 100)].append(star)
|
||||
|
||||
def get_distance(self, x, y, x2, y2):
|
||||
return math.sqrt((x-x2)**2 + (y-y2)**2)
|
||||
|
||||
def get_stars_in_sector(self, sx, sy):
|
||||
return [star for star in self.starmap[sy][sx] if type(star) == StarSys]
|
||||
|
||||
def get_all_stars(self):
|
||||
return self.starlist
|
||||
|
||||
def get_nearest_star(self, x, y):
|
||||
mindist = None
|
||||
minstar = None
|
||||
for star in self.get_all_stars():
|
||||
stardist = self.get_distance(x, y, star.x, star.y)
|
||||
if mindist == None or stardist < mindist:
|
||||
mindist = stardist
|
||||
minstar = star
|
||||
|
||||
return minstar
|
||||
|
||||
"""
|
||||
star = None
|
||||
radius = 0
|
||||
while True:
|
||||
starlist = []
|
||||
self.get_stars_in_sector(x / 100, y / 100)
|
||||
if
|
||||
if star != None:
|
||||
return star
|
||||
else:
|
||||
"""
|
||||
|
||||
class StarSys(object):
|
||||
def __init__(self, x, y, startype, habitat, minerals):
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.startype = startype
|
||||
self.habitat = habitat
|
||||
self.minerals = minerals
|
||||
def draw(self, surf):
|
||||
|
||||
self.startype.draw(surf, int(self.x / 10), int(self.y / 10))
|
||||
|
||||
class StarClass(object):
|
||||
def __init__(self, name, color, size, habitat_mod, minerals_mod):
|
||||
self.name = name
|
||||
self.color = color
|
||||
self.size = size
|
||||
self.habitat_mod = habitat_mod
|
||||
self.minerals_mod = minerals_mod
|
||||
self.pngsurf = None
|
||||
|
||||
def draw(self, surf, x, y):
|
||||
if self.pngsurf == None:
|
||||
self.pngsurf = pygame.image.load('img/%s_dwarf1.png' % (self.color.lower(),))
|
||||
self.pngsurf.convert_alpha(surf)
|
||||
dest = self.pngsurf.get_rect()
|
||||
dest.x = x - (dest.w / 2) + 1
|
||||
dest.y = y - (dest.h / 2) + 1
|
||||
surf.blit(self.pngsurf, dest)
|
BIN
starmap.pyc
Normal file
170
starmap_gen.py
Normal file
|
@ -0,0 +1,170 @@
|
|||
from starmap import *
|
||||
import copy
|
||||
import random
|
||||
|
||||
class Starmap_Params(object):
|
||||
def __init__(self):
|
||||
self.density = 2
|
||||
self.minerals = Minerals_Params(0.1, 0.2, 0.4, 0.2, 0.1)
|
||||
self.habitat = Habitat_Params(0.05, 0.03, 0.10, 0.07, 0.06, 0.09, 0.06, 0.09, 0.08, 0.08, 0.12, 0.08, 0.06, 0.08)
|
||||
self.size = (80, 60)
|
||||
|
||||
class PercentArray(object):
|
||||
def __init__(self):
|
||||
self.order = []
|
||||
self.array = {}
|
||||
|
||||
def __setitem__(self, key, value):
|
||||
if not self.array.has_key(key):
|
||||
self.order += [key]
|
||||
self.array[key] = value
|
||||
|
||||
def __getitem__(self, key):
|
||||
return self.array[key]
|
||||
|
||||
def normalize(self):
|
||||
tot = sum(self.array.values())
|
||||
|
||||
for k in self.array.keys():
|
||||
self[k] = self[k] / tot
|
||||
|
||||
def __mul__(self, other):
|
||||
if type(other) != type(self):
|
||||
raise TypeError
|
||||
retval = copy.deepcopy(self)
|
||||
for k in retval.array.keys():
|
||||
retval[k] *= other[k]
|
||||
retval.normalize()
|
||||
return retval
|
||||
|
||||
def random(self):
|
||||
loopcount = 0
|
||||
while True:
|
||||
loopcount += 1
|
||||
rv = random.random()
|
||||
tot = 0.0
|
||||
for k in self.order:
|
||||
tot += self[k]
|
||||
if rv < tot:
|
||||
return k
|
||||
|
||||
if loopcount >= 5:
|
||||
raise IndexError
|
||||
|
||||
|
||||
|
||||
class Minerals_Params(PercentArray):
|
||||
def __init__(self, vpoor, poor, normal, rich, vrich):
|
||||
PercentArray.__init__(self)
|
||||
self['vpoor'] = vpoor
|
||||
self['poor'] = poor
|
||||
self['normal'] = normal
|
||||
self['rich'] = rich
|
||||
self['vrich'] = vrich
|
||||
|
||||
|
||||
class Habitat_Params(PercentArray):
|
||||
def __init__(self, noplanet, paradise, terran, ocean, swamp, arid, desert, tundra, minimal, barren, dead, inferno, toxic, radiated):
|
||||
PercentArray.__init__(self)
|
||||
self['noplanet'] = noplanet
|
||||
self['paradise'] = paradise
|
||||
self['terran'] = terran
|
||||
self['ocean'] = ocean
|
||||
self['swamp'] = swamp
|
||||
self['arid'] = arid
|
||||
self['desert'] = desert
|
||||
self['tundra'] = tundra
|
||||
self['minimal'] = minimal
|
||||
self['barren'] = barren
|
||||
self['dead'] = dead
|
||||
self['inferno'] = inferno
|
||||
self['toxic'] = toxic
|
||||
self['radiated'] = radiated
|
||||
|
||||
|
||||
|
||||
startypes = []
|
||||
|
||||
whitedwarf_min = Minerals_Params(0.0, 0.2, 0.5, 2.0, 3.5)
|
||||
whitedwarf_hab = Habitat_Params(3.0, 0.1, 0.1, 0.2, 0.2, 0.3, 0.3, 0.8, 0.7, 1.5, 4.5, 1.0, 2.0, 2.0)
|
||||
bluestar_min = Minerals_Params(0.5, 0.5, 1.0, 2.0, 2.5)
|
||||
bluestar_hab = Habitat_Params(1.0, 0.4, 0.6, 0.6, 0.6, 0.9, 1.0, 0.6, 1.1, 1.2, 1.5, 3.0, 2.0, 3.0)
|
||||
redstar_min = Minerals_Params(2.0, 2.0, 1.0, 0.4, 0.3)
|
||||
redstar_hab = Habitat_Params(1.0, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.2, 1.0, 0.9, 0.8, 0.5, 0.5, 0.5)
|
||||
yellowstar_min = Minerals_Params(1.0, 1.0, 1.0, 1.0, 1.0)
|
||||
yellowstar_hab = Habitat_Params(1.0, 1.5, 1.5, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0)
|
||||
greenstar_min = Minerals_Params(1.0, 1.0, 1.0, 1.5, 1.5)
|
||||
greenstar_hab = Habitat_Params(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0)
|
||||
|
||||
|
||||
startypes.append((0.15, StarClass(name="Blue Giant", color="Blue", size="Giant", minerals_mod=bluestar_min, habitat_mod=bluestar_hab)))
|
||||
startypes.append((0.15, StarClass(name="Green Star", color="Green", size="Star", minerals_mod=greenstar_min, habitat_mod=greenstar_hab)))
|
||||
startypes.append((0.25, StarClass(name="Yellow Star", color="Yellow", size="Star", minerals_mod=yellowstar_min, habitat_mod=yellowstar_hab)))
|
||||
startypes.append((0.30, StarClass(name="Red Dwarf", color="Red", size="Dwarf", minerals_mod=redstar_min, habitat_mod=redstar_hab)))
|
||||
startypes.append((0.10, StarClass(name="Red Giant", color="Red", size="Giant", minerals_mod=redstar_min, habitat_mod=redstar_hab)))
|
||||
startypes.append((0.05, StarClass(name="White Dwarf", color="White", size="Dwarf", minerals_mod=whitedwarf_min, habitat_mod=whitedwarf_hab)))
|
||||
|
||||
|
||||
|
||||
def starmap_generate_star(map):
|
||||
pass
|
||||
|
||||
def starmap_generate():
|
||||
params = Starmap_Params()
|
||||
numstars = int(round((params.size[0] * params.size[1] / 100.0) * params.density))
|
||||
mindist = None
|
||||
mapx = params.size[0] - 2
|
||||
mapy = params.size[1] - 2
|
||||
map = Galaxy(params.size[0], params.size[1])
|
||||
i = 0
|
||||
print numstars
|
||||
while True:
|
||||
if i >= numstars:
|
||||
break
|
||||
|
||||
if i != 0:
|
||||
mindist = max(175.0, (mapx + mapy) / 2.0 * 100.0 / ((i + 1)**0.75*0.75))
|
||||
|
||||
x = (random.random() * mapx) + 1
|
||||
y = (random.random() * mapy) + 1
|
||||
x *= 100
|
||||
y *= 100
|
||||
|
||||
if mindist != None:
|
||||
star = map.get_nearest_star(x, y)
|
||||
dist = map.get_distance(x, y, star.x, star.y)
|
||||
if dist < mindist:
|
||||
print "Dist (%s, %s): %s, Mindist (%s, %s): %s" % (star.x, star.y, dist, int(x), int(y), mindist)
|
||||
continue
|
||||
|
||||
loopcount = 0
|
||||
startype = None
|
||||
while True:
|
||||
loopcount += 1
|
||||
rv = random.random()
|
||||
tot = 0.0
|
||||
for pct, startype_test in startypes:
|
||||
tot += pct
|
||||
if rv < tot:
|
||||
startype = startype_test
|
||||
break
|
||||
|
||||
if startype != None:
|
||||
break
|
||||
|
||||
if loopcount >= 5:
|
||||
raise IndexError
|
||||
|
||||
|
||||
hab = params.habitat * startype.habitat_mod
|
||||
min = params.minerals * startype.minerals_mod
|
||||
hab = hab.random()
|
||||
min = min.random()
|
||||
|
||||
print "Generated star %s %s %s at (%s, %s)" % (startype.name, hab, min, int(x), int(y))
|
||||
|
||||
star = StarSys(int(x), int(y), startype, hab, min)
|
||||
map.add_star(star)
|
||||
|
||||
i += 1
|
||||
return map
|
BIN
starmap_gen.pyc
Normal file
72
testui.py
Normal file
|
@ -0,0 +1,72 @@
|
|||
#import testopt
|
||||
import time
|
||||
import pyui
|
||||
import pyui.themes.win2k
|
||||
|
||||
class MyFrame(object):
|
||||
"""A frame is a window that has a titlebar and borders. it is resizable and movable by dragging the titlebar.
|
||||
"""
|
||||
def __init__(self, x, y, w, h, title, topmost = 0):
|
||||
self.theme = getTheme()
|
||||
self.innerWidth = w
|
||||
self.innerHeight = h
|
||||
self.title = title
|
||||
|
||||
self.panelOffsetLeft = 0
|
||||
self.panelOffsetTop = 0
|
||||
self.panelOffsetRight = 0
|
||||
self.panelOffsetBottom = 0
|
||||
|
||||
Window.__init__(self, x, y, w, h, topmost)
|
||||
self.setTitle(self.title)
|
||||
|
||||
self.panelOffsetLeft = self.theme.getFrameBorderLeft()
|
||||
self.panelOffsetTop = self.theme.getFrameBorderTop()
|
||||
self.panelOffsetRight = self.theme.getFrameBorderRight()
|
||||
self.panelOffsetBottom = self.theme.getFrameBorderBottom()
|
||||
|
||||
self._panel.moveto(self.panelOffsetLeft, self.panelOffsetTop)
|
||||
w += self.panelOffsetLeft + self.panelOffsetRight
|
||||
h += self.panelOffsetTop + self.panelOffsetBottom
|
||||
self.backImage = None
|
||||
|
||||
def setBackImage(self, filename):
|
||||
self.backImage = filename
|
||||
#getRenderer().loadImage(filename)
|
||||
|
||||
|
||||
def draw(self, renderer):
|
||||
"""Draws to the actual frame if the renderer requires it.
|
||||
"""
|
||||
if not self.show:
|
||||
return
|
||||
self.hitList = getTheme().drawFrame( (0,0,self.width, self.height), self.title, self.backImage)
|
||||
Window.draw(self, renderer)
|
||||
|
||||
def onbutton(self):
|
||||
print "got a button "
|
||||
|
||||
def run():
|
||||
#opts = testopt.parseCommandLine(800, 600)
|
||||
done = 1
|
||||
frame = 0
|
||||
t = time.time()
|
||||
desktop = pyui.init(640, 480, '2d')
|
||||
print pyui.core.gRenderer.screen
|
||||
newtheme = pyui.themes.win2k.Win2kTheme(pyui.core.gRenderer, "lucida sans unicode", 14)
|
||||
desktop.setTheme(newtheme)
|
||||
|
||||
w = pyui.widgets.Frame(50, 50, 400, 400, "clipme")
|
||||
b = pyui.widgets.Button( "A button is here", onbutton)
|
||||
w.addChild(b)
|
||||
w.pack()
|
||||
|
||||
w.setBackImage("framebg.png")
|
||||
pyui.run()
|
||||
|
||||
print "done"
|
||||
pyui.quit()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
run()
|
15
testui2.py
Normal file
|
@ -0,0 +1,15 @@
|
|||
# Hello World example.
|
||||
from ocempgui.widgets import *
|
||||
|
||||
# Initialize the drawing window.
|
||||
re = Renderer ()
|
||||
re.create_screen (640, 480)
|
||||
re.title = "Hello World"
|
||||
re.color = (250, 250, 250)
|
||||
|
||||
button = Button ("Hello World")
|
||||
button.topleft = (10, 10)
|
||||
re.add_widget (button)
|
||||
|
||||
# Start the main rendering loop.
|
||||
re.start()
|
124
vssg.py
Normal file
|
@ -0,0 +1,124 @@
|
|||
import pygame
|
||||
from pygame.locals import *
|
||||
import os
|
||||
import sys
|
||||
import math
|
||||
import random
|
||||
import starmap
|
||||
import starmap_gen
|
||||
|
||||
pygame.init()
|
||||
|
||||
def handle_keys(keys):
|
||||
global bounce, speed_player, trails, dir_player, color_player
|
||||
for key in keys:
|
||||
if key == K_b:
|
||||
bounce = not bounce
|
||||
elif key == K_q:
|
||||
sys.exit(0)
|
||||
elif key == K_c:
|
||||
color_player = (random.randint(0,255), random.randint(0,255), random.randint(0,255))
|
||||
elif key == K_t:
|
||||
trails = not trails
|
||||
elif key == K_UP:
|
||||
speed_player += 0.01
|
||||
elif key == K_DOWN:
|
||||
speed_player -= 0.01
|
||||
elif key == K_LEFT:
|
||||
dir_player -= (math.pi / 180.0)
|
||||
elif key == K_RIGHT:
|
||||
dir_player += (math.pi / 180.0)
|
||||
|
||||
def move(coords, dir, mag):
|
||||
return [coords[0] + (math.sin(dir) * mag), coords[1] - (math.cos(dir) * mag)]
|
||||
|
||||
def limitdir(dir):
|
||||
while dir < 0:
|
||||
dir += math.pi*2.0
|
||||
while dir > math.pi*2.0:
|
||||
dir -= math.pi*2.0
|
||||
return dir
|
||||
|
||||
def bouncedir(normal, dir):
|
||||
inv_normal = limitdir(normal + math.pi)
|
||||
return limitdir(normal + (inv_normal - dir))
|
||||
|
||||
|
||||
loc_player = [100.0,150.0]
|
||||
dir_player = math.pi * 0.80
|
||||
|
||||
size = width, height = (800,600)
|
||||
scr = pygame.display.set_mode(size)
|
||||
|
||||
#options
|
||||
color_player = (255,255,255)
|
||||
bounce = True
|
||||
speed_player = 5.0
|
||||
trails = False
|
||||
|
||||
scr.fill((0,0,0))
|
||||
|
||||
keys = []
|
||||
do_quit = False
|
||||
|
||||
map = starmap_gen.starmap_generate()
|
||||
|
||||
while True:
|
||||
events = pygame.event.get((KEYDOWN, KEYUP, QUIT))
|
||||
for ev in events:
|
||||
if ev.type == QUIT:
|
||||
do_quit = True
|
||||
break
|
||||
elif ev.type == KEYUP:
|
||||
try:
|
||||
del keys[keys.index(ev.key)]
|
||||
except IndexError:
|
||||
pass
|
||||
else:
|
||||
keys += [ev.key]
|
||||
|
||||
if do_quit:
|
||||
break
|
||||
|
||||
handle_keys(keys)
|
||||
pygame.event.pump()
|
||||
"""
|
||||
loc_new = move(loc_player, dir_player, speed_player)
|
||||
|
||||
if loc_new[0] < 5:
|
||||
if not bounce:
|
||||
loc_new[0] = width-6
|
||||
else:
|
||||
dir_player = bouncedir(math.pi*0.5, dir_player)
|
||||
elif loc_new[1] < 5:
|
||||
if not bounce:
|
||||
loc_new[1] = height-6
|
||||
else:
|
||||
dir_player = bouncedir(math.pi, dir_player)
|
||||
elif loc_new[0] > width - 5:
|
||||
if not bounce:
|
||||
loc_new[0] = 6
|
||||
else:
|
||||
dir_player = bouncedir(math.pi*1.5, dir_player)
|
||||
elif loc_new[1] > height - 5:
|
||||
if not bounce:
|
||||
loc_new[1] = 6
|
||||
else:
|
||||
dir_player = bouncedir(0, dir_player)
|
||||
|
||||
if bounce:
|
||||
loc_new = move(loc_player, dir_player, speed_player)
|
||||
|
||||
if not trails:
|
||||
pygame.draw.circle(scr, (0,0,0), loc_player, 2, 1)
|
||||
pygame.draw.circle(scr, color_player, loc_new, 2, 1)
|
||||
|
||||
|
||||
loc_player = loc_new
|
||||
"""
|
||||
|
||||
for star in map.get_all_stars():
|
||||
star.draw(scr)
|
||||
|
||||
|
||||
pygame.display.flip()
|