積もる雪(TumoruYuki)
編集:2008.03.24 by T.A..
IMG要素があるとその上に積もります。
積もった雪を除けられる(ドラッグしてください)。そして大幅修正。
●
TumoruYuki.htm この色の所を修正してください。
<HTML>
<HEAD>
<TITLE>積もる雪</TITLE>
<META http-equiv="content-type" content="text/html; charset=SHIFT_JIS">
<META http-equiv="Content-Style-Type" content="text/css">
<META http-equiv="Content-Script-Type" content="text/javascript">
<STYLE type="text/css"><!--
BODY {background:rgb(70,130,70) url("../Img/4.jpg") repeat}
.BODY {padding:10; line-height:120%; background:white}
H1 {margin-top:3px; margin-bottom:5px; font-size:120%; line-height:120%}
.User {color:red}
.Comment {color:blue}
PRE.Rei {margin:4 1em 1ex 1ex; border:1px solid black; padding:5; font-size:90%; line-height:120%; background-color:white}
#Box {position:relative; width:300px; height:200px; border:1px solid black; overflow:hidden}
.Yuki {border:0}
--></STYLE>
</HEAD>
<BODY onload="Init()">
<SCRIPT type="text/JavaScript" src="TumoruYuki/TumoruYuki.js"></SCRIPT>
<DIV class=BODY>
<H1>積もる雪(TumoruYuki)</H1>
編集:2007.09.30 by T.A..<BR>
IMG要素があるとその上に積もります。<BR>
積もった雪を除けられる(ドラッグしてください)。そして大幅修正。<BR>
<TABLE style="background-color:#88F">
<TR><TD style="padding:20px">
<IMG src="Test.jpg"><BR>
<IMG src="Test.jpg">
</TABLE>
●
TumoruYuki.js この色の所を変更してください。
//TumoruYuki.js
//編集:2008.03.24 by 雨宮徹也
//積もる雪の模擬表示
//呼出:
// <BODY onload="Init()">
// <SCRIPT type="text/JavaScript" src="TumoruYuki.js"></SCRIPT>
var DebugF; //¶Debug用。true=デバッグモード
var GamenKousin=1/10; //画面更新時間[s]
var TimeGamen=GamenKousin*1E3; //タイマー値:画面更新時間[ms]
var Yuki=new Array(); //降る雪のデータ。Yuki[n]=undefined=IMG要素なし
//.Sts=状態(furu=降る、none=降らない)
//.X=降る位置X[px]
//.Y=降る位置Y[px]
//.SpeedX=X方向の移動スピード
//.SpeedY=Y方向の移動スピード
//.Dir=X方向の移動方向(-1=左、1=右)
var YukiClass="Yuki"; //雪画像のclass名
var HasseiRitu=0.3; //雪の発生率
var YukiN=40; //降る雪の最大個数
var YukiSpeedX=2; //降る雪のX方向の基本スピード[px]
var YukiSpeedY=10; //降る雪のY方向の基本スピード[px]
var FuruBasyo=document.body; //雪を降らせる場所
var FuruStartXSet=0; //降る範囲のX方向の始め(使用できるデータ形式はGetArea()を参照)
var FuruWidthXSet=230; //降る範囲のX方向の幅
var FuruStartYSet=50; //降る範囲のY方向の始め
var FuruWidthYSet=300; //降る範囲のY方向の幅
var Tumotta=new Array(); //積もった雪のデータ。Tumotta[n]=undefined=オブジェクト要素なし
//.Sts=状態(tumotta=積もっている、none=積もっていない)
//.TumottaIti=積もった位置(Debug用。left、right、top、under)
var Otiru=new Array(); //落ちる雪のデータ。Otiru[n]=undefined=オブジェクト要素なし
//.Sts=状態(otiru=落ちる、none=落ちていない)
//.X=落ちる位置X[px]
//.Y=落ちる位置Y[px]
//.d=落ちる度合い(2剰してYに加算する)
var Tukamu=new Array(); //掴む物のデータ。Tukamu[n]=undefined=オブジェクト要素なしオブジェクトなど
//.Num=Tumotta[n]のn。Tumotta[n].X=移動開始位置X、Tumotta[n].Y=移動開始位置Y、Tumotta[n].Sts="yokeru"となる。
//Debug表示エリア
document.write("<SPAN id=DocDebug style=\"position:absolute; z-index:100; background-color:#EEE\"></SPAN>");
var YukiWidth; //雪の横幅[px]
var YukiWidthP2; //雪の横幅/2[px]
var YukiHeight; //雪の高さ[px]
var YukiHeightP2; //雪の高さ[px]
var TumottaWidthP2; //積もった雪の横幅の半分
var TumottaHeight; //積もった雪の高さ
var TumottaChk=new Array(); //積もったチェック場所(降る雪座標に加算)
var TumottaHosei=new Array(); //積もった画像の補正(積もっている雪座標に加算)
var Path="Sub/",ZI=0;
var FuruGaz=new Array(),I=0; //降る雪の画像
FuruGaz[I]=["Yuki0.gif"]; I++;
FuruGaz[I]=["Yuki1.gif"]; I++;
ZI=ZI+I;
var TumottaGaz=new Array(),I=0; //積もった雪の画像
TumottaGaz[I]=["Tumotta0.gif"]; I++;
TumottaGaz[I]=["Tumotta0a.gif"]; I++;
TumottaGaz[I]=["Tumotta0b.gif"]; I++;
TumottaGaz[I]=["Tumotta0c.gif"]; I++;
TumottaGaz[I]=["Tumotta0d.gif"]; I++;
TumottaGaz[I]=["Tumotta0e.gif"]; I++;
TumottaGaz[I]=["Tumotta0f.gif"]; I++;
TumottaGaz[I]=["Tumotta0g.gif"]; I++;
//TumottaGaz[I]=["Tumotta0h.gif"]; I++; //オプション
//TumottaGaz[I]=["Tumotta0i.gif"]; I++; //オプション
//TumottaGaz[I]=["Tumotta0k.gif"]; I++; //オプション
LastTumottaGaz=TumottaGaz[TumottaGaz.length-1];
ZI=ZI+I;
var OtiruGaz=new Array(),I=0; //落ちる雪の画像
OtiruGaz[I]=["Otiru0.gif"]; I++;
OtiruGaz[I]=["Otiru0a.gif"]; I++;
OtiruGaz[I]=["Otiru0b.gif"]; I++;
OtiruGaz[I]=["Otiru0c.gif"]; I++;
OtiruGaz[I]=["Otiru0d.gif"]; I++;
OtiruGaz[I]=["Otiru0e.gif"]; I++;
OtiruGaz[I]=["Otiru0f.gif"]; I++;
OtiruGaz[I]=["Otiru0g.gif"]; I++;
OtiruGaz[I]=["Otiru0h.gif"]; I++;
OtiruGaz[I]=["Otiru0i.gif"]; I++;
OtiruGaz[I]=["Otiru0j.gif"]; I++;
OtiruGaz[I]=["Otiru0k.gif"]; I++;
OtiruGaz[I]=["Otiru0l.gif"]; I++;
ZI=ZI+I;
var YukiZI=ZI; //降る雪のz-index
//●
//処理:雪表示
//編集:2007.09.30 by T.A.
function DispYuki(){
var I;
if(!DispYuki.TimerID){
DispYuki.TimerID=setInterval("DispYuki()",TimeGamen);
DispYuki.I=0; //処理速度軽減
DispYuki.TimeSa=0;
}
DispYuki.TimeS=new Date().getTime(); //¶Debug
if(Math.random()<HasseiRitu){ //雪の発生
TourokuFuru();
}
var I,Obj,X,Y;
for(I=0; I<Yuki.length; I++){ //降る
if(Yuki[I]!=undefined && Yuki[I].Sts=="furu"){
Obj=eval("IMGYuki"+I);
X=Yuki[I].X;
Y=Yuki[I].Y;
Obj.style.left=X+"px";
Obj.style.top=Y+"px";
if(X>=FuruStartX && X<FuruStartX+FuruWidthX && Y>=FuruStartY-50 && Y<FuruStartY+FuruWidthY){ //降る範囲なら
if(CheckTumoru(Obj,X,Y)){ //積もる
Yuki[I].Sts="none";
Obj.style.display="none";
continue;
}else{ //降る
if(Yuki[I].Dir<1){
Yuki[I].X=Yuki[I].X-Yuki[I].SpeedX;
}else{
Yuki[I].X=Yuki[I].X+Yuki[I].SpeedX;
}
Yuki[I].Y=Yuki[I].Y+Yuki[I].SpeedY;
}
}else{ //降る範囲ではない
Yuki[I].Sts="none";
Obj.style.display="none";
}
}
}
//●
//処理:雪が積もるかのチェック
//編集:2007.09.24 by T.A.
//呼出:CheckTumoru(FuruObj,FuruX,FuruY,InhId)
//戻値:true=積もるまたは降る範囲外。false=降る。
function CheckTumoru(FuruObj,FuruX,FuruY,InhId){
var FuruGazName,FuruW,FuruH;
var CXL,CYL,ObjDL,StsL;
var CXR,CYR,ObjDR,StsR;
var CXU,CYU,ObjDU,StsU;
var CXT,CYT,ObjDT,StsT;
FuruGazName=FuruObj.src;
//積もるかチェック
FuruW=FuruObj.clientWidth;
FuruH=FuruObj.clientHeight;
CXL=FuruX-2; //左チェック位置
CYL=FuruY+FuruH/2;
//note:document.elementFromPoint(X,Y)は、ウインドウの左上が(0,0)。座標がマイナス値だとnullになった。
ObjDL=document.elementFromPoint(CXL-FuruBasyo.scrollLeft,CYL-FuruBasyo.scrollTop);
StsL=TumottaSts(ObjDL,InhId);
if(StsL=="tumotta"){ //「 && ObjDL.src.lastIndexOf(LastTumottaGaz)<0」
TourokuTumotta(FuruGazName,FuruX,FuruY,"right",ObjDL);
return true;
}
CXR=FuruX+FuruW+2; //右チェック位置
CYR=FuruY+FuruH/2;
ObjDR=document.elementFromPoint(CXR-FuruBasyo.scrollLeft,CYR-FuruBasyo.scrollTop);
StsR=TumottaSts(ObjDR,InhId);
if(StsR=="tumotta"){ //「 && ObjDR.src.lastIndexOf(LastTumottaGaz)<0」
TourokuTumotta(FuruGazName,FuruX,FuruY,"left",ObjDR);
return true;
}
CXT=FuruX+FuruW/2; //上チェック位置
CYT=FuruY-1;
ObjDT=document.elementFromPoint(CXT-FuruBasyo.scrollLeft,CYT-FuruBasyo.scrollTop);
StsT=TumottaSts(ObjDT,InhId);
if(StsT=="tumotta"){ //「 && ObjDT.src.lastIndexOf(LastTumottaGaz)<0」
TourokuTumotta(FuruGazName,FuruX,FuruY,"under",ObjDT);
return true;
}
CXU=FuruX+FuruW/2; //下チェック位置
CYU=FuruY+FuruH+2;
ObjDU=document.elementFromPoint(CXU-FuruBasyo.scrollLeft,CYU-FuruBasyo.scrollTop);
StsU=TumottaSts(ObjDU,InhId);
if(StsU=="tumotta"){ //「 && ObjDU.src.lastIndexOf(LastTumottaGaz)<0」
TourokuTumotta(FuruGazName,FuruX,FuruY,"top",ObjDU);
return true;
}
if(DispYuki.TimeSa>TimeGamen*1.5)return false;
//初期の積もるチェック
if(typeof StsT=="string" && StsT==""){
TourokuTumotta(FuruGazName,FuruX,FuruY,"under",ObjDT);
return true;
}
if(typeof StsU=="string" && StsU==""){
TourokuTumotta(FuruGazName,FuruX,FuruY,"top",ObjDU);
return true;
}
return false; //積もらない
}
//●
//処理:落ちる雪の登録
//編集:2007.09.27 by T.A.
//呼出:TourokuOtiru(GazNum,X,Y,KuzureruId)
//引数:
// GazNum=画像番号(1~n)
// X=落ちる位置X[px]
// Y=落ちる位置Y[px]
// KuzureruId=崩れるオブジェクトのID。
function TourokuOtiru(GazNum,X,Y,KuzureruId){
var I,Id,Gaz,S;
if(GazNum>OtiruGaz.length)GazNum=OtiruGaz.length; //上限;
for(I=0; I<Otiru.length+1; I++){
if(Otiru[I]==undefined){ //IMG要素がない
Id="IMGYuki"+(YukiN+I);
// Gaz=OtiruGaz[GazNum-1][0]; //落ちる画像を使う場合
Gaz=TumottaGaz[GazNum-1][0]; //落ちる画像を使わない場合
// ZI=OtiruGaz[GazNum-1][1]; //落ちる画像を使う場合
ZI=TumottaGaz[GazNum-1][1]; //落ちる画像を使わない場合
S="<IMG id="+Id+" class="+YukiClass+" src=\""+Path+Gaz+"\" style=\"position:absolute; left:"+X+"px; top:"+Y+"px; z-index:"+ZI+";\">";
document.body.insertAdjacentHTML("beforeEnd",S);
Otiru[I]=new Array();
Otiru[I].Sts="otiru";
Otiru[I].X=X;
Otiru[I].Y=Y;
Otiru[I].d=0;
Otiru[I].InhId=KuzureruId;
break;
}else if(Otiru[I].Sts=="none"){ //IMG要素はある
Id="IMGYuki"+(YukiN+I);
Obj=eval(Id);
// Obj.src=Path+OtiruGaz[GazNum-1][0]; //落ちる画像を使う場合
Obj.src=Path+TumottaGaz[GazNum-1][0]; //落ちる画像を使わない場合
Obj.style.left=X+"px";
Obj.style.top=Y+"px";
// Obj.style.zIndex=OtiruGaz[GazNum-1][1]; //落ちる画像を使う場合
Obj.style.zIndex=TumottaGaz[GazNum-1][1]; //落ちる画像を使わない場合
Obj.style.display="inline";
Otiru[I].Sts="otiru";
Otiru[I].X=X;
Otiru[I].Y=Y;
Otiru[I].d=0;
Otiru[I].InhId=KuzureruId;
break;
}
}
}