Olá. Meu nome é Alexander Ptichkin. Há 8 anos venho ensinando criação de desenhos animados e animação; Passei 3 anos desenvolvendo meu próprio mecanismo de jogo HTML5 2.5D chamado PointJS. Há 8 anos de rodízio neste setor, acumulei muito material que quero compartilhar aqui no blog. Esta é a minha primeira postagem no Habr. Julgue estritamente :) Suas sugestões para melhorar outros artigos escrevem nos comentários. Vai!
Muitas vezes me perguntam por que redesenho todo o CANVAS em meu mecanismo de jogo PointJS, e não atualizo apenas a parte onde as mudanças ocorreram.
Neste artigo, não pretendo ser a verdade absoluta - como dizem, quantas pessoas têm tantas opiniões. Eu apenas compartilharei meus pensamentos, ideias e desenvolvimentos que me levaram a um redesenho completo do CANVAS. Eu ficaria feliz em ouvir suas opiniões sobre isso nos comentários, a fim de otimizar o motor com base neles. Na verdade, na comunicação, nasce a verdade.
Parece muito lógico no início. Em algum lugar na borda da tela, um personagem inimigo correu, e apenas aquela parte da CANVAS que queremos redesenhar, economizando recursos. Era tão verossímil que desenhei uma folha A4 da noite para o dia em busca da melhor solução para esse problema. E aqui está o que aconteceu.
Podemos redesenhar a parte CANVAS apenas se duas condições forem atendidas:
O fundo do jogo deve ser dividido em partes e não uma imagem inteira. Julgue por si mesmo: se o fundo é uma imagem inteira, então ainda terá que ser redesenhado em algum lugar. E, uma vez que é integral, terá de ser completamente redesenhado, o que significa que não se pode falar de redesenho de uma parte separada do CANVAS. Mais adiante neste artigo, você entenderá o que quero dizer e por quê.
A câmera deve estar no jogo. Porque se a câmera está se movendo, então toda a cena está se movendo, o que significa que toda a cena precisa ser redesenhada.
Essas duas condições acima já cortaram muitos jogos e mecânicas. E ainda nem começamos a descobrir.
Portanto, decidimos o pano de fundo para o jogo. Como preparar, eu vou te dizer agora.
Maya (, Autodesk Maya, 2D). . .
, , . 3000 3000px.
png-, . , , Maya, . php. 2786 1998. , , , Photoshop, . Photoshop, php :)
( ). , Diablo 2 . (), 3D. . 10000px 10000px, 1920 1080px ( ). .. , , . - ( ). , , .
, - . Anime Studio Pro (Moho) , 1920 1080 ( , , , - ). 300 300px. ...
Photoshop (, ). , 8 8 . 8*8 = 64 348 250px. Photoshop, .
gif, , , . javascript .
, , 1 0 ( .) 1, , 0, 0 , 1. , - 21 . MAC Book Name Manager. , img. , Rename.
, ! Photoshop , , , . -, . ( ), . Javascript , , . : 0 64 – , 64 .
javascript , .
fon = [], , xy, (xy ).
var xy = 0, fon = [];
, X , - Y, .
for (var x=0; x<8; x++) {
for (var y=0; y<8; y++) {
}
}
x<8 , 8 . y - 8 . 8 8, img. 64.
xy fon .
xy++;
fon.push(1);
PointJS , game.newImageObject({ });
. , , , . , fon game.newImageObject.
:
var xy = 0, fon = [];
for (var x=0; x<8; x++) {
for (var y=0; y<8; y++) {
xy++;
fon.push(
game.newImageObject({
file : "img/" + xy + ".gif", //
x : 0 + 348*y, // y . x 400, 400*2 400*3
y : 0 + 250*x, // y
w : 348,
h : 250
})
)
}
};
file : "img/" + xy + ".gif"
. , xy , 1, :
file : "img/" + xy + ".gif", // //
//
file : "img/" + 1 + ".gif"// img/1.gif
file : "img/" + 2 + ".gif"// img/2.gif
file : "img/" + 3 + ".gif"// img/3.gif
file : "img/" + 4 + ".gif"// img/4.gif
// ...
.
w=346, h=248. , 2px, , .
var xy = 0, fon = [];
for (var x=0; x<8; x++) {
for (var y=0; y<8; y++) {
xy++;
fon.push(
game.newImageObject({
file : "img/" + xy + ".gif", //
x : 0 + 348*y, // y . x 400, 400*2 400*3
y : 0 + 250*x, // y
w : 346,
h : 248
})
)
}
};
, , . - . : . - , (.. ). , , , , draw();
. :
for (var i in fon) {
if (fon[i].isInCamera()) fon[i].draw();
}
, . , ( ), . . , - , , . , , After Effects. .
, , - CANVAS? ?. , . : , .
. : , . : , , . ( ). , ( ):
, . .
, ( ). , . , , ?
. , / . , . , StaticBox()
? , getStaticBox();
- , . , , StaticBox();
. , fon = [];? , ? fon. , obj, . , :
var collisionFon = []; //
var collisionObj = []; // obj
for (var i in fon) {
if (player2.isStaticIntersect(fon[i].getStaticBox())) {
collisionFon.push(fon[i])
}
}
for (var i in obj) {
if (player2.isStaticIntersect(obj[i].getStaticBox())) {
collisionObj.push(obj[i])
}
}
. . , , . ? : , , ,
:
!
, , -. .. , collisionFon collisionObj, , , - . Z. Z Y, . , , . , , , Y, , , . , . , : , CANVAS . , , , MMORPG-, . ( ) , .
, . , , , . ! , CANVAS. , , CANVAS? , - , , . , , , !
Bem, isso conclui meu primeiro artigo. Espero que não esteja muito cansado. Se você tem alguma opinião sobre o acima - escreva nos comentários, nós discutiremos. Repito, a verdade nasce da comunicação. E é preciso melhorar o motor. Obrigado a todos e até os novos artigos.
O autor do texto e de todo o material do artigo: Alexander Ptichkin, fundador do projeto educacional Mult-uroki. Escrito especificamente para habr.com. É proibida a cópia ou outro uso do material sem a permissão por escrito do autor.