MATRIX伝言板!
この前、映画「Matrix」のあの緑色の文字が雨のように流れていく画面(Matrix Code Rainっていうんかな?)をHTMLのCanvasで作りました。
2Dバージョンと3Dバージョンを作りましたね。
でも、ただランダムな文字列が流れてくるだけだと、かっこいい画面なだけであって、それ以上の意味をなさない…
全然いいんですけど、プラスで”何か”つけたくなったので、
MATRIX伝言板を作りました!
入力したメッセージが次々流れてくるアプリです。
MATRIX伝言板
Matrix Code Rain風伝言板
どうやって使う??


MATRIX伝言版と上からたくさん流れてきていますが、消してみましょう。
中央のテキスト入力フォームに「clear」と入力し、Enterを押すと、文字が流れてこなくなります。

次に何かしらメッセージを追加していきましょう。
よみあきはご飯を食べに行っています
とでも書いてみましょう

そして、Enterを押すと、「よみあきはご飯を食べに行っています」のテキストが次々に上から流れてきます。

このように、メッセージをどんどん追加することで伝言板として使えます!?
ぜひ席を外すときに使ってみてください~~
ソースコード
ソースコードは以下のようになっています。
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<!-- Bootstrap Javascript(jQuery含む) -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<title>MATRIX伝言板</title>
<style>
html{
background-color:black;
height:100%;
overflow:hidden;
}
body{
background-color:black;
margin:0;
padding:0;
height:100%;
}
#addText{
position:absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border:none;
outline: none;
background-color: transparent;
font-size:28pt;
color:#0F0;
text-align: center;
}
#addText:hover{
background-color:rgba(0,255,0,0.2);
}
.modal{
color:#0F0;
}
.modal-content{
background-color: black;
border-color: #FFF;
text-shadow: 0 0 10px #0F0,0 0 15px #0F0;
}
.btn-close{
color:#0F0;
background-color: black;
text-shadow: 0 0 10px #0F0,0 0 15px #0F0;
border-color:#0F0;
}
.btn-:hover{
color:rgba(0,255,0,0.5);
background-color: black;
text-shadow: 0 0 10px #0F0,0 0 15px #0F0;
border-color:black;
}
</style>
</head>
<body>
<input type="text" id="addText">
<canvas id="Matrix"></canvas>
<script>
$(window).on('load',function(){
$('#exampleModalCenter').modal('show');
});
let canvas=document.getElementById("Matrix");
let context=canvas.getContext("2d");
canvas.width=window.innerWidth;
canvas.height=window.innerHeight;
let clear=0;
$(function(){
/// DOM読み込み後に自動フォーカスイン
$("#addText").focus();
});
$("#addText").keypress(function(e) {
if (e.keyCode == 13) {
//clear入力でリセット
if($("#addText").val()=="clear"){
clear=1;
}
else if($("#addText").val()==""){}
else{
//半角英字を全角に変換
let fullwidthText=$("#addText").val().replace(/[A-Za-z0-9]/g, function(s) {
return String.fromCharCode(s.charCodeAt(0) + 65248);
});
inputText.push(fullwidthText);
$("#addText").val("");}
return false;
}
});
//出力文字の候補
let inputText=[];
inputText.push("MATRIX伝言板");
//出力文字サイズ
const fontSize=28;
//行数列数決め
let colums=canvas.width/fontSize;
let lines=canvas.width/fontSize
//落ちるコードを管理する配列
let rains=[];
//落ちるコードのコンストラクタ
var Rain=function(context,i,text,rainDrops, outputText){
this.context=context;
this.i=i;
this.text=[];
this.rainDrops=rainDrops;
this.outputText=outputText;
};
//落ちるコードの描写
Rain.prototype.draw=function(){
context=this.context;
context.fillStyle="#0F0";
context.font=fontSize+"px monospace";
context.shadowColor="#0F0";
context.shadowBlur=4;
//出力文字決め
for (let k=0;k<this.outputText.length;k++){
this.text.push(this.outputText.charAt(k));
}
//薄くなっていく処理
for(let j=0;j<lines;j++){
context.globalAlpha = Math.max(1.0-7.0*((j+1)/lines),0);
context.fillText(this.text[0],this.i*fontSize,(this.rainDrops-j-this.outputText.length)*fontSize);
};
context.globalAlpha = 1.0;
//文字のかたまり描画
for (let k=0;k<this.outputText.length;k++){
this.text.push(this.outputText.charAt(k));
context.fillText(this.text[k],this.i*fontSize,(this.rainDrops+k-this.outputText.length)*fontSize);}
//画面外に出たときの処理
if(this.rainDrops*fontSize>(canvas.height*2)&&Math.random()>0.975&&clear==0&&inputText.length !== 0){
this.rainDrops=0;
this.text=[];
this.outputText=inputText[Math.floor(Math.random()*inputText.length)];
}
if(this.rainDrops*fontSize>(canvas.height*2)&&clear==1){
this.outputText="";
inputText=[];
clear=0;
}
//下に一文字分下がる
this.rainDrops++;
};
//落ちるコードインスタンスを列の数だけ
for (i = 0; i < colums; i++) {
rainDrops=1;
text=[];
outputText=inputText[0];
rain=new Rain(context,i,text,rainDrops,outputText);
rains.push(rain);
};
//実行関数の作成
function go(){
//キャンバス上クリア
context.clearRect(0, 0, canvas.width, canvas.height);
//格納されたrainsの各要素を実行
for(var k=0;k<colums;k++){
rains[k].draw();
}};
//ウィンドウサイズ変更した場合は再読み込み
window.addEventListener('resize', function(){
location.reload();
});
//30フレームごとに繰り返しgoを実行
setInterval(go,120);
</script>
</body>
</html>




コメント