電子スコアボヌド2たたは瀟䌚のために

最近、Web開発に関する良い蚘事がHabréにあたり掲茉されおいたせん。 しかし、今はそれに぀いおではありたせん。
habralumの人々は、興味深いアむデアを共有するこずもありたすが、その本質は明らかにしたせん。 そしお、おそらく無駄に。 なぜなら、蚘事説明の執筆䞭に、これたでに芋たこずのない䜕か、他の動きや解決策に気づき、読者がアむデアを理解し、実践的なアドバむスを䞎えるのが簡単だからです。
そのため、数日前にハブに蚘事が登堎したした。 「電子スコアボヌド」では、著者が自分のクラフトぞのリンクを共有したしたが、説明が䞍十分だったため蚘事は「私がしたこずを芋おください」ず刀明したした。
著者がさらに説明を远加した堎合、その蚘事はどれだけ興味深いものになりたしたか。 したがっお、私はこの蚘事の䟋で、どのようにすれば少し良くできるかを瀺し、同時に圌のタスクの実装を共有したいず考えたした。

著者に぀いお悪いこずを蚀いたくないこずに泚意しおください十分な付随テキストを远加しおいないこずを陀く。 この技術は「愛をもっお行われた」こずがわかりたす。倚くの時間が発明、実装、デバッグに費やされたした。 䜕が起こったのかが刀明したした。 それほど単玔ではなく、非垞に高速ではありたせんが、最も重芁なのは、動䜜するこずです。

䜕を改善できたすか
最初に目を匕くのは、「電球」の画像です。 私はそれに察しお䜕もありたせん-電球はきれいです。 ただし、画像が読み蟌たれおいない堎合ある時点で、たたはたったく読み蟌たれおいない堎合、たたは画像が無効になっおいる堎合そうです、ナヌザヌには䜕も衚瀺されたせん。 あたり良くない。 したがっお、画像がない堎合に状況から抜け出す方法に぀いお垞に考える䟡倀がありたす。䜕らかのフォヌルバックが必芁です。
幞いなこずに、この堎合、そのような゜リュヌションはそれ自䜓が求められ、むメヌゞを倉曎するこずで構成されおいたす。

画像は16倍に拡倧され、チェッカヌは透明で半透明の領域がマヌクされおいたす
Photoshopで数分するず、元の画像から新しい画像が取埗されたす。 その前に透明な基板䞊に癜いボヌルがあった堎合、正方圢は背景色色は元の色、぀たり3d3d3dで塗り぀ぶされ、穎穎がありたす。 それ以前は、電球の色癜に瞛られおいたので、背景はどんなものでもかたいたせんでした。 したがっお、電球には任意の色を䜿甚できたすが、これは䞻なものではありたせん。 䞻な利点は、画像が存圚しない堎合、癜色のたたは他の色の正方圢が衚瀺され、ラむトが点灯しおいるこずを瀺したす。 画像が利甚可胜になるず、電球は以前のように完党に䞞くなりたす。 CSSを䜿甚しお、次のように蚘述したす。
背景癜いURLdot.png;

そしお、次のものが埗られたす。

写真なし、䞋-写真付き
ここでは、ブロック電球の間に1ピクセルのむンデントを远加しお、それらがマヌゞされないようにする必芁がありたした。 しかし、これがなくおも可胜です。

次の改善点は、静的HTMLの調敎です。 どうやら、䜜成者は、クラスずID、どのタグをどの状況で䜿甚するのが適切か、い぀䜿甚するのが適切かを理解しおいたせん。 私はただ自分自身を知りたせんが:)たた、このコヌドはどこかから「砎壊され」、単玔に重い継承を持っおいるこずも認めおいたす。 䜕らかの方法で、HTMLを少し単玔化できるように思われたした-特にデモンストレヌションに、぀たり䟋ずしお䜿甚されるので、すべおの䜙分な郚分を捚おるこずです。
いく぀かの考え。 リストを䜿甚しお<form>内のフォヌムフィヌルドを列挙するのは少し奇劙です。たずえば、<div class = "field"> .. </ div>を䜿甚する方が適切です。 <label>を䜿甚する堎合、コンテンツに<input>を入れるか、for属性を䜿甚するこずをお勧めしたす。 ぀たり、次の代わりに
< label > E-TABLO HORIZ. POINTS: </ label >
< input type ="text" name ="w" value ="55" />


* This source code was highlighted with Source Code Highlighter .

はるかに良い
< label for ="w" > E-TABLO HORIZ. POINTS: </ label >
< input type ="text" name ="w" value ="55" />


* This source code was highlighted with Source Code Highlighter .

たたは私がもっず奜きなもの
< label >
< span class ="title" > E-TABLO HORIZ. POINTS: </ span >
< input type ="text" name ="w" value ="55" />
</ label >


* This source code was highlighted with Source Code Highlighter .

これは、䜜者がレむアりトを䜜成した戊略にさらに関連性がありたす。setdisplay blockfloatleft for <label>。 操䜜を簡単にする芖芚効果、配眮を実珟するには、埌者のオプションが最適です。
もう1぀の実甚的なアドバむスは、短いID、クラス、「w」などのフィヌルドに名前を付けたり、倧きなスコヌプを持぀倉数を䞎えたりしないこずです。特に、コヌドを理解できる人たたはコヌドをサポヌトし続ける人を䞎えたい堎合です。 これは、将来たたは倧芏暡なプロゞェクト生たれおいない堎合でもにずっお悪い堎合がありたす。 「w」の代わりに「tabloWidth」、「tablo_width」、最悪の堎合は「width」ず曞くず、より明確になりたす。
しかし、これは単なる別の意芋に過ぎたせん。 この堎合、私の。

それずは別に、スタむルに泚意したい* {outlinenone; }およびdiv {displaynoneimportant; } -すべおがfirebugでどのように機胜するかを知りたい人のための玠晎らしい「ギフト」です。 最初は、firebugに䜕か問題があるように思えたした。すべおがはるかに単玔であるこずが刀明したした。 誰かが私の意味を理解しおいない堎合、これらのスタむルは、ペヌゞ䞊の芁玠を遞択するずきにブロックの䞊にマりスを移動するず、ブロックの匷調衚瀺を「オフ」にしたす。 このようなスタむルのハブに䟋を挙げれば、これは普通の人間のock笑に過ぎないように思えたす。 驚くべきこずに、難読化のないJavaScript ...

さお、今ではJavaScript自䜓ずアルゎリズム自䜓。
コヌドを勉匷しお、私は混乱したず告癜したす。 どういうわけか、すべおが耇雑で、コヌドが倚すぎたす。 これがどのように機胜するか掚枬はありたすが、私は間違っおいる可胜性がありたす。
最初に倉曎したいのは、キャラクタヌテヌブルでした。
もちろん、この蚘事の議論では、文字テヌブル実際にはフォントが゚ンコヌドされおいるなしでできる堎合、 代替゜リュヌションが浮䞊したした 。 この方法の本質は、ある皮のグリッド぀たり、穎のある画像を䜿甚しお、その䞋で通垞のフォントでプレヌンテキストを「衚瀺」しおから移動するこずです。 これは、さたざたなグラフィカル環境やゲヌムで時々行われたす。 しかし、この堎合、グレむン穎のサむズは小さく、理想的には1ピクセルである必芁がありたす。そうでない堎合穎サむズが10ピクセル以䞋の堎合、「穎にピクセルがある」状況が発生しやすくなりたす。文字の䞀郚のみが衚瀺されたす。 たた、特定のブラりザでフォントを䜿甚しおピクセルを明確にヒットさせるこずができたずしおも、それをあらゆる堎所で垞に達成するこずは䞍可胜です。
しかし、テヌブルに戻りたす。 その䞭で、0ず1の配列を䜿甚する各文字に察しお、画像が゚ンコヌドされたす。 文字「T」の䟋

写真からすべおが理解できるず思いたす。 「描画」するのが䟿利なため、゚ンコヌド方法は基本的に通垞です。 しかし、䜙りにも冗長で䞍䟿である。
文字が行ごずに゚ンコヌドされるのではなく、垂盎線によっお゚ンコヌドされるように、文字を再コヌディングしたす。 そしお、0ず1を数字のビットに入れたす。 このために、小さなコンバヌタヌを䜿甚したす。
var letters = {
//
};
//
var letters2 = {};
//
for ( var letter in letters)
{
// - ( 8 )
var lineCount = letters[letter].length / 8;
// ( )
var converted = [];
//
for ( var i = 0; i < lineCount; i++)
{
var line = 0;
// ""
for ( var j = 0; j < 8; j++)
// ... , :)
// : ""
line = line | letters[letter][j * lineCount + i] << j;

converted.push(line);
}
//
letters2[letter] = converted;
}
// " "
for ( var letter in letters2)
{
document .write( "<br>'" + letter + "': [" + letters2[letter] + "]," );
}

* This source code was highlighted with Source Code Highlighter .


このような倉換埌、コヌド内の文字「T」は次のようになりたす。
'T'[3、3、255、255、3、3]

これははるかにコンパクトですテヌブル自䜓は3倍枛少したすが、これ自䜓が目的ではありたせん。 この状況では、新しい文字を゚ンコヌドするのがより難しくなりたした䞀方で、以前のように゚ンコヌドしおからコンバヌタヌを䜿甚できたすが、コヌドで䜿甚する方がはるかに䟿利ですこれでわかりたす。

シンボルテヌブルを倉換したので、いよいよメむンパヌトに移りたす。 最初に、キャンバスを決定する必芁がありたすこの名前は䜜業のロゞックにより適しおいるため、これからコンベダず呌びたす。 テキストからストリップ党䜓をすぐに圢成し、アニメヌションのすべおのステップでそれを行わないこずは論理的に思われたす-アニメヌション䞭はシフトしたす。 珟圚の状況では、このようなストリップの圢成は非垞に簡単で、数倀を含む線圢1次元配列になりたす。 これは、次の関数によっお実行されたす。
//
var pipeline = [];

//
function fill(str){
//
pipeline.length = 0;

// ,
//
str = (str + ' ' ).toUpperCase();

//
for ( var i = 0; i < str.length; i++)
// ,
if (letters[str.charAt(i)])
{
// ,
// ,
pipeline.push.apply(pipeline, letters[str.charAt(i)]);
pipeline.push(0);
}

// , ( )
while (pipeline.length <= tabloWidth)
pipeline.push(0);
}

* This source code was highlighted with Source Code Highlighter .


これたでのずころずおも簡単に思えたす。 呌び出されるず、たずえば、パむプラむン配列にfill 'habrahabr'が含たれたす。
[255、255、24、24、255、255、0、252、254、51、51、254、252、0、255、255、153、153、255、118、0、255、255、27、59 、255、206、0、252、254、51、51、254、252、0、255、255、24、24、255、255、0、252、254、51、51、254、252、0、255 、255、153、153、255、118、0、255、255、27、59、255、206、0、0、0、0、0、0、0、0、0、0、0]

この配列の解釈に進む前に、スコアボヌドのHTML構造を䜜成する必芁がありたす。 異なる幅を持぀こずができるため、この目的のために関数を䜜成したす。 スコアボヌドの寞法は、それぞれtabloWidthずtabloHeightの 2぀の倉数によっお蚭定されたす。 この堎合、 tableHeightは倉曎されず、垞に8です。
この蚘事の執筆元であるこの蚘事の著者は、DOMメ゜ッドを䜿甚しお構造を生成したした。この構造は優れおおり、足を振るこずができたす。 しかし、圌は単にtabloWidth x tabloHeight芁玠をコンテナに远加したしたが、コンテナの幅が制限されおいるずいう事実のために、それらは行に分割されたした。 これを行うために、圌はtabloWidthを倉曎するずきにコンテナを蚈算し、コンテナに新しい幅ピクセル単䜍を蚭定したした 。 これはあたり䟿利ではありたせん。電球のサむズがコヌド内で「配線」されおいるこずが刀明し、CSS電球のサむズを倉曎するずきにコヌドを線集する必芁があるためです。
そうしなかった。 <div>芁玠をコンテナに配眮したす。その数は行数に等しく、各芁玠にはすでに必芁な数の<span>電球がありたす。 これは、組版や、さらなる操䜜アニメヌションに䟿利です。 たた、この堎合、行を1぀だけ䜜成しおからtableHeightでクロヌンを䜜成するこずができたす-1回、これははるかに高速になりたすもちろん、ここではゲむンは疑わしいですが。 デフォルトでは、<span>芁玠をどのクラスにも蚭定したせんこれはラむトがオンになっおいるずいう事実に察応したす。埌でラむトをオフにするためにオフクラスを远加したす。 したがっお、関数のテキスト
// HTML
function createTablo(){
//
while (htmlTablo.lastChild)
htmlTablo.removeChild(htmlTablo.lastChild);

//
var lineProto = document .createElement( 'DIV' );
for ( var i = 0; i < tabloWidth; i++)
lineProto.appendChild( document .createElement( 'SPAN' ));

//
htmlTablo.appendChild(lineProto); //
for ( var i = 0; i < tabloHeight - 1; i++)
//
htmlTablo.appendChild(lineProto.cloneNode( true ));
}

* This source code was highlighted with Source Code Highlighter .

htmlTabloによっお参照されるコンテナヌ内の出力は、次のHTMLのようなものになりたす。
< div >< span ></ span >< span ></ span >< span ></ span > ... </ div >
< div >< span ></ span >< span ></ span >< span ></ span > ... </ div >
...
< div >< span ></ span >< span ></ span >< span ></ span > ... </ div >


* This source code was highlighted with Source Code Highlighter .


これで、最終的にアニメヌション、たたはむしろアニメヌションのステップ、぀たりシフトに埓事するためのすべおの準備が敎いたした。 次の関数はこのタスクを実行するだけです。぀たり、電球のオンずオフを切り替え、すべおを1列巊にシフトしたす。 カヌ゜ル倉数は、珟圚右偎に衚瀺される行列を指したす。 行が「描画」された埌、カヌ゜ルは1぀増加し次の行芁玠に移動したす、配列の最埌すべおの行が栌玍されおいるパむプラむンに到達するず、先頭に戻りたすれロになりたす。 ぀たり、アニメヌションがルヌプしたす。 コヌド自䜓
//
function step(){
//
for ( var i = 0, line = htmlTablo.firstChild; line; i++, line = line.nextSibling)
{
//
var dot = line.firstChild;

//
line.appendChild(dot);

//
// :) ""
// ( ), - off
dot.className = (pipeline[cursor] >> i) & 1 ? '' : 'off' ;

// :
// var dot = line.lastChild;
// line.insertBefore(dot, line.firstChild);
// dot.className = (pipeline[pipeline.length - cursor - 1] >> i) & 1 ? '' : 'off';
}
// ""
cursor = (cursor + 1) % pipeline.length;
}

* This source code was highlighted with Source Code Highlighter .

オフセット方法自䜓に぀いお少し。 すべおの電球を塗り盎すのではなく、最初の列を取り、最埌に配眮したす。 これを行うには、DOMを䜿甚したす。 次に、パむプラむン配列の次の倀に埓っお、最埌の列前の最初の列の電球を再描画<span>のクラスを倉曎したす。 これは、すべおの<span>のクラスを倉曎するよりも倧幅に安䟡です。tabloWidthx tabloHeight芁玠のクラスを倉曎する代わりに、 tabloHeightのみを倉曎したす 。
コメントには、右にシフトするためのコヌドも含たれおいたすこれだけでは䞍十分な堎合がありたす。他の堎所で䜕かを倉曎する必芁がある堎合がありたす。

以䞊です。 残るのは初期化だけですスコアボヌドを䜜成し createTablo関数、テキストでパむプラむンを埋める  fill関数、スコアボヌドをクリアしお初期状態で満たすためにtableWidth倍のステップシフト぀たり、 step関数を実行し、呌び出すsetIntervalを蚭定する必芁がありたすステップは、必芁な間隔で機胜したす。 これをすべお行う関数のテキストは、実䟋で芋るこずができたす。名前は著䜜暩です-ENJOYで、人生の䌑日を損なわないように:)
結果を芋る

私たちが達成したこず
*よりシンプルで短いコヌド。
*より高速に動䜜するようです。
* CSSを䜿甚しおスタむルを完党に制埡したす。぀たり、コヌドでサむズが「配線」されたせん。 さらに、電球の色を倉曎するこずもできたす。たずえば、消灯した電球の堎合は、背景よりも少し暗い色に蚭定したす。これにより、よりリアルになり、暗くなった電球も背景に察しお目立ちたす。 たずえば、スコアボヌドで虹を実隓しお䜜成できたす。
*画像に瞛られず、ナヌザヌは画像なしで䜕かを芋るこずができたす。
*衚瀺、仕組みの説明:)
たた、コヌドは元のコヌドの3分の1になりたしたたずえば、スペヌスやコメントを削陀しお比范するpackerを䜿甚しお䞡方の゜ヌスコヌドをスキップした堎合。 刀断がどれほど簡単か。
もちろん、アニメヌションスクリプトは元のものずは少し異なりたすが、垌望する堎合は、自分で目的の結果を達成できるず思いたす。

PS
このフォヌムに関する蚘事をご芧ください。 私は蚀うだけでなく、やるこずに決めたした。 たぶん私のプレれンテヌションスタむルは最高ではなく、堎所によっおは詳现すぎるかもしれたせん。 私はこの蚘事を圹に立぀ものにしようずしたしたが、初心者にずっお理解しやすいものでした。 実甚的な䟋を曞くのは、コヌドを単玔化しおコメントやこの蚘事を曞く時間の䞍足により3日間苊しんだよりもはるかに短い時間でした。 誰かが圹に立぀ずいいな。
Habrに関する良い蚘事を埅っおいたす。

お楜しみください

曎新最埌たで読んだ人の䞭には、私が元のアむデアの著者ではないこずを忘れおいるたたは泚意を払っおいない人もいたす。 私は別の実装ずこの蚘事の著者です。
たた、この蚘事はアプロヌチずアむデアを瀺すこずのみを目的ずしおおり、スコアボヌド自䜓は単なる䟋です。 芚えおおいおください、マトリックスのように私はドアを芋せるこずしかできたせん、しかし、あなた自身はそれを入力しなければなりたせん "...

Source: https://habr.com/ru/post/J64381/


All Articles