File: tofudemo_create_level.py

package info (click to toggle)
soya-doc 0.11.1-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 4,080 kB
  • ctags: 805
  • sloc: python: 3,380; makefile: 5
file content (140 lines) | stat: -rw-r--r-- 4,351 bytes parent folder | download
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# -*- indent-tabs-mode: t -*-

#! /usr/bin/python -O

# Game Skeleton
# Copyright (C) 2003-2004 Jean-Baptiste LAMY
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

# Soya gaming tutorial, lesson 1
# Create the demo level

# A bunch of import
import sys, os, os.path
import tofu
import soya
import soya.widget as widget

from tofudemo import Level


# Inits Soya
soya.init()

def create_level():
	"""This function creates and saves the game skeleton demo level."""
	
	# Create a level object
	level = Level()
	
	# Separates static and non static parts
	# This will speed up network games, since only the non static part will be
	# sent on the network
	level_static = soya.World(level)
	
	# Load 3 materials (= textures) for files ./materials{grass|ground|snow}.data
	grass  = soya.Material.get("grass")
	ground = soya.Material.get("ground")
	snow   = soya.Material.get("snow")
	
	# Creates a landscape, from the heighmap "./images/map.png"
	# The landscape is in the static part (=level_static), because it won't change along the game.
	land = soya.Land(level_static)
	land.y = -35.0
	land.from_image(soya.Image.get("map.png"))
	
	# Sets how high is the landscape
	land.multiply_height(50.0)
	
	# These values are trade of between quality and speed
	land.map_size = 8
	land.scale_factor = 1.5
	land.texture_factor = 1.0
	
	# Set the texture on the landscape, according to the height
	# (i.e. height 0.0 to 15.0 are textured with grass, ...)
	land.set_material_layer(grass,   0.0,  15.0)
	land.set_material_layer(ground, 15.0,  25.0)
	land.set_material_layer(snow,   25.0,  50.0)
	
	# Loads the shape "./shapes/ferme.data"
	# This model has been created in Blender
	house = soya.Shape.get("ferme")

	# Adds 2 houses in the level
	house1 = soya.Volume(level_static, house)
	house1.set_xyz(250.0, -7.2, 182.0)
	
	house2 = soya.Volume(level_static, house)
	house2.set_xyz(216.0, -11.25, 200.0)
	house2.rotate_y(100.0) # degrees
	
	# Creates a light in the level, similar to a sun (=a directional light)
	sun = soya.Light(level_static)
	sun.directional = 1
	sun.diffuse = (1.0, 0.8, 0.4, 1.0)
	sun.rotate_x(-45.0)
	
	# Creates a sky atmosphere, with fog
	atmosphere = soya.SkyAtmosphere()
	atmosphere.ambient = (0.3, 0.3, 0.4, 1.0)
	atmosphere.fog = 1
	atmosphere.fog_type  = 0
	atmosphere.fog_start = 40.0
	atmosphere.fog_end   = 50.0
	atmosphere.fog_color = atmosphere.bg_color = (0.2, 0.5, 0.7, 1.0)
	atmosphere.skyplane  = 1
	atmosphere.sky_color = (1.5, 1.0, 0.8, 1.0)
	
	# Set the atmosphere to the level
	level.atmosphere = atmosphere
	
	# Save the level as "./worlds/level_demo.data" (remember, levels are subclasses of worlds)
	level_static.filename = level.name = "level_tofudemo_static"
	level_static.save()
	level.filename = level.name = "level_tofudemo"
	level.save()
	

# Now we just display the level



# This function must be called the first time you run game_skel.
# Then, you can comment it, since the level has been saved.
create_level()

# Create the scene (a world with no parent)
scene = soya.World()

# Loads the level, and put it in the scene
level = tofu.Level.get("level_tofudemo")
scene.add(level)

# Creates a camera in the scene
camera = soya.Camera(scene)
camera.set_xyz(222.0, 0.0, 230.0)

# Creates a widget group, containing the camera and a label showing the FPS.
soya.set_root_widget(widget.Group())
soya.root_widget.add(camera)
soya.root_widget.add(widget.FPSLabel())

#soya.render(); soya.screenshot().resize((320, 240)).save(os.path.join(os.path.dirname(sys.argv[0]), "results", os.path.basename(sys.argv[0])[:-3] + ".jpeg"))

# Creates and run an "idler" (=an object that manage time and regulate FPS)
# By default, FPS is locked at 40.
soya.Idler(scene).idle()