//plane val{ pitch_1(default=0,min=-10,max=10,step=0) pitch1_1(default=0,min=-10,max=10,step=1,disp=0) roll_1(default=0,min=-10,max=10,step=0) roll1_1(default=0,min=-10,max=10,step=0.5,disp=0) yaw_1(default=0,min=-10,max=10,step=0) yaw1_1(default=0,min=-10,max=10,step=1,disp=0) jet_1(default=0,min=0,max=100000,step=0) jet1_1(default=0,min=0,max=100000,step=0,disp=0) abrake_1(default=0,min=0,max=90,step=0) abrake1_1(default=0,min=0,max=90,step=90,disp=0) gear_1(default=80,min=80,max=170,step=0,disp=0) gbrake_1(default=0,min=0,max=10,step=0,disp=0) height_1(default=0,min=-10000,max=10000,step=0) tgt_x_1(default=0,min=-100000,max=100000,step=0) tgt_y_1(default=0,min=-100000,max=100000,step=0) tgt_z_1(default=0,min=-100000,max=100000,step=0) dst_1(default=0,min=0,max=10000000,step=0) pitch_2(default=0,min=-10,max=10,step=0,disp=0) roll_2(default=0,min=-10,max=10,step=0,disp=0) yaw_2(default=0,min=-10,max=10,step=0,disp=0) jet_2(default=0,min=0,max=100000,step=0,disp=1) jet1_2(default=0,min=0,max=100000,step=0,disp=0) abrake_2(default=0,min=0,max=90,step=0,disp=0) abrake1_2(default=0,min=0,max=90,step=0,disp=0) gear_2(default=80,min=80,max=170,step=0,disp=0) gbrake_2(default=0,min=0,max=10,step=0,disp=0) tgt_x_2(default=0,min=-100000,max=100000,step=0) tgt_y_2(default=0,min=-100000,max=100000,step=0) tgt_z_2(default=0,min=-100000,max=100000,step=0) dst_2(default=0,min=0,max=10000000,step=0) pitch_3(default=0,min=-10,max=10,step=0,disp=0) roll_3(default=0,min=-10,max=10,step=0,disp=0) yaw_3(default=0,min=-10,max=10,step=0,disp=0) jet_3(default=0,min=0,max=100000,step=0,disp=1) jet1_3(default=0,min=0,max=100000,step=0,disp=0) abrake_3(default=0,min=0,max=90,step=0,disp=0) abrake1_3(default=0,min=0,max=90,step=0,disp=0) gear_3(default=80,min=80,max=170,step=0,disp=0) gbrake_3(default=0,min=0,max=10,step=0,disp=0) tgt_x_3(default=0,min=-100000,max=100000,step=0) tgt_y_3(default=0,min=-100000,max=100000,step=0) tgt_z_3(default=0,min=-100000,max=100000,step=0) dst_3(default=0,min=0,max=10000000,step=0) auto(default=0,min=0,max=1,step=0,disp=0) auto1(default=0,min=0,max=1,step=0,disp=0) bal(default=0,min=0,max=1,step=0,disp=0) bal1(default=0,min=0,max=1,step=0,disp=0) } key{ 0:pitch1_1(step=-1) 1:pitch1_1(step=1) 2:roll1_1(step=0.5) 3:roll1_1(step=-0.5) 4:yaw1_1(step=-1) 6:yaw1_1(step=1) 5:jet_1(step=10000) 9:jet_1(step=-10000),abrake1_1(step=3) } body{ core(name=c_1){ n:frame(angle=-20){ n:jet(angle=110,power=jet_1,effect=1){ } n:frame(angle=-140){ n:arm(angle=-20,option=0,name=roof_1,color=#0000FF){ } } } w:chip(){ w:trim(angle=roll_1){ w:chip(){ w:cowl(option=4,color=#0000FF){ } } } } e:chip(){ e:trim(angle=roll_1){ e:chip(){ e:cowl(option=3,color=#0000FF){ } } } } s:chip(){ s:chip(){ s:chip(){ w:chip(angle=-90){ s:chip(angle=-yaw_1){ } } e:chip(angle=-90){ s:chip(angle=yaw_1){ } } s:chip(){ w:trim(angle=pitch_1){ } e:trim(angle=-pitch_1){ } } } } } w:frame(angle=10){ w:wheel(angle=gear_1,brake=gbrake_1){ } } e:frame(angle=10){ e:wheel(angle=gear_1,brake=gbrake_1){ } } s:chip(angle=abrake_1){ } s:chip(angle=-abrake_1){ } n:chip(name=c_2){ n:frame(angle=-20){ n:jet(angle=110,power=jet_2,effect=1){ } n:frame(angle=-140){ n:cowl(angle=-20,option=0,name=roof_2,color=#FFFF00){ } } } w:chip(){ w:trim(angle=roll_2){ w:chip(){ w:cowl(option=4,color=#FFFF00){ } } } } e:chip(){ e:trim(angle=roll_2){ e:chip(){ e:cowl(option=3,color=#FFFF00){ } } } } s:chip(){ s:chip(){ s:chip(){ w:chip(angle=-90){ s:chip(angle=-yaw_2){ } } e:chip(angle=-90){ s:chip(angle=yaw_2){ } } s:chip(){ w:trim(angle=pitch_2){ } e:trim(angle=-pitch_2){ } } } } } w:frame(angle=10){ w:wheel(angle=gear_2,brake=gbrake_2){ } } e:frame(angle=10){ e:wheel(angle=gear_2,brake=gbrake_2){ } } s:chip(angle=abrake_2){ } s:chip(angle=-abrake_2){ } } n:chip(name=c_3){ n:frame(angle=-20){ n:jet(angle=110,power=jet_3,effect=1){ } n:frame(angle=-140){ n:cowl(angle=-20,option=0,name=roof_3,color=#FF0000){ } } } w:chip(){ w:trim(angle=roll_3){ w:chip(){ w:cowl(option=4,color=#FF0000){ } } } } e:chip(){ e:trim(angle=roll_3){ e:chip(){ e:cowl(option=3,color=#FF0000){ } } } } s:chip(){ s:chip(){ s:chip(){ w:chip(angle=-90){ s:chip(angle=-yaw_3){ } } e:chip(angle=-90){ s:chip(angle=yaw_3){ } } s:chip(){ w:trim(angle=pitch_3){ } e:trim(angle=-pitch_3){ } } } } } w:frame(angle=10){ w:wheel(angle=gear_3,brake=gbrake_3){ } } e:frame(angle=10){ e:wheel(angle=gear_3,brake=gbrake_3){ } } s:chip(angle=abrake_3){ } s:chip(angle=-abrake_3){ } } } } script{ t=_split(c_2) t=_split(c_3) t=_rnd() // 時間表示 // sec=_mod(_ticks()/30,60) hmin=_int(_ticks()/86400)+_mod(_int(_ticks()/1800),60)/100 // _az(c_N)の補正 azs=_y(roof_1)-_y(c_1) az_1=_az(c_1) if(azs<0){az_1=_sgn(az_1)*_pi()-az_1} azs=_y(roof_2)-_y(c_2) az_2=_az(c_2) if(azs<0){az_2=_sgn(az_2)*_pi()-az_2} azs=_y(roof_3)-_y(c_3) az_3=_az(c_3) if(azs<0){az_3=_sgn(az_3)*_pi()-az_3} // autoフラグ if(_key(7)>0){auto=1-auto1} if(_key(7)=0){auto1=auto} // balフラグ if(_key(8)>0){bal=1-bal1} if(_key(8)=0){bal1=bal} // 手動制御ならジャンプ if(auto=0){goto manual_1} /////////////////////////////////////////////////////////////////////////////// // 3号機を追尾 tgt_x_1=_x(c_3)+_vz(c_3)*_cos(_ax(c_3))*_sin(_ay(c_3)) tgt_y_1=_y(c_3)-_vz(c_3)*_sin(_ax(c_3))-5 tgt_z_1=_z(c_3)+_vz(c_3)*_cos(_ax(c_3))*_cos(_ay(c_3)) // 相対座標(回転前)を求める lx=tgt_x_1-_x(c_1) ly=tgt_y_1-_y(c_1) lz=tgt_z_1-_z(c_1) dst_1=_len3(lx,ly,lz) // 自機を基準としたローカル平面上のターゲットローカル座標を求める // 自機のY軸回転を差し引く(-AYだけ回転させる) lz=-lz lx=-lx z=lz*_cos(_ay(c_1))+lx*_sin(_ay(c_1)) x=lx*_cos(_ay(c_1))-lz*_sin(_ay(c_1)) lz=-z lx=-x // 自機のX軸回転を差し引く(-AXだけ回転させる) lz=-lz z=lz*_cos(_ax(c_1))+ly*_sin(_ax(c_1)) y=ly*_cos(_ax(c_1))-lz*_sin(_ax(c_1)) lz=-z ly=y // 自機のZ軸回転を差し引く(-AZだけ回転させる) y=ly*_cos(az_1)+lx*_sin(az_1) x=lx*_cos(az_1)-ly*_sin(az_1) ly=y lx=x if((_y(c_1)<100)|(_h(c_1)>=0)){ cp=45 goto joushou_1 } cp=_atan2(ly,-lz)+_atan(_vy(c_1)/_vz(c_1)) if(cp<-_pi()){cp=cp+2*_pi()} if(cp>_pi()){cp=cp-2*_pi()} cy=_atan2(-lx,-lz) cr=-az_1 if(_abs(cp)+_abs(cy)>_pi()/8){cr=_atan2(lx,ly)} cpp=0 goto seigyo_1 label kaihi_1 // 回避ロール角を求める cr=0 if(_ccd(t,t)<>26527){cr=cr-135} if(_ccd(t,63-t)<>26527){cr=cr-45} if(_ccd(63-t,t)<>26527){cr=cr+135} if(_ccd(63-t,63-t)<>26527){cr=cr+45} cr=_torad(cr) if(cr=0){cr=-az_1} // 回避ピッチ角を求める cp=0 if(_abs(cr)<_pi()/2){cp=_pi()/8*_cos(cr)} if(_ccd(32,32)<>26527){cp=_pi()*_sgn(cp)} // 回避ヨー角を求める cy=_pi()*_sin(-cr) cpp=0 goto seigyo_1 label joushou_1 // ピッチ角=cp、ロール角=0で固定 cr=-az_1 cp=_atan(_vy(c_1)/_vz(c_1))-_ax(c_1)+_torad(cp) if(cp<-_pi()){cp=cp+2*_pi()} if(cp>_pi()){cp=cp-2*_pi()} cy=0 cpp=0 goto seigyo_1 label manual_1 if(bal>0){ // 水平戻し cr=-az_1 cp=_atan(_vy(c_1)/_vz(c_1))-_ax(c_1) if(cp<-_pi()){cp=cp+2*_pi()} if(cp>_pi()){cp=cp-2*_pi()} cy=0 // 無操作且つほぼ水平飛行の場合、現在高度を保存(更新しない) if(_abs(az_1)>0.1)|(_abs(_ax(c_1))>0.1){height_1=_y(c_1)} if(pitch1_1<>0)|(roll1_1<>0)|(yaw1_1<>0){height_1=_y(c_1)} // 目標高度のズレを補正 cpp=(height_1+2-_y(c_1))/10 } if(bal=0){ // こっちのIF文を後に書かないとcpp=0にならない。何故? cr=0 cp=0 cy=0 cpp=0 } label seigyo_1 roll2=200*cr/(_abs(_vz(c_1))+1) pitch2=2000*cp/(_abs(_vz(c_1))+1)+cpp yaw2=8000*cy/(_abs(_vz(c_1))+1) p=pitch1_1+pitch2 r=roll1_1+roll2 y=yaw1_1+yaw2 p=p-pitch_1 r=r-roll_1 y=y-yaw_1 t=4 if(_abs(p)>t){p=_sgn(p)*t} if(_abs(r)>t){r=_sgn(r)*t} if(_abs(y)>t){y=_sgn(y)*t} pitch_1=pitch_1+p roll_1=roll_1+r yaw_1=yaw_1+y // ギア if(_h(c_1)<0){ gear_1=gear_1+2 gbrake_1=100 } if(_h(c_1)>=0){ gear_1=gear_1-10 gbrake_1=0 } // リミッタ if(auto<>0){ jet1_1=450*(dst_1-40) jet_1=jet1_1 abrake1_1=(90-dst_1)*3 abrake_1=abrake_1+_sgn(abrake1_1-abrake_1)*3 } if(auto=0){ abrake_1=abrake_1+_sgn(abrake1_1-abrake_1)*3 } /////////////////////////////////////////////////////////////////////////////// // 1号機を追尾 tgt_x_2=_x(c_1)+_vz(c_1)*_cos(_ax(c_1))*_sin(_ay(c_1)) tgt_y_2=_y(c_1)-_vz(c_1)*_sin(_ax(c_1))+5 tgt_z_2=_z(c_1)+_vz(c_1)*_cos(_ax(c_1))*_cos(_ay(c_1)) // 相対座標(回転前)を求める lx=tgt_x_2-_x(c_2) ly=tgt_y_2-_y(c_2) lz=tgt_z_2-_z(c_2) dst_2=_len3(lx,ly,lz) // 自機を基準としたローカル平面上のターゲットローカル座標を求める // 自機のY軸回転を差し引く(-AYだけ回転させる) lz=-lz lx=-lx z=lz*_cos(_ay(c_2))+lx*_sin(_ay(c_2)) x=lx*_cos(_ay(c_2))-lz*_sin(_ay(c_2)) lz=-z lx=-x // 自機のX軸回転を差し引く(-AXだけ回転させる) lz=-lz z=lz*_cos(_ax(c_2))+ly*_sin(_ax(c_2)) y=ly*_cos(_ax(c_2))-lz*_sin(_ax(c_2)) lz=-z ly=y // 自機のZ軸回転を差し引く(-AZだけ回転させる) y=ly*_cos(az_2)+lx*_sin(az_2) x=lx*_cos(az_2)-ly*_sin(az_2) ly=y lx=x if((_y(c_2)<100)|(_h(c_2)>=0)){ cp=45 goto joushou_2 } cp=_atan2(ly,-lz)+_atan(_vy(c_2)/_vz(c_2)) if(cp<-_pi()){cp=cp+2*_pi()} if(cp>_pi()){cp=cp-2*_pi()} cy=_atan2(-lx,-lz) cr=-az_2 if(_abs(cp)+_abs(cy)>_pi()/8){cr=_atan2(lx,ly)} cpp=0 goto seigyo_2 label joushou_2 // ピッチ角=cp、ロール角=0で固定 cr=-az_2 cp=_atan(_vy(c_2)/_vz(c_2))-_ax(c_2)+_torad(cp) if(cp<-_pi()){cp=cp+2*_pi()} if(cp>_pi()){cp=cp-2*_pi()} cy=0 cpp=0 label seigyo_2 roll2=200*cr/(_abs(_vz(c_2))+1) pitch2=2000*cp/(_abs(_vz(c_2))+1)+cpp yaw2=8000*cy/(_abs(_vz(c_2))+1) p=pitch2 r=roll2 y=yaw2 p=p-pitch_2 r=r-roll_2 y=y-yaw_2 t=4 if(_abs(p)>t){p=_sgn(p)*t} if(_abs(r)>t){r=_sgn(r)*t} if(_abs(y)>t){y=_sgn(y)*t} pitch_2=pitch_2+p roll_2=roll_2+r yaw_2=yaw_2+y // ギア if(_h(c_2)<0){ gear_2=gear_2+2 gbrake_2=100 } if(_h(c_2)>=0){ gear_2=gear_2-10 gbrake_2=0 } // リミッタ abrake1_2=0 jet1_2=450*(dst_2-40) jet_2=jet1_2 abrake1_2=(90-dst_2)*3 abrake_2=abrake_2+_sgn(abrake1_2-abrake_2)*3 /////////////////////////////////////////////////////////////////////////////// // ターゲット座標の更新 if(dst_3<200)|(tgt_y_3<100){ tgt_x_3=_int(_rnd()*10000-5000) tgt_y_3=_int(_rnd()*800+200) tgt_z_3=_int(_rnd()*10000-5000) } // 相対座標(回転前)を求める lx=tgt_x_3-_x(c_3) ly=tgt_y_3-_y(c_3) lz=tgt_z_3-_z(c_3) dst_3=_len3(lx,ly,lz) // 自機を基準としたローカル平面上のターゲットローカル座標を求める // 自機のY軸回転を差し引く(-AYだけ回転させる) lz=-lz lx=-lx z=lz*_cos(_ay(c_3))+lx*_sin(_ay(c_3)) x=lx*_cos(_ay(c_3))-lz*_sin(_ay(c_3)) lz=-z lx=-x // 自機のX軸回転を差し引く(-AXだけ回転させる) lz=-lz z=lz*_cos(_ax(c_3))+ly*_sin(_ax(c_3)) y=ly*_cos(_ax(c_3))-lz*_sin(_ax(c_3)) lz=-z ly=y // 自機のZ軸回転を差し引く(-AZだけ回転させる) y=ly*_cos(az_3)+lx*_sin(az_3) x=lx*_cos(az_3)-ly*_sin(az_3) ly=y lx=x if((_y(c_3)<100)|(_h(c_3)>=0)){ cp=45 goto joushou_3 } cp=_atan2(ly,-lz)+_atan(_vy(c_3)/_vz(c_3)) if(cp<-_pi()){cp=cp+2*_pi()} if(cp>_pi()){cp=cp-2*_pi()} cy=_atan2(-lx,-lz) cr=-az_3 if(_abs(cp)+_abs(cy)>_pi()/8){cr=_atan2(lx,ly)} cpp=0 goto seigyo_3 label joushou_3 // ピッチ角=cp、ロール角=0で固定 cr=-az_3 cp=_atan(_vy(c_3)/_vz(c_3))-_ax(c_3)+_torad(cp) if(cp<-_pi()){cp=cp+2*_pi()} if(cp>_pi()){cp=cp-2*_pi()} cy=0 cpp=0 label seigyo_3 roll2=200*cr/(_abs(_vz(c_3))+1) pitch2=2000*cp/(_abs(_vz(c_3))+1)+cpp yaw2=8000*cy/(_abs(_vz(c_3))+1) p=pitch2 r=roll2 y=yaw2 p=p-pitch_3 r=r-roll_3 y=y-yaw_3 t=4 if(_abs(p)>t){p=_sgn(p)*t} if(_abs(r)>t){r=_sgn(r)*t} if(_abs(y)>t){y=_sgn(y)*t} pitch_3=pitch_3+p roll_3=roll_3+r yaw_3=yaw_3+y // ギア if(_h(c_3)<0){ gear_3=gear_3+2 gbrake_3=100 } if(_h(c_3)>=0){ gear_3=gear_3-10 gbrake_3=0 } t=80 // リミット速度 jet1_3=t*50000*(1-_vz(c_3)*_vz(c_3)/t/t) jet_3=jet1_3 abrake1_3=(-_vz(c_3)-t)*5*t /////////////////////////////////////////////////////////////////////////////// // 表示 print 0,"Up/Down:Pitch, Left/Right:Roll, Z/C:Yaw, X:Jet-On, D:Jet-Off if(auto=1)&(bal=1){ print 1,"A:Auto-Pilot[ON], S:Balance[ON], Z+C:Print[On/Off] } if(auto=1)&(bal=0){ print 1,"A:Auto-Pilot[ON], S:Balance[OFF], Z+C:Print[On/Off] } if(auto=0)&(bal=1){ print 1,"A:Auto-Pilot[OFF], S:Balance[ON], Z+C:Print[On/Off] } if(auto=0)&(bal=0){ print 1,"A:Auto-Pilot[OFF], S:Balance[OFF], Z+C:Print[On/Off] } print 2,"Vel=",_vel(c_1),", Distance=",dst_1 print 3,"x=",_x(c_1),", y=",_y(c_1),", z=",_z(c_1) print 4,"ax=",_todeg(_ax(c_1)),", ay=",_todeg(_ay(c_1)),", az=",_todeg(_az(c_1)),", az=",_todeg(az),", azs=",_sgn(azs) // print 4,"ax=",_ax(c_1),", ay=",_ay(c_1),", az=",_az(c_1),", az=",az,", azs=",_sgn(azs) print 5,"vx=",_vx(c_1),", vy=",_vy(c_1),", vz=",_vz(c_1) print 6,"lx=",lx,", ly=",ly,", lz=",lz print 7,"cr=",cr,", cp=",cp,", cy=",cy print 8,"CCD=",_ccd(32,32),", R=",_red(32,32),", G=",_green(32,32),", B=",_blue(32,32) if(sec<10){print 9,"Time=",hmin,".0",sec,", FPS=",_fps()} if(sec>=10){print 9,"Time=",hmin,".",sec,", FPS=",_fps()} }