Las 2 preguntas son casi las mismas:
La línea:
Código:
keys[keyname]=(e.type == "keydown");
comprueba si e.type tiene como valor "keydown" (podría valer "keyup") y asigna el valor booleano correspondiente a keys[keyname]
Un código casi equivalente pero mas largo sería:
Código:
if( keyname=="w"){
if( e.type=="keydown") keys["w"]=true;
if( e.type=="keyup" ) keys["w"]=false;
}else if( keyname== "i"){
if( e.type=="keydown") keys["i"]=true;
if( e.type=="keyup" ) keys["i"]=false;
}
Es decir:
keys guarda en cada momento si una tecla esta siendo pulsada. Cuando pulsas una tecla (evento
keydown) asignas el valor correspondiente de
keys a true, y cuando la sueltas (evento
keyup) la asignas a false.
Esta es la razón por la que necesitas ambos eventos y no solo el de pulsar.
De esta forma, en la función
actualizar que se ejecuta cada 40ms, puedes comprobar fácilmente si las teclas están siendo pulsadas o no y de esta forma mover o no los cursores de tu juego.
Espero haber aclarado las dudas ;)