モジュール変数によるキャラクター管理法。
d3moduleを利用しています。
d3box命令を使って修正。(2007/10/02)#include "d3m.hsp"
#const global BOX_X 200
#const global BOX_Y 300
#const global BOX_Z 150
#const CAMERA_DISTANCE 500
#const BALL_MAX 30
#module physics3d x, y, z, vx, vy, vz
#modinit double d1, double d2, double d3, double d4, double d5, double d6
x = d1, d1, d1, d1
y = d2, d2, d2, d2
z = d3, d3, d3, d3
vx = d4 : vy = d5 : vz = d6
return
#modfunc moveBall
x(1) = x, x(1), x(2)
y(1) = y, y(1), y(2)
z(1) = z, z(1), z(2)
x += vx : y += vy : z += vz
if ( x < 0 ) | ( BOX_X < x ) : vx *= -1
if ( y < 0 ) | ( BOX_Y < y ) : vy *= -1
if ( z < 0 ) | ( BOX_Z < z ) : vz *= -1
return
#modfunc drawBall
d3initlineto
repeat 4
d3lineto x(cnt), y(cnt), z(cnt)
loop
return
#global
screen 0, 400, 370
title "3次元を反射する光線"
theta = 0.0 // カメラの角度 (極座標)
phi = 3.14 / 2 // カメラの角度2(極座標)
gosub *setcam
repeat BALL_MAX
newmod ball, physics3d, rnd(200), rnd(300), rnd(150), (rnd(9)-4)*3, (rnd(9)-4)*4, (rnd(9)-4)*3
loop
*main
gosub *moveCam
gosub *draw
wait 4
goto *main
*moveCam
stick key, 15
if key & 15 {
theta += 0.1*((key & 1) - (key >> 2 & 1))
phi = limitf(phi + 0.1*((key >> 1 & 1) - (key >> 3 & 1)), 0.1, 3.13)
// ↑ カメラのXY座標がターゲットと同じにならないための対策
gosub *setcam
}
return
*draw
redraw 0
color : boxf
hsvcolor 30, 255, 100
d3box 0, 0, 0, BOX_X, BOX_Y, BOX_Z
hsvcolor 30, 255, 255
foreach ball
moveBall ball(cnt)
drawBall ball(cnt)
loop
redraw
return
*setcam
d3setcam sin(phi)*cos(theta)*CAMERA_DISTANCE + 100, sin(phi)*sin(theta)*CAMERA_DISTANCE + 150, cos(phi)*CAMERA_DISTANCE + 75, 100, 150, 75
return
2007年5月4日金曜日
3次元空間を反射する光線
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿