188 lines
3.8 KiB
Plaintext
188 lines
3.8 KiB
Plaintext
// 3D STAGE TUTORIAL
|
|
|
|
// X : horizontal, Y : vertical, Z : depth (close/near)
|
|
|
|
// Stage script -> Set textures
|
|
|
|
#TouhouDanmakufu[Stage]
|
|
#Title["3D Stages"]
|
|
#Text["Stage script for 3D practice"]
|
|
#ScriptVersion[3]
|
|
#System["script/KevinSystem/Kevin_System.txt"]
|
|
|
|
let CSD = GetCurrentScriptDirectory;
|
|
let texturefloor = CSD ~ "sprite/dafloorEX.png";
|
|
let texturewall = CSD ~ "sprite/damagicwall.png";
|
|
let texturefog = CSD ~ "sprite/cardbg4.png";
|
|
|
|
// REMEMBER : set variable texturefloor as png because my ass internet
|
|
// can't download a simple png
|
|
|
|
// ------- Function to create one floor piece -------//
|
|
|
|
/*
|
|
SetAngleXYZ?
|
|
|
|
+ Rotates/flips the 3D sprite around a X, Y, Z axis.
|
|
+ Direction is influenced by HOW THE CAMERA IS SET -> Setting the camera
|
|
correctly is important!
|
|
|
|
X : horizontal
|
|
Y : vertical
|
|
Z : depth
|
|
|
|
*/
|
|
|
|
function FloorCreation(locX,locY,locZ){
|
|
let floorObj = ObjPrim_Create(OBJ_SPRITE_3D);
|
|
ObjPrim_SetTexture(floorObj,texturefloor);
|
|
Obj_SetRenderPriorityI(floorObj,20);
|
|
ObjSprite3D_SetSourceDestRect(floorObj,0,0,512,512);
|
|
ObjRender_SetScaleXYZ(floorObj,1,1,0);
|
|
ObjRender_SetZWrite(floorObj,true);
|
|
|
|
ObjRender_SetAngleXYZ(floorObj,90,0,0); // Floor-styled render
|
|
|
|
ObjRender_SetPosition(floorObj,locX,locY,locZ); // Positioning of floor, notice function parameters
|
|
}
|
|
|
|
function WallCreation(locX,locY,locZ){
|
|
let floorObj = ObjPrim_Create(OBJ_SPRITE_3D);
|
|
ObjPrim_SetTexture(floorObj,texturewall);
|
|
Obj_SetRenderPriorityI(floorObj,20);
|
|
ObjSprite3D_SetSourceDestRect(floorObj,0,0,1024,1024);
|
|
ObjRender_SetScaleXYZ(floorObj,0.5,1,0);
|
|
ObjRender_SetZWrite(floorObj,true);
|
|
|
|
ObjRender_SetAngleXYZ(floorObj,0,90,0); // Wall-styled render
|
|
|
|
ObjRender_SetPosition(floorObj,locX,locY,locZ);
|
|
|
|
}
|
|
|
|
function FogCreation(locX,locY,locZ){
|
|
let floorObj = ObjPrim_Create(OBJ_SPRITE_3D);
|
|
ObjPrim_SetTexture(floorObj,texturefog);
|
|
Obj_SetRenderPriorityI(floorObj,20);
|
|
ObjSprite3D_SetSourceDestRect(floorObj,0,0,1024,1024); // Fully covers screen
|
|
ObjRender_SetScaleXYZ(floorObj,4,4,0);
|
|
ObjRender_SetZWrite(floorObj,true);
|
|
|
|
// ObjRender_SetAngleXYZ(floorObj,0,0,0); -> NOT USED,
|
|
// as the fog will always be facing player
|
|
|
|
ObjSprite3D_SetBillboard(floorObj,true);
|
|
ObjRender_SetPosition(floorObj,locX,locY,locZ);
|
|
|
|
}
|
|
|
|
@Initialize{
|
|
// Call the task to start stage renders
|
|
//SetIntersectionVisualization(true);
|
|
StageTime;
|
|
scrollitbabe;
|
|
}
|
|
|
|
@Event{
|
|
|
|
}
|
|
|
|
@MainLoop{
|
|
yield;
|
|
}
|
|
|
|
@Finalize{
|
|
|
|
}
|
|
|
|
task StageTime{
|
|
|
|
// Fog construction
|
|
SetFogEnable(true);
|
|
SetFogParam(1024,1536,20,15,35);
|
|
FogCreation(0,0,2048);
|
|
|
|
// Stage construction, like cardboard house building
|
|
ascent(i in 0..4){
|
|
FloorCreation(0,0,512*i);
|
|
yield;
|
|
}
|
|
ascent (i in 0..4){
|
|
WallCreation(-256,256,512*i);
|
|
yield;
|
|
}
|
|
ascent (i in 0..4){
|
|
WallCreation(256,256,512*i);
|
|
yield;
|
|
}
|
|
|
|
}
|
|
|
|
// Stage scrolling
|
|
|
|
/* Guide : CAMERAS?????
|
|
|
|
* AZIMUTH *
|
|
|
|
SetCameraAzimuthAngle(0); - ?????
|
|
SetCameraElevationAngle(0); - How HIGH the camera is
|
|
SetCameraRadius(0); - How FAR the camera is
|
|
|
|
* FOCUS *
|
|
|
|
SetCameraFocusX(0);
|
|
SetCameraFocusY(0);
|
|
SetCameraFocusZ(0);
|
|
|
|
* ????? *
|
|
|
|
SetCameraYaw(0);
|
|
SetCameraPitch(0);
|
|
SetCameraRoll(0);
|
|
*/
|
|
task scrollitbabe{
|
|
let scroll = 0;
|
|
let ang = 0;
|
|
let theyaeur = -180;
|
|
// CAMERA SYSTEM handled here
|
|
|
|
// Min/max camera render distance
|
|
SetCameraPerspectiveClip(16,6000);
|
|
|
|
// Camera settings - TBE (to be explained)
|
|
async{
|
|
loop{
|
|
SetCameraAzimuthAngle(theyaeur);
|
|
theyaeur = Interpolate_Decelerate(-105, -115, cos(NormalizeAngle(ang)));
|
|
ang += 1;
|
|
yield;
|
|
}
|
|
}
|
|
|
|
|
|
SetCameraElevationAngle(15);
|
|
SetCameraRadius(64);
|
|
SetCameraFocusX(0);
|
|
SetCameraFocusY(512);
|
|
SetCameraFocusZ(-512);
|
|
|
|
/* GUIDE : The scroll illusion
|
|
|
|
Make a variable, add it to CameraZ
|
|
Count the variable to move CameraZ forward
|
|
At a certain point, reset it back to the beginning
|
|
Add fog, profit(?) */
|
|
|
|
loop{
|
|
SetCameraFocusZ(-512+scroll);
|
|
if(scroll > 512){
|
|
scroll = 0;
|
|
}
|
|
scroll+=24;
|
|
yield;
|
|
}
|
|
|
|
// Maintaining the perfect illusion with Fog
|
|
}
|
|
|