quinta-feira, 16 de dezembro de 2010

Movimento de Câmera vista de cima




Em jogos de RPG ou de RTS se utiliza muito a visão de cima, a navegação pelo cenario com a câmera pode ser uma dificuldade há mais. A proposta aqui é a movimentação da câmera pelas bordas da área de visão, como no video abaixo:




Você pode reparar que ao movimentar o cursor do mouse para perto das bordas da janela, "o cenário se desloca", isto é a câmera se desloca em relação ao cenário.

Como funciona o template?
Precisamos criar um script python que saiba da localização do cursor mouse e as dimensões da janela, em seguida comparar a posição atual do cursor em relação aos limites da tela, então criamos aréas de ação do cursor.


Assim que o cursor atingir umas das área de ação a câmera se desloca na direção da área ativa e quando sai da área para o deslocamento.


Os elementos do template:
Ativos - Câmera ligada(parenteada) ao Empty, no qual vai no Painel de Lógica um sensor do tipo Always e outro de Mouse/Moviment, ligados ao Controlador Python.

O Script Python:



import Rasterizer
Rasterizer.showMouse(1)
w = Rasterizer.getWindowWidth()
h = Rasterizer.getWindowHeight()
import GameLogic as g
from GameLogic import *

cont = getCurrentController()
ow = cont.owner

mousesensor = cont.sensors['move']
campos = ow.position

x = mousesensor.position[0]
y = mousesensor.position[1]

screenposx = 1.0*(x - w/2) / w
screenposy = 1.0*( ( h - y ) - h/2 ) / h

#deltax = campos[2]/1
#deltay = campos[2]/1
deltax = campos[2]/1.265
deltay = campos[2]/1.84

newposx = campos[0] + screenposx * deltax
newposy = campos[1] + screenposy * deltay
newposz = 0

newpos = [newposx,newposy,newposz]

print y
#print L,l
#print screenposx, screenposy
#print newposx,newposy

#DETECTA OS LIMITES DE AÇAO DA TELA
if y < 50:
up="on"
else:
up="off"
if y > h-50:
down="on"
else:
down="off"
if x < 50:
left="on"
else:
left="off"
if x > w-50:
right="on"
else:
right="off"

vel = 0.1

if up=="on":
ow.applyMovement([0,vel,0],1)
print "up"
# down 

elif down=="on":
ow.applyMovement([0,-vel,0],1)
#print "down"

# left
elif left=="on":
ow.applyMovement([-vel,0,0],1)
print "left"

# right
elif right=="on":
ow.applyMovement([vel,0,0],1)
print "right"


 Conclusão:
Esse template demonstra os princípios do funcionamento de Movimento de câmera, com ele você pode usar de base para seus projetos e incrementar mais funções.

Download do template: aqui

Um comentário:

  1. Olá tenho feito na última semana um game simples que exige este tipo de movimentação de camera, porém utilizo o blender 2.6, gostaria de saber se vc teria como me ajudar a portar este código pra API do blender que uso, não possuo muito conhecimento em python, pois comecei tem pouco tempo, e não consegui fazer a "conversão" do código. Darei os devidos créditos pelo seu Trabalho, participo do fórum Blender Brasil e irei postar o jogo lá, meu nick é mmsdocs, caso vc tenha alguma dúvida pode me contatar por aki mesmo.

    ResponderExcluir