11from ursina import *
2- from ursina .prefabs .first_person_controller import FirstPersonController
32
43app = Ursina ()
5- grass_texture = load_texture ('assets/grass_block.png' )
6- stone_texture = load_texture ('assets/stone_block.png' )
7- brick_texture = load_texture ('assets/brick_block.png' )
8- dirt_texture = load_texture ('assets/dirt_block.png' )
9- sky_texture = load_texture ('assets/skybox.png' )
10- arm_texture = load_texture ('assets/arm_texture.png' )
11- punch_sound = Audio ('assets/punch_sound' ,loop = False , autoplay = False )
12- block_pick = 1
13-
14- window .fps_counter .enabled = False
15- window .exit_button .visible = False
164
17- def update ():
18- global block_pick
5+ # Constants for block types
6+ BLOCK_GRASS = 1
7+ BLOCK_STONE = 2
8+ BLOCK_BRICK = 3
9+ BLOCK_DIRT = 4
10+
11+ # Textures for blocks
12+ TEXTURES = {
13+ BLOCK_GRASS : 'assets/grass_block.png' ,
14+ BLOCK_STONE : 'assets/stone_block.png' ,
15+ BLOCK_BRICK : 'assets/brick_block.png' ,
16+ BLOCK_DIRT : 'assets/dirt_block.png'
17+ }
1918
20- if held_keys ['left mouse' ] or held_keys ['right mouse' ]:
21- hand .active ()
22- else :
23- hand .passive ()
19+ # Mapping keys to block types
20+ BLOCK_PICKS = {
21+ '1' : BLOCK_GRASS ,
22+ '2' : BLOCK_STONE ,
23+ '3' : BLOCK_BRICK ,
24+ '4' : BLOCK_DIRT
25+ }
2426
25- if held_keys ['1' ]: block_pick = 1
26- if held_keys ['2' ]: block_pick = 2
27- if held_keys ['3' ]: block_pick = 3
28- if held_keys ['4' ]: block_pick = 4
27+ # Create the scene
28+ scene = Entity ()
29+
30+ def update ():
31+ # Handle block selection
32+ handle_block_selection ()
2933
3034class Voxel (Button ):
31- def __init__ (self , position = (0 ,0 ,0 ), texture = grass_texture ):
32- super ().__init__ (
33- parent = scene ,
34- position = position ,
35- model = 'assets/block' ,
36- origin_y = 0.5 ,
37- texture = texture ,
38- color = color .color (0 ,0 ,random .uniform (0.9 ,1 )),
39- scale = 0.5 )
40-
41- def input (self ,key ):
42- if self .hovered :
43- if key == 'left mouse down' :
44- punch_sound .play ()
45- if block_pick == 1 : voxel = Voxel (position = self .position + mouse .normal , texture = grass_texture )
46- if block_pick == 2 : voxel = Voxel (position = self .position + mouse .normal , texture = stone_texture )
47- if block_pick == 3 : voxel = Voxel (position = self .position + mouse .normal , texture = brick_texture )
48- if block_pick == 4 : voxel = Voxel (position = self .position + mouse .normal , texture = dirt_texture )
49-
50- if key == 'right mouse down' :
51- punch_sound .play ()
52- destroy (self )
53-
54- class Sky (Entity ):
55- def __init__ (self ):
56- super ().__init__ (
57- parent = scene ,
58- model = 'sphere' ,
59- texture = sky_texture ,
60- scale = 150 ,
61- double_sided = True )
62-
63- class Hand (Entity ):
64- def __init__ (self ):
65- super ().__init__ (
66- parent = camera .ui ,
67- model = 'assets/arm' ,
68- texture = arm_texture ,
69- scale = 0.2 ,
70- rotation = Vec3 (150 ,- 10 ,0 ),
71- position = Vec2 (0.4 ,- 0.6 ))
72-
73- def active (self ):
74- self .position = Vec2 (0.3 ,- 0.5 )
75-
76- def passive (self ):
77- self .position = Vec2 (0.4 ,- 0.6 )
78-
79- for z in range (20 ):
80- for x in range (20 ):
81- voxel = Voxel (position = (x ,0 ,z ))
82-
83- player = FirstPersonController ()
84- sky = Sky ()
85- hand = Hand ()
86-
87- app .run ()
35+ def __init__ (self , position = (0 , 0 , 0 ), block_type = BLOCK_GRASS ):
36+ super ().__init__ (
37+ parent = scene ,
38+ position = position ,
39+ model = 'assets/block' ,
40+ origin_y = 0.5 ,
41+ texture = TEXTURES [block_type ],
42+ color = color .color (0 , 0 , random .uniform (0.9 , 1 )),
43+ scale = 0.5 ,
44+ )
45+
46+ def input (self , key ):
47+ if self .hovered :
48+ if key == 'left mouse down' :
49+ punch_sound .play ()
50+ block_type = BLOCK_PICKS .get (block_pick , BLOCK_GRASS )
51+ voxel = Voxel (position = self .position + mouse .normal , block_type = block_type )
52+
53+ if key == 'right mouse down' :
54+ punch_sound .play ()
55+ destroy (self )
56+
57+ # ... Sky, Hand, and Player classes as before ...
58+
59+ def handle_block_selection ():
60+ global block_pick
61+ for key , block_type in BLOCK_PICKS .items ():
62+ if held_keys [key ]:
63+ block_pick = block_type
64+
65+ if __name__ == "__main__" :
66+ grass_texture = load_texture (TEXTURES [BLOCK_GRASS ])
67+ stone_texture = load_texture (TEXTURES [BLOCK_STONE ])
68+ brick_texture = load_texture (TEXTURES [BLOCK_BRICK ])
69+ dirt_texture = load_texture (TEXTURES [BLOCK_DIRT ])
70+
71+ window .fps_counter .enabled = False
72+ window .exit_button .visible = False
73+
74+ for z in range (20 ):
75+ for x in range (20 ):
76+ voxel = Voxel (position = (x , 0 , z ))
77+
78+ player = FirstPersonController ()
79+ sky = Sky ()
80+ hand = Hand ()
81+
82+ app .run ()
0 commit comments