0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ゲームのデモ状態のときの動き(右左に自動で動かす)) ~timeclock DAY3~

Last updated at Posted at 2019-11-18

#完成イメージ
Screenshot_20191118-154019.png
こんな感じで上(赤ゾーン)から下(青ゾーン)に障害物が落ちる
→下のところ(青)で避けるっいうゲーム
*説明のしたにHTML,cssもかいてあるのでコピペで動かしてみてください…

##コード


//要素をhtmlから引っ張り出す
var escaper = document.getElementById("escaper");
var escaperzone = document.getElementById("escaperzone");
var text = document.getElementById("text");
escaper.style.left = "0px";
function demomove(){
  var demonumber = Math.floor(Math.random()*4);
  
  var demoleft=escaper.getBoundingClientRect().left;
  
  if(demonumber==0){
   var demoleft = demoleft+escaperzone.clientWidth*0.1;
  }
  else if(demonumber==1){
    var demoleft = demoleft+escaperzone.clientWidth*0.05;
  }
  else if(demonumber==2){
    var demoleft = demoleft-escaperzone.clientWidth*0.1;
  } 
  else if(demonumber==3){
    var demoleft = demoleft-escaperzone.clientWidth*0.2;
  } 
  else{
    console.log("not move");
  }
  if(demoleft<=0){
    demoleft = demoleft*-1;
  }
  if(demoleft>=escaperzone.clientWidth*0.9){
    demoleft = escaperzone.clientWidth*0.9-Math.abs(demoleft-escaperzone.clientWidth);
  }
  console.log(escaperzone.clientWidth);
  text.innerHTML=demoleft;
  escaper.style.left = demoleft + "px";
  }
setInterval(demomove,1000);

↓右左に適当に動かすためのもの



var demonumber = Math.floor(Math.random()*4);
  var demoleft=escaper.getBoundingClientRect().left;
  
  if(demonumber==0){
   var demoleft = demoleft+escaperzone.clientWidth*0.1;
  }
  else if(demonumber==1){
    var demoleft = demoleft+escaperzone.clientWidth*0.05;
  }
  else if(demonumber==2){
    var demoleft = demoleft-escaperzone.clientWidth*0.1;
  } 
  else if(demonumber==3){
    var demoleft = demoleft-escaperzone.clientWidth*0.2;
  } 
  else{
    console.log("not move");
  }

ランダムで乱数出してその乱数に応じて動かす。数値を変えるだけで動きが大きく変わる

↓端に当たったときの対応

if(demoleft<=0){
    demoleft = demoleft*-1;
  }
  if(demoleft>=escaperzone.clientWidth*0.9){
    demoleft = escaperzone.clientWidth*0.9-Math.abs(demoleft-escaperzone.clientWidth);
  }

上が左端にいったとき
値がマイナスなのでマイナスをかけてプラスにする  

下が右端にいったとき
親要素(全体)の横幅より大きいのでその大きい分を親要素から引く
例)
変化前
全体1000px X座標1100px
↓全体-|X座標-全体|
↓Math.abs=|値|=値の絶対値
変化後
全体1000px X座標900px

また動かすものの左端がx座標になるので、親要素(全体の数値)をそのまま使ってこの処理をするとはみ出る
→数値の基準を親要素の横幅-動かす要素の横幅にする

実在に動かす(設定)

text.innerHTML=demoleft;
  escaper.style.left = demoleft + "px";

ついでに左端からの距離を表示してます

繰り返し

setInterval(demomove,1000);

上のすべての処理はdemomoveという関数でまとめられているので、1秒ごとに実行する

###いるかわからないけど装飾類↓

<html>
 <head></head> 
 <body> 
  <div id="topzone"> 
   <p id="text">ptw</p> 
  </div> 
  <div id="escaperzone"> 
   <div id="escaper"></div> 
  </div> 
 </body>
</html>
#topzone{
  width: 100vw;
  height: 90vh;
  background-color: red;
}

#text{
font-size: 10vw;  
}

#escaperzone{
  width: 100vw;
  height: 10vh;
  background-color: blue;
  position: relative;
}

#escaper{
  width: 10%;
  height: 100%;
  background-color: green;
  left: 300px;
  position: absolute;
}

###まとめ
以上で適当に右左に動いてくれる。
ユーザーのプレイに戻すときはclearIntervalを使ってdemomoveを動かせないようにする。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?