Vou mostrar hoje como fazer um script para determinar qual é o objecto que está mais próximo e o mais afastado de um personagem na Game Engine do Blender.
Primeiro, você deverá estar interrogado: Mas em quê este script poderá me ser útil?
Veja um exemplo bem simples: Você tem um jogo em que o personagem terá que escolher entre dois bairros de uma cidade para abastecer seu carro, qual bairro ele irá escolher?Ou então você tem um jogo em que o jogador terá que recolher pontos, e você quer dar dicas sobre que ponto ir buscar num dado momento, por se encontrar mais perto, com este script você poderá escrever no ecrã( ou outro sitio qualquer) a seguinte mensagem: “O objecto mais próximo é Moto e se encontra a 12 metros” ou então: “Cuidado a polícia está a 3 metros!!! ”. Não é interessante???
Se puder visite o nosso fórum ou outro pelo qual você chegou aqui e deixe o seu comentário.
Vamos então ao trabalho:Vou colocar abaixo o script, comentando linha por linha(Não é aconselhavel copiar o sript daqui directamente para o seu game, se quiser pode baixar o programa exemplo e extrair o script daí, evitando assim possíveis erros,ou então copiar este script manualmente(letra por letra)):
import GameLogic as g #importando o modulo GameLogic, que é o #modulo principal da Game engine do Blender
con=g.getCurrentController() #buscando o controlador que ativou o script
own=con.getOwner() #Buscando o objecto ligado a este controlador, neste caso o personagem do jogo
ownpos=own.getPosition() #Buscando a posição do personagem
cena=g.getCurrentScene() #Buscando a cena activa
objlist=cena.getObjectList() #Buscando todos os objectos presentes na cena
objpos=[] #Criando uma lista para guarder a posição dos objectos da cena
objnome=[] #e para guardar os seus nomes
for i in objlist:
try:
if i.Status==1: #Só nos interessam os objectos com a propriedade Status=1. Está técnica é importante, para ignorar alguns objectos que não nos interessam, como a camera, o chão e as lampadas. Note que tens de criar esta propriedade em todos os objectos da cena.o
bjpos.append(i.getPosition()) #se Status==1, busca a sua posição,
objnome.append(i.getName()) # e o seu nome.
except: #Se alguma coisa falhar, como por exemplo um dos objectos não tiver a propriedade Status, o que seria fatal para o script,
print i.getName() #Faz qualquer coisa, neste caso imprimirá no console o nome do objecto sem esta propriedade, para a possivel correcção do problema.
#Função que calcula a distância entre dois objectos.
#Se tiveres problemas para importar o módulo math do Python no seu PC( e com isso não poderes usar as funções sqrt(raiz quadrada) e sqr(quadrado)), criei uma função altrnativa para o caso de não teres o Python instalado na sua maquina. Para instalar o Python clique aqui. A função original vem no script que está no exemplo
def distancia(a,b):
distancia=((a[0]-b[0])*(a[0]-b[0])+(a[1]-b[1])*(a[1]-b[1])+(a[2]-b[2])*(a[2]-b[2]))
aux=0
aux2=0
while(aux2max:
max=objdist[i]
nome=objnome[i]
if objdist[i]
min=objdist[i]
nome1=objnome[i]
placamax=cena.getObjectList()["OBplacamax"] #Busca da cena, o plano onde iremos escrever os dados do objecto mais afastado. Este plano deverá conter a propriedade Text, e estar configurada para apresentar textos na game engine, se não sabe como fazer isso clique aqui para ver um tutorial mostrando como fazer
placamin=cena.getObjectList()["OBplacamin"] # E este para o mais afastadoplacamax.Text="%s : %i" %(nome,int(max)) # escrevendo os dados do objecto mais #afastado placamin.Text="%s : %i" %(nome1,int(min)) # e o mais próximo
Lembrar que este script deverá estar ligado num sensor do tipo always se pretender atualizar a todo momento os dados, e em um outro(por exemplo teclado) se pretender apenas determinar esses dados perante alguma acção.










Comentários Recentes