Little Strange Software

スマホアプリの開発を行う LittleStrangeSoftware のブログです。

【CSS】ブロック遊び【実験】

f:id:little_strange:20211211233651p:plain

 

 どうも!LSSです!!

 

【CSS】サイコロ回転【preserve-3d試してみた】 - Little Strange Software

から色々試しているCSSの立体表現ですが、立体を見ているとつい連想しちゃうのが、

little-strange.hatenablog.com

マインクラフトです。

 

CSSでマインクラフトが作れる、というわけではありませんが、ごくごく小規模な、それっぽいブロックを並べる事ぐらいならできるかな?と試みてみました。

 

 

ブロック遊び

 

 

コード

<style>
@keyframes kaiten{
0%,30%{transform:rotateX(-10deg) rotateY(-10deg);}
100%{transform:rotateX(-10deg) rotateY(350deg);}
}
#gamen{
position:relative;
transform-style:preserve-3d;
width:300px;
height:300px;
overflow:hidden;
border:1px solid black;
}
#gameni{
position:absolute;
transform-style:preserve-3d;
width:300px;
height:300px;
animation:10s kaiten infinite alternate;
}
.cube{
position:absolute;
transform-style:preserve-3d;
width:50px;
height:50px;
}
.cube div{
position:absolute;
box-sizing:border-box;
width:100%;
height:100%;
}
.cbs1{transform:translateZ(25px);}
.cbs2{transform:rotateY(90deg) translateZ(25px);}
.cbs3{transform:rotateX(90deg) translateZ(25px);}
.cbs4{transform:rotateX(-90deg) translateZ(25px);}
.cbs5{transform:rotateY(-90deg) translateZ(25px);}
.cbs6{transform:rotateY(180deg) translateZ(25px);}
/*テクスチャ*/
.weed div{
border:1px solid #dddddd;
border-radius:5px;
}
.weed .cbs1,.weed .cbs2,.weed .cbs5,.weed .cbs6{
background-image:linear-gradient(#89cb9e 25%,brown 30%);
}
.weed .cbs3{
background-color:#89cb9e;
}
.weed .cbs4{
background-color:brown;
}
.stone div{
border:1px solid #dddddd;
background-color:#888888;
border-radius:5px;
}
.water div{
background-color:#0000ff80;
}
</style>
<div id="gamen">
<div id="gameni"></div>
</div>
<p>
<script>
txt='';
blks=[
[0,0,0,'weed'],
[1,0,0,'weed'],
[2,0,0,'weed'],
[3,0,0,'weed'],
[4,0,0,'weed'],
[5,0,0,'weed'],
[0,0,1,'water'],
[1,0,1,'water'],
[2,0,1,'water'],
[3,0,1,'stone'],
[4,0,1,'weed'],
[5,1,1,'weed'],[5,0,1,'stone'],
[0,0,2,'weed'],
[1,0,2,'weed'],
[2,0,2,'water'],
[3,0,2,'stone'],
[4,1,2,'weed'],[4,0,2,'stone'],
[5,1,2,'weed'],[5,0,2,'stone'],
[0,0,3,'weed'],
[1,0,3,'weed'],
[2,0,3,'water'],
[3,0,3,'water'],
[4,1,3,'weed'],[4,0,3,'stone'],
[5,2,3,'weed'],[5,1,3,'stone'],[5,0,3,'stone'],
[0,1,4,'weed'],[0,0,4,'stone'],
[1,1,4,'weed'],[1,0,4,'stone'],
[2,0,4,'weed'],
[3,0,4,'water'],
[4,0,4,'water'],
[5,1,4,'weed'],[5,0,4,'water'],
[0,1,5,'weed'],[0,0,5,'stone'],
[1,0,5,'weed'],
[2,0,5,'stone'],
[3,0,5,'stone'],
[4,1,5,'weed'],[4,0,5,'stone'],
[5,0,5,'weed']
];
for(i=0;i<blks.length;i++){
 txt+='<div id="cb'+i+'" class="cube '+blks[i][3]+'" style="transform:translateX('+(blks[i][0]*50)+'px) translateY('+(200-blks[i][1]*50)+'px) translateZ('+(-blks[i][2]*50)+'px);">';
 for(j=1;j<7;j++){
  txt+='<div class="cbs'+j+'"></div>';
 }
 txt+='</div>';
}
gameni.innerHTML=txt;
</script>

 

 

JavaScriptを使用していますが

CSSのみでの表現は可能ですが、1ブロックあたり9行ぐらいのコード…とブロックが増えるとコード量がとんでもない事になるので、ブロックのコードの書き出しにJavaScriptを使う事で簡略化しました。

 

コード中にたくさん並んでいる、

[0,0,0,'weed'],

がひとつのブロックに相当します。(横座標・高さ・奥行き座標・ブロックの種類)

 

ブロックの種類として、「草」「石」「水」を用意しましたが、用意している部分は

 

.weed div{
border:1px solid #dddddd;
border-radius:5px;
}
.weed .cbs1,.weed .cbs2,.weed .cbs5,.weed .cbs6{
background-image:linear-gradient(#89cb9e 25%,brown 30%);
}
.weed .cbs3{
background-color:#89cb9e;
}
.weed .cbs4{
background-color:brown;
}

 

.stone div{
border:1px solid #dddddd;
background-color:#888888;
border-radius:5px;
}

 

.water div{
background-color:#0000ff80;
}

 

の部分で、同じように並べて種類を増やす事ができます。

(草ブロックだけ、面ごとの見た目を変えるために長くなっています^^;)

 

 

あとがき

ブログで使えるネタ、というわけではありませんが、「Web上で立方体を組み合わせて立体的な造形を作る事ができる」という事が確認できました、という内容ですw

 

CSSでの立体表現は「できるけれど向いているというわけでもない」という感じで、例えばこうして立方体を並べるのも、「400個程度ならいける」ような話を見かけました。

イクラじゃなくても、ブログで使えるネタでなくても、なにかちょっとしたゲームに応用できたら面白いかもですね。

 

 

 

ってなとこで、今回はこのへんで!

次回もまた、よろしくお願いします^^