用python做一个fps游戏2(仅有基础功能)-爱代码爱编程
先找到上一次的代码:
from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController
app = Ursina()
ground = Entity(model='plane',Collider='box',scale=64,texture='grass')
for i in range(16):
Entity(model='cube',scale=2,texture='brick',
texture_scale=(1,2),
x=random.uniform(-8,8)
z=random.uniform(-8,8)+8
collider='box',
scale_y=random.uniform(2,3),
origin_y=-0.5)
player = FirstPersonController(model='cube',color=color.orange,z=-10,origin_y=-0.5)
app.run()
如果运行不了的先看第一集。
找到以后我们开始编程,这一次我们要把游戏做出上帝模式和射击功能。
上帝模式也不叫上帝模式,算是ursina库的一种特性。
叫做编辑相机,
我们现在加入一下。
from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController
app = Ursina()
ground = Entity(model='plane',Collider='box',scale=64,texture='grass')
for i in range(16):
Entity(model='cube',scale=2,texture='brick',
texture_scale=(1,2),
x=random.uniform(-8,8)
z=random.uniform(-8,8)+8
collider='box',
scale_y=random.uniform(2,3),
origin_y=-0.5)
editor_camera = EditorCamera()
player = FirstPersonController(model='cube',color=color.orange,z=-10,origin_y=-0.5)
app.run()
editor_camera这个变量名可以自己起,我这里就先为了方便。
EditorCamera()意为初始化这个编辑相机
我再优化一下,让编辑相机开始时不启动
from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController
app = Ursina()
ground = Entity(model='plane',Collider='box',scale=64,texture='grass')
for i in range(16):
Entity(model='cube',scale=2,texture='brick',
texture_scale=(1,2),
x=random.uniform(-8,8)
z=random.uniform(-8,8)+8
collider='box',
scale_y=random.uniform(2,3),
origin_y=-0.5)
editor_camera = EditorCamera(enabled = False)
player = FirstPersonController(model='cube',color=color.orange,z=-10,origin_y=-0.5)
app.run()
现在就不会开始就启动了
在游玩时,我们需要让它按下某一个按键时启动,所以我们要用函数来表示
修改后是这样的:
from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController
app = Ursina()
ground = Entity(model='plane',Collider='box',scale=64,texture='grass')
for i in range(16):
Entity(model='cube',scale=2,texture='brick',
texture_scale=(1,2),
x=random.uniform(-8,8)
z=random.uniform(-8,8)+8
collider='box',
scale_y=random.uniform(2,3),
origin_y=-0.5)
editor_camera = EditorCamera(enabled = False)
def input_pause(key):
if key == 'tab':
editor_camera.enabled = not editor_camera.enabled
player = FirstPersonController(model='cube',color=color.orange,z=-10,origin_y=-0.5)
app.run()
这回我们实现了按下Tab键启用编辑相机的功能。
但是有些编程小白就要问了:
Q:为什么你要写not editor_camera.enbled而不是True呢?
A:因为写True太麻烦,你还要写一个函数来关闭它,而not editor_camera.enbled呢,not在python语法里是反向,也就是说编辑相机是关闭的我就打开,开启的我就关闭。
但现在还有一个问题,因为现在只定义了input_pause这个函数,所以不会起作用,我们还要修改。
修改后:
from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController
app = Ursina()
ground = Entity(model='plane',Collider='box',scale=64,texture='grass')
for i in range(16):
Entity(model='cube',scale=2,texture='brick',
texture_scale=(1,2),
x=random.uniform(-8,8)
z=random.uniform(-8,8)+8
collider='box',
scale_y=random.uniform(2,3),
origin_y=-0.5)
editor_camera = EditorCamera(enabled = False)
def input_pause(key):
if key == 'tab':
editor_camera.enabled = not editor_camera.enabled
pause_handler = Entity(input=input_pause)
player = FirstPersonController(model='cube',color=color.orange,z=-10,origin_y=-0.5)
app.run()
现在就可以了
有小白又要问了:
Q:pause_handler是啥?
A:pause_handler是处理暂停的变量,我们先用它来监控按键。
OK!回答完问题继续优化(此处说一句:在编辑相机下,鼠标右键拖动场景。上下左右移动,空格跳跃。)
我们还可以增强一下,进入编辑相机时显示鼠标:
from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController
app = Ursina()
ground = Entity(model='plane',Collider='box',scale=64,texture='grass')
for i in range(16):
Entity(model='cube',scale=2,texture='brick',
texture_scale=(1,2),
x=random.uniform(-8,8)
z=random.uniform(-8,8)+8
collider='box',
scale_y=random.uniform(2,3),
origin_y=-0.5)
editor_camera = EditorCamera(enabled = False)
def input_pause(key):
if key == 'tab':
editor_camera.enabled = not editor_camera.enabled
mouse.locked = not editor_camera.enabled
#player.cursor.enabled = editor_camera.enabled
#player.visible_self = editor_camera.enabled
editor_camera.position = player.position
pause_handler = Entity(input=input_pause)
player = FirstPersonController(model='cube',color=color.orange,z=-10,origin_y=-0.5)
app.run()
editor_camera.position = player.position是控制编辑相机位置在玩家这里,不喜欢的注释掉。
player.cursor.enabled = editor_camera.enabled和player.visible_self = editor_camera.enabled我为啥注释掉呢,因为意义不大,仅是用来控制玩家光标显示和隐藏,还有设置编辑相机是否显示,喜欢的把#去掉。
上帝模式的视角我们就做好了,接下来就是射击功能了。
我们先来创建一个枪试试手:
from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController
app = Ursina()
ground = Entity(model='plane',Collider='box',scale=64,texture='grass')
for i in range(16):
Entity(model='cube',scale=2,texture='brick',
texture_scale=(1,2),
x=random.uniform(-8,8)
z=random.uniform(-8,8)+8
collider='box',
scale_y=random.uniform(2,3),
origin_y=-0.5)
editor_camera = EditorCamera(enabled = False)
def input_pause(key):
if key == 'tab':
editor_camera.enabled = not editor_camera.enabled
mouse.locked = not editor_camera.enabled
#player.cursor.enabled = editor_camera.enabled
#player.visible_self = editor_camera.enabled
editor_camera.position = player.position
pause_handler = Entity(input=input_pause)
player = FirstPersonController(model='cube',color=color.orange,z=-10,origin_y=-0.5)
gun = Entity(model='cube',parent=camera,scale=(0.5,0.2,1),
position=(0.5,-0.25,0.5),
color=color.red)
app.run()
我们的枪就创建好了。
再来射击:
from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController
app = Ursina()
ground = Entity(model='plane',Collider='box',scale=64,texture='grass')
for i in range(16):
Entity(model='cube',scale=2,texture='brick',
texture_scale=(1,2),
x=random.uniform(-8,8)
z=random.uniform(-8,8)+8
collider='box',
scale_y=random.uniform(2,3),
origin_y=-0.5)
editor_camera = EditorCamera(enabled = False)
def input_pause(key):
if key == 'tab':
editor_camera.enabled = not editor_camera.enabled
mouse.locked = not editor_camera.enabled
#player.cursor.enabled = editor_camera.enabled
#player.visible_self = editor_camera.enabled
editor_camera.position = player.position
pause_handler = Entity(input=input_pause)
player = FirstPersonController(model='cube',color=color.orange,z=-10,origin_y=-0.5)
gun = Entity(model='cube',parent=camera,scale=(0.5,0.2,1),
position=(0.5,-0.25,0.5),
color=color.red)
def shoot():
print("shooting")
app.run()
这里就先卖个关子,打印一下shooting,完全射击的话下一次再实现。
PS:我在检查时漏了一句,在普通模式时上下左右移动,空格跳跃,移动鼠标转视角。有些电脑(比如我这个)加载不了砖块的贴图,我也不知道怎么解决,请各位大神在评论区帮个忙,感谢。