74140


下記のコードは、ウェブ上で見つけたJavascriptで作ったシューティング･ゲーム(『顔文字インベーダー』)の  
コードを、弾がヒットしたらインベーダーの顔(文字)が歪んだ表情("(ﾟдﾟ) ")へ変わり、１秒後に消える，  
ようにしようと一部変更したものです。  
しかし、２発目以降がヒットすると、その前にヒットしたときの歪んだ表情も一緒に表示されてしまうのです。  
つまり、２回目以降にヒットしたら、その前にヒットしたときの歪んだ表情は表示されないようにしたいのです。  
コードの書き方がまずいからなのですが、どのように書き換えたらいいのでしょうか。

関連個所は４つあり、スクリプト内(”function interval1(){}”以下)に示しています。

[code]

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <HTML>
    <HEAD>
    <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
    <META name="GENERATOR" content="IBM WebSphere Studio Homepage Builder Version 6.5.0.0 for Windows">
    <META http-equiv="Content-Style-Type" content="text/css">
    <TITLE>顔文字のインベーダーゲーム</TITLE>
    </HEAD>
    <BODY bgcolor="#000066" onload="onloadmes()">
    <PRE><SCRIPT language="JavaScript">
    <!--
    var timerID = null;
    var patno=1;
    var cr="\r\n";
    var blankno=0;
    var totalblank="";
    var lr=1  ;
    var lowerlf="";
    var downlf="";
    var downno=0;
    var inplay=0;
    var missilex=99;
    var missiley=99;
    var mychrx=1;
    var myblank="";
    var mymove=0;
    var spcf1="";
    var hitflag=0;
    var score=0;
    var selec=0;
    var mname=" Windows is";
    var rsmiss="";
    
    function array1(arn) { 
       this.length = arn;
       for (var ar1 = 0; ar1 <= arn; ar1++) {
         this[ar1] = 1; }
         return this;
         }
    
    function onloadmes(){
    document.fmark.win.value=" ";
    cr = unescape("%0A");
    ver=navigator.appVersion;
    len=ver.length;
    for(iln=0;iln<len;iln++) if(ver.charAt(iln)=="(") break;
    systm = ver.charAt(iln+1).toUpperCase();
    if(systm=="M"){cr = unescape("%0D");}
    if(systm=="W"){cr = unescape("%0D")+cr;}
    if(systm=="C"){
                   cr = unescape("%0D")+cr;
                   tmpsys = ver.charAt(0).toUpperCase();
                   if (tmpsys == 4){cr = unescape("%0D");}
    }
    
     starter();
    }
    
    function init(){ 
    blankx = new array1(63);
    for (var makeblank = 0;makeblank < 63;makeblank++){
            blankx[makeblank]="";
            for (var addBlank = 0; addBlank < makeblank; addBlank++) {
            blankx[makeblank] = blankx[makeblank] + " ";
            }
    }
    faker = new array1(10); 
    face = new array1(2); 
    face[1] = " (o.o) ";
    face[2] = " (0_0) ";
    mestotal =new array1(2);
    
    interval1();
    }
    
    function restarter(){
    hit = 0;
    inplay = 0;
    blankno = 0;
    totalblank = "";
    lr = 1;
    lowerlf = "";
    downlf = "";
    downno = 0;
    missilex = 99;
    missiley = 99;
    mychrx = 1; 
    myblank = "";
    mymove = 0;
    selec=1;
    starter();
    }
    
    function starter(){
    document.fmark.win.value=cr+cr+cr+cr+cr+cr+cr+"                        Are you Ready?"+cr+cr+cr+"                   FIRE!ボタンをクリックでスタート。";
    selec=1;
    }
    
    function goleft(){
     mymove=0;
     mychrx=mychrx-1;
     if (mychrx <= 0){mychrx=1;}
    }
    function goright(){
     mymove=0;
     mychrx=mychrx+1;
     if (mychrx >= 47){mychrx=46;}
    }
    
    function golmax(){
    if (inplay == 1){mymove=-1;}
    }
    
    function gormax(){
    if (inplay == 1){mymove=1;}
    }
    
    function fire(){
    if (inplay == 0){if (selec == 1){selec=9;
                                     inplay=1;
                                     init();}
    }else{
     if (missiley == 99){missiley=18;
                         missilex=mychrx+3;}
     }
    }
    
    function gameover(){ 
    score=0;
    for (var enerme=1;enerme<11;enerme++){
      if (faker[enerme] == 1){score=score+1;}
    }
     if (score == 0){
    document.fmark.win.value=cr+cr+cr+cr+cr+cr+cr+cr+";          　　　    Congratulation! (^o^)"+cr+cr+"                          やった！おめでとう(^^)V";
    }else{
    document.fmark.win.value=cr+cr+cr+cr+cr+cr+cr+cr+";                       GAME OVER"+cr+cr+"                    "+score+" 残ってしまいました(-o-;)";
    
    
    }
    inplay=0;
    }
    
    function interval1(){ 
    
      if (missiley != 99) {missiley=missiley-1;}
      if (missiley < 0){missiley=99;}
    
      mychrx=mychrx+mymove;
      if (mychrx <= 0){mychrx=1;}
      if (mychrx >= 47){mychrx=46;}
      blankno=blankno+lr ;
      totalblank = blankx[blankno] ;
     if (blankno >= 22) {lr=-1;
                        downno=downno+1;
                        blankno=22;
                       }
     if (blankno <= 0) {lr=1;
                        downno=downno+1;
                        blankno=0;
                       }
     if (downno >= 12) {gameover();}
    
    
       downlf="";
       for (var upperspc=0;upperspc<downno;upperspc++){
          if (missiley == upperspc){
          downlf=downlf+blankx[missilex]+"|"+cr;
          }else{downlf=downlf+cr;}
       }
    
    
    
     if (inplay == 1){
       patno=patno+1;
       if (patno >= 3) {patno = 1;}
    
    
    
         for (var addline = 1; addline < 5; addline++){
         mestotal[addline]=totalblank;
         rsmiss="";
           if (missiley == (downno+addline*2-2)){
            if (blankno <= missilex){
              hitflag=parseInt((missilex-blankno)/7,10);
              if (hitflag < 5){
                if ((missilex-blankno-(hitflag*7)) >= 1){
                 if ((missilex-blankno-(hitflag*7)) <= 5){
                   if (faker[(addline*5)+hitflag-4] == 1){
                     faker[(addline*5)+hitflag-4] = 0;
                     missiley=99;
                     hit++;
                     dFace1(); //質問に関連個所(１)
                                   //弾が命中して、インベーダーの表情がゆがむ，関数を呼び出す。
    
                   }
                 }
                }
              }else{if (missilex > (blankno+42)){
                        rsmiss=blankx[missilex-blankno-42]+"|";
                                                }
              }
            }else{
             mestotal[addline]=blankx[missilex]+"|";
             if (missilex < (blankno-1)){
               mestotal[addline]=mestotal[addline]+blankx[blankno-1-missilex];
                                       }
            }
           }
    
            for (var addfaker = 1; addfaker < 6; addfaker++){
               if (faker[(addline*5)+addfaker-5] == 1){
                     mestotal[addline]=mestotal[addline]+face[patno];
               }else{
    
                     if(hit==1){  //質問に関連個所(２)
                         mestotal[addline] = mestotal[addline]+dyingFace1;
                    }
                     if(hit==2){
                         mestotal[addline] = mestotal[addline]+dyingFace2;
                    }
                     if(hit==3){
                         mestotal[addline] = mestotal[addline]+dyingFace3;
                    }
                     if(hit==4){
                         mestotal[addline] = mestotal[addline]+dyingFace4;
                    }
                     if(hit==5){
                         mestotal[addline] = mestotal[addline]+dyingFace5;
                    }
                     if(hit==6){
                         mestotal[addline] = mestotal[addline]+dyingFace6;
                    }
                     if(hit==7){
                         mestotal[addline] = mestotal[addline]+dyingFace7;
                    }
                     if(hit==8){
                         mestotal[addline] = mestotal[addline]+dyingFace8;
                    }
                     if(hit==9){
                         mestotal[addline] = mestotal[addline]+dyingFace9;
                    }
              }
        }
    
            mestotal[addline]=mestotal[addline]+rsmiss;
     }
    
    //space line in face aria
       spcf1=cr;
       if (missiley == (downno+1)){spcf1=blankx[missilex]+"|"+cr;}
    
    
       lowerlf="";
       for (var lowerspc=0;lowerspc<(11-downno);lowerspc++){
          if (missiley == (downno+3+lowerspc)){
          lowerlf=lowerlf+blankx[missilex]+"|"+cr;
          }else{lowerlf=lowerlf+cr;}
       }
       myblank=blankx[mychrx];
    
       document.fmark.win.value = downlf+mestotal[1]+cr+spcf1+mestotal[2]+cr+lowerlf+myblank+"  _A_  "+cr+myblank+" [___] ";
    
       timerID = setTimeout("interval1()",235)
     }
    }
    
     //質問に関連個所(３)
    
    
     function dFace1(){
    
        if(hit==1){
            dyingFace1="(ﾟдﾟ) ";
          }
        if(hit==2){
            dyingFace2="(ﾟдﾟ) ";
          }
        if(hit==3){
            dyingFace3="(ﾟдﾟ) ";
          }
        if(hit==4){
            dyingFace4="(ﾟдﾟ) ";
          }
        if(hit==5){
            dyingFace5="(ﾟдﾟ) ";
          }
        if(hit==6){
            dyingFace6="(ﾟдﾟ) ";
          }
        if(hit==7){
            dyingFace7="(ﾟдﾟ) ";
          }
        if(hit==8){
            dyingFace8="(ﾟдﾟ) ";
          }
        if(hit==9){
            dyingFace9="(ﾟдﾟ) ";
          }
          setTimeout("dFace2()",1000);
     }
    
     //質問に関連個所(４)
     //１秒後に、インベーダーが消える。
    
     function dFace2(){
    
        if(hit==1){
            dyingFace1="       ";
          }
        if(hit==2){
            dyingFace2="       ";
          }
        if(hit==3){
            dyingFace3="       ";
          }
        if(hit==4){
            dyingFace4="       ";
          }
        if(hit==5){
            dyingFace5="       ";
          }
        if(hit==6){
            dyingFace6="       ";
          }
        if(hit==7){
            dyingFace7="       ";
          }
        if(hit==8){
            dyingFace8="       ";
          }
        if(hit==9){
            dyingFace9="       ";
          }
     }
    
    //-->
    </SCRIPT></PRE>
    
    <FORM name="fmark">
    <CENTER><TEXTAREA name="win" rows="22" cols="59"></TEXTAREA></CENTER>
    <CENTER>
    <PRE><INPUT type="button" value="  " onclick="golmax()"><INPUT type="button" value=" LEFT " onclick="goleft()"> <INPUT type="button" value="FIRE!" onclick="fire()"> <INPUT type="button" value="RIGHT" onclick="goright()"><INPUT type="button" value="  " onclick="gormax()"></PRE>
    </CENTER>
    <BR>
    <CENTER>
    <PRE><INPUT type="button" value="     RESET     " onclick="restarter()"></PRE>
    </CENTER>
    </FORM>
    <CENTER></CENTER>
    <HR>
    <CENTER><FONT color="#FFFF00">リセットのあとにファイヤーでスタート！<BR>
    両端にあるボタンを押すと、自動で移動します。</FONT></CENTER>
    </BODY>
    </HTML>
    
[/code]


CC BY-SA 4.0
2021-02-18T09:50:02.210
74103
2021-02-19T14:32:06.743
44018
question
javascript
弾がヒットしたら、インベーダーの顔(＝文字)を歪んだ表情へと変わり、１秒後に消える，ようにするコードの書き方


質問者のコードではなく、元サイトのコードの改変結果ですが、ご参考くださいませ。  
ただ、1秒立ったかは計算してません。

要点は、以下の通り  
・faker[]がそれぞれの敵を表していて、1なら生きててヒット判定する、0なら死んでてヒット判定しない。  
・faker[]に1でも0でもない2という「今死んだ！」ステータスを追加してあげればいい。  
・ヒットしたときに0にするのではなく、2にする（変更部分 が 該当）  
・2だった場合の描画内容は、例えば"(X X)"にする（追加部分2 が 該当）  
・2だった場合の次のフレームでは、0になる様にする（追加部分1 が 該当）  
（1秒計りたい場合は、ヒットしたときからタイマーを開始して、1秒立ったかを計算します。）

interval1() 内の大きなforループの中だけ3か所追加・変更していけます。

[code]

     for (var addline = 1; addline < 5; addline++){
        for (var addfaker = 1; addfaker < 7; addfaker++){ // 追加部分1
         if (faker[(addline*6)+addfaker-6] == 2){
                 faker[(addline*6)+addfaker-6] = 0;
           }
        }
     mestotal[addline]=totalblank
     rsmiss=""
       if (missiley == (downno+addline*2-2)){
        if (blankno <= missilex){
          hitflag=parseInt((missilex-blankno)/7,10)
          if (hitflag < 6){
            if ((missilex-blankno-(hitflag*7)) >= 1){
             if ((missilex-blankno-(hitflag*7)) <= 5){
               if (faker[(addline*6)+hitflag-5] == 1){
                 faker[(addline*6)+hitflag-5] = 2 // 変更部分
                 missiley=99
               }
             }
            }
          }else{if (missilex > (blankno+42)){
                    rsmiss=blankx[missilex-blankno-42]+"|"
                                            }
          }
        }else{
         mestotal[addline]=blankx[missilex]+"|"
         if (missilex < (blankno-1)){
           mestotal[addline]=mestotal[addline]+blankx[blankno-1-missilex]
                                   }
        }
       }
    
        for (var addfaker = 1; addfaker < 7; addfaker++){
           if (faker[(addline*6)+addfaker-6] == 1){
                 mestotal[addline]=mestotal[addline]+face[patno]
           }else if (faker[(addline*6)+addfaker-6] == 2){ // 追加部分2
                 mestotal[addline]=mestotal[addline]+"(X X)"
           }
           else{mestotal[addline]=mestotal[addline]+"     "}
        }
        mestotal[addline]=mestotal[addline]+rsmiss
     }
    
[/code]

※ 現在はfaker[i]の中身が直接0、1、2を持ってしまっているため、HPやその他を持たせられませんが、  
例えば  
faker[i]['hp']  
faker[i]['status']  
faker[i]['death_graphic_timerCount']  
みたいにfaker[i] の中にstatusではなく配列を入れれば、いろいろなパラメータを1つの敵に持たせることができるようになるでしょう。


CC BY-SA 4.0
2021-02-19T14:32:06.743
74140
2021-02-19T14:32:06.743
25396
74103
answer