Existe uma resposta curta sobre como fazer um efeito do tipo Mode / mario kart no pygame?
Pesquisei bastante no Google, todos os documentos que consigo encontrar são dezenas de páginas em outros idiomas (asm, c) com muitas equações de aparência estranha e outras coisas.
Idealmente, gostaria de encontrar algo explicado mais em inglês do que em termos matemáticos.
Eu posso usar PIL ou pygame para manipular a imagem / textura, ou o que mais for necessário.
Eu realmente gostaria de obter o efeito do modo 7 no pygame, mas parece que estou perto do fim da minha inteligência. A ajuda seria muito apreciada. Todo e qualquer recurso ou explicação que você possa fornecer seria fantástico, mesmo que não seja tão simples quanto eu gostaria que fosse.
Se eu conseguir descobrir, escreverei uma página definitiva sobre como fazer o modo 7 para iniciantes.
edit: mode 7 doc: http://www.coranac.com/tonc/text/mode7.htm
Respostas:
O modo 7 é um efeito muito simples. Ele projeta uma textura 2D x / y (ou ladrilhos) em algum piso / teto. Os SNES antigos usam hardware para fazer isso, mas os computadores modernos são tão poderosos que você pode fazer isso em tempo real (e não precisa do ASM, como você mencionou).
A fórmula matemática 3D básica para projetar um ponto 3D (x, y, z) em um ponto 2D (x, y) é:
Quando você pensa sobre isso, faz sentido. Objetos distantes são menores que objetos próximos a você. Pense em trilhos de trem que não levam a lugar nenhum:
Se olharmos para os valores de entrada da fórmula:
x
ey
será o pixel atual que estamos processando, ez
haverá informações de distância sobre a distância que o ponto está. Para entender o quez
deve ser, olhe para a figura, ela mostraz
valores para a imagem acima:Portanto, neste exemplo, o
z
valor éy - horizon
(assumindo que(x:0, y:0)
está no centro da tela)Se juntarmos tudo, ele se torna: (pseudocódigo)
Uma última coisa: se você quiser fazer um jogo de mario kart, suponho que você também queira girar o mapa. Bem, também é muito fácil: gire
sx
esy
antes de obter o valor da textura. Aqui está a fórmula:e se você quiser mover-se pelo mapa, basta adicionar algum deslocamento antes de obter o valor da textura:
NOTA: testei o algoritmo (quase copiar e colar) e funciona. Aqui está o exemplo: http://glslsandbox.com/e#26532.3 (requer navegador recente e WebGL ativado)
NOTA2: eu uso matemática simples porque você disse que quer algo simples (e não parece familiarizado com a matemática vetorial). Você pode conseguir as mesmas coisas usando a fórmula da wikipedia ou os tutoriais fornecidos. O modo como eles fizeram isso é muito mais complexo, mas você tem muito mais possibilidades de configurar o efeito (no final, funciona da mesma maneira ...).
Para mais informações, sugiro a leitura: http://en.wikipedia.org/wiki/3D_projection#Perspective_projection
fonte
Aqui está o código para fazê-lo. Eu sou o mesmo código do tutorial que fiz no meu blog . Confira aqui para aprender o método Mode 7 e o RayCasting.
Basicamente, o pseudo-código é:
Aqui está o código que eu criei em JAVA, seguindo o meu tutorial.
O resultado é:
fonte