Ursina引擎中如何实现实体碰撞检测并返回布尔值
Ursina引擎实体碰撞检测实现方案
Ursina内置了成熟的碰撞检测接口,你只需要做少量修改就能拿到需要的布尔值结果,实现步骤如下:
- 给参与碰撞的实体添加
collider属性启用碰撞检测,你使用的是cube模型,直接用collider='box'即可完美匹配碰撞体积 - 如果你需要单独检测玩家和特定宝可梦的碰撞,建议用列表存储批量生成的宝可梦实例,方便后续遍历
- 调用实体的
intersects()方法,返回结果的hit属性就是你需要的布尔值:碰撞到有效碰撞体时为True,未碰撞时为False
修改后的完整可运行代码
from ursina import * import random #variables speed = 0.05 number_of_pokemon = 10 app = Ursina() #textures player_texture = load_texture('pokemon orange assets/player.png') pokemon_texture1 = load_texture('pokemon orange assets/pokemon.png') pokemon_texture2 = load_texture('pokemon orange assets/pokemon2.png') pokemon_texture3 = load_texture('pokemon orange assets/pokemon3.png') grass_texture = load_texture('pokemon orange assets/grass.png') textbox_texture = load_texture('pokemon orange assets/textbox.png') missingno_texture = load_texture('pokemon orange assets/missingno.png') pokemontextures = [pokemon_texture1, pokemon_texture2, pokemon_texture3] # 存储所有宝可梦实例的列表 pokemon_list = [] #entitys: pokemon(s), player, textbox, battles # 给玩家添加box碰撞体 player = Entity(model = 'cube', texture = player_texture, scale = (1,1,0), position = (0,0,-0.1), collider='box') #textbox = Entity(model ='cube', texture = textbox_texture, scale = (5,1,0), position = (0,-3,0)) #spawns pokemon number = random.uniform(0,100) if number == 100: for i in range (100): # 给宝可梦添加box碰撞体,并存入列表 pokemon = Entity(model ='cube', texture = missingno_texture, scale = (1,2,0), position = (random.uniform(-10,10),random.uniform(-10,10),-0.1), collider='box') pokemon_list.append(pokemon) else: for i in range(number_of_pokemon): # 给宝可梦添加box碰撞体,并存入列表 pokemon = Entity(model ='cube', texture = random.choice(pokemontextures), scale = (1.5,1.5,0), position = (random.uniform(-5,5),random.uniform(-4,4),-0.1), collider='box') pokemon_list.append(pokemon) #spawns grass (不给草添加碰撞体,就不会被纳入碰撞检测) for y in range(20): for x in range(20): grass = Entity(model ='cube', texture = grass_texture, scale = (1,1,0), position = (x - 10,y - 10,0)) #movement def update(): player.x += held_keys['d'] * speed player.x -= held_keys['a'] * speed player.y += held_keys['w'] * speed player.y -= held_keys['s'] * speed # 输出碰撞布尔值,未碰撞时输出False,碰撞到宝可梦时输出True print(player.intersects().hit) # 如果需要单独检测碰撞到了哪个宝可梦,打开下方注释即可 # for p in pokemon_list: # if player.intersects(p).hit: # print("碰撞到特定宝可梦") app.run()
如果你不需要检测和草地的碰撞,不要给草地实体添加collider属性即可,碰撞检测会自动忽略没有碰撞体的实体。
内容的提问来源于stack exchange,提问作者Lucas Vuijk
相关产品推荐
相关产品推荐

