KFC
02/16/2026, 5:41 PMKFC
02/16/2026, 7:13 PMりんご野郎
02/16/2026, 10:01 PMKFC
02/16/2026, 11:14 PMKFC
02/16/2026, 11:16 PMりんご野郎
02/17/2026, 12:26 AMりんご野郎
02/17/2026, 12:34 AMKFC
02/17/2026, 1:52 AMKFC
02/17/2026, 1:55 AMKFC
02/17/2026, 10:26 AMKFC
02/17/2026, 10:40 AMKFC
02/17/2026, 10:40 AMりんご野郎
02/17/2026, 10:45 AMりんご野郎
02/17/2026, 10:45 AMKFC
02/17/2026, 10:52 AMりんご野郎
02/17/2026, 10:54 AMりんご野郎
02/17/2026, 10:55 AMKFC
02/17/2026, 10:58 AM真冬 雪々(まふゆ ゆきゆき)
02/22/2026, 8:07 PMjs
if(右開かつ、アニメーション変数①が0を上回るなら){アニメーション変数① -= 変化量①
}else if(右開かつ、アニメーション変数①が0以下かつ、アニメーション変数②が0を上回るなら){
アニメーション変数② -= 変化量②
}
//ここに左側ドアの同じ構文
//ドア閉じ動作の分も同じく左右構文記述
みたいな感じ?KFC
02/22/2026, 8:59 PMKFC
02/23/2026, 8:50 AMhi03
03/01/2026, 9:19 AMhi03
03/01/2026, 9:19 AMjavascript
var doorLength = 0.6356;//ドアの長さ(移動量)[m]
var isOpenR = (entity.getTrainStateData(4) & 1) === 1;//右ドアスイッチが開か閉か
var isOpenL = (entity.getTrainStateData(4) & 2) === 2;//左ドアスイッチが開か閉か
var doorMoveR = entity.doorMoveR / 60;//右ドアのアニメーション量 3秒かけて 0.0 - 1.0 になる値を返す
var doorMoveL = entity.doorMoveL / 60;//左ドアのアニメーション量 3秒かけて 0.0 - 1.0 になる値を返す
var doorMotionR = 0;
var doorMotionL = 0;
//ドアの挙動は一次関数などを合成して動きをつける
//右ドアスイッチが開のときの挙動
if (isOpenR) {
//0.0 → 0.7までは早めに動き、最後にゆっくり動く挙動
if (doorMoveR < 0.7) doorMotionR = lerp(doorMoveR, 0.0, 0.0, 0.7, 0.9);//doorMoveRが0.0のときは0.0、0.7のときは0.9となる一次関数
else doorMotionR = lerp(doorMoveR, 0.7, 0.9, 1.0, 1.0);//doorMoveRが0.7のときは0.9、1.0のときは1.0となる一次関数
}
//右ドアスイッチが閉のときの挙動
else {
//1.0 → 0.2までは早く動き、最後にゆっくり動く挙動
if (doorMoveR > 0.2) doorMotionR = lerp(doorMoveR, 1.0, 1.0, 0.2, 0.1);
else doorMotionR = lerp(doorMoveR, 0.2, 0.1, 0.0, 0.0);
}
//左ドアスイッチが開のときの挙動
if (isOpenL) {
if (doorMoveL < 0.7) doorMotionL = lerp(doorMoveL, 0.0, 0.0, 0.7, 0.9);
else doorMotionL = lerp(doorMoveL, 0.7, 0.9, 1.0, 1.0);
}
//左ドアスイッチが閉のときの挙動
else {
if (doorMoveL > 0.2) doorMotionL = lerp(doorMoveL, 1.0, 1.0, 0.2, 0.1);
else doorMotionL = lerp(doorMoveL, 0.2, 0.1, 0.0, 0.0);
}
//右前ドアの描画
GL11.glPushMatrix();
GL11.glTranslatef(0, 0, doorMotionR * doorLength);
doorRF.render(renderer);
GL11.glPopMatrix();
//右後ドアの描画
GL11.glPushMatrix();
GL11.glTranslatef(0, 0, doorMotionR * -doorLength);
doorRB.render(renderer);
GL11.glPopMatrix();
//左前ドアの描画
GL11.glPushMatrix();
GL11.glTranslatef(0, 0, doorMotionL * doorLength);//ドアの移動
doorLF.render(renderer);
GL11.glPopMatrix();
//左後ドアの描画
GL11.glPushMatrix();
GL11.glTranslatef(0, 0, doorMotionL * -doorLength);
doorLB.render(renderer);
GL11.glPopMatrix();
⋮
//線形補間の関数
function lerp(x, x1, y1, x2, y2) {
return y1 + (y2 - y1) * (x - x1) / (x2 - x1);
}hi03
03/01/2026, 9:20 AMKFC
03/01/2026, 11:58 AMKFC
03/01/2026, 12:38 PMKFC
03/01/2026, 12:39 PMKFC
03/01/2026, 12:46 PMfunction hi03Linear(par1){
var m;
if(par1===1.0){m = 1.0;}
else if(par1===0.0){m = 0.0;}
else if(par1>0.0&&par1<0.3){
m = 0.66666 * par1 ;
}
else if(par1>=0.3&&par1<=0.8){
m = 1.4 * par1 - 0.22;
}
else if(par1>0.8&&par1<1.0){
m = par1 * 0.5 + 0.5;
}
return m;
}KFC
03/01/2026, 12:47 PMhi03
03/01/2026, 1:24 PMjavascript
//dataMapの使い方
var dataMap = entity.getResourceState().getDataMap();
var doorMotionR = dataMap.getDouble("doorMotionR");//値呼び出し
var doorMotionL = dataMap.getDouble("doorMotionL");
var maxMove = 1.0;//1.0m
var isOpenR = (entity.getTrainStateData(4) & 1) === 1;//右ドアスイッチが開か閉か
var isOpenL = (entity.getTrainStateData(4) & 2) === 2;//左ドアスイッチが開か閉か
//値を変更する(例)
if (isOpenL && doorMotionL < maxMove) doorMotionL = doorMotionL + 0.01;//ドアが開いているときはドアの位置を0.01mずつ増やす
if (isOpenR && doorMotionR < maxMove) doorMotionR = doorMotionR + 0.01;
if (!isOpenL && doorMotionL > 0) doorMotionL = doorMotionL - 0.01;
if (!isOpenR && doorMotionR > 0) doorMotionR = doorMotionR - 0.01;
//値を保存する
dataMap.setDouble("doorMotionR", doorMotionR, 0);//第3引数のフラグ 0:非同期(スクリプト内のみ) 1:サーバー/クライアント同期(パケット送信あり)
dataMap.setDouble("doorMotionL", doorMotionL, 0);hi03
03/01/2026, 1:26 PMKFC
03/02/2026, 4:28 AMfunction render_door(entity){
if(entity!=null){
//dataMapの使い方
var dataMap = entity.getResourceState().getDataMap();
var doorMotionR = dataMap.getDouble("doorMotionR");//値呼び出し
var doorMotionL = dataMap.getDouble("doorMotionL");
var maxMove = 1.0;//1.0m
var isOpenR = (entity.getTrainStateData(4) & 1) === 1;//右ドアスイッチが開か閉か
var isOpenL = (entity.getTrainStateData(4) & 2) === 2;//左ドアスイッチが開か閉か
//値を変更する(例)
if (isOpenL && doorMotionL < maxMove) doorMotionL = doorMotionL + 0.01;//ドアが開いているときはドアの位置を0.01mずつ増やす
if (isOpenR && doorMotionR < maxMove) doorMotionR = doorMotionR + 0.01;
if (!isOpenL && doorMotionL > 0) doorMotionL = doorMotionL - 0.01;
if (!isOpenR && doorMotionR > 0) doorMotionR = doorMotionR - 0.01;
//値を保存する
dataMap.setDouble("doorMotionR", doorMotionR, 0);//第3引数のフラグ 0:非同期(スクリプト内のみ) 1:サーバー/クライアント同期(パケット送信あり)
dataMap.setDouble("doorMotionL", doorMotionL, 0);
}
//右前ドアの描画
GL11.glPushMatrix();
GL11.glTranslatef(0, 0, doorMotionR);
doorR1.render(renderer);
GL11.glPopMatrix();
//右後ドアの描画
GL11.glPushMatrix();
GL11.glTranslatef(0, 0, doorMotionR);
doorR2.render(renderer);
GL11.glPopMatrix();
//左前ドアの描画
GL11.glPushMatrix();
GL11.glTranslatef(0, 0, doorMotionL);//ドアの移動
doorL1.render(renderer);
GL11.glPopMatrix();
//左後ドアの描画
GL11.glPushMatrix();
GL11.glTranslatef(0, 0, doorMotionL);
doorL2.render(renderer);
GL11.glPopMatrix();
}KFC
03/02/2026, 4:29 AMKFC
03/02/2026, 4:48 AMKFC
03/02/2026, 4:52 AMKFC
03/02/2026, 4:52 AMhi03
03/02/2026, 9:43 AMjavascript
function tickUpdate(entity, pass) {
//passによって1フレームで4回実行されるため、pass !== 0 で弾く
//材質の数だけ繰り返し実行されるため、renderer.currentMatId !== 0 で弾く
if (!entity || pass !== 0 || renderer.currentMatId !== 0) return;
var dataMap = entity.getResourceState().getDataMap();
var tick = renderer.getTick(entity);
var prevTick = dataMap.getInt("tickUpdate_tick");
dataMap.setInt("tickUpdate_tick", tick, 0);
//Tickが変わったときだけ実行する(1秒=20ticks) → 再生速度を一定にできる
if (prevTick !== tick) {
//この中に値の増減処理、保存処理を書く(描画はしない)
}
}KFC
03/02/2026, 10:53 AM