// 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 }