164 lines
4.3 KiB
Plaintext
164 lines
4.3 KiB
Plaintext
#TouhouDanmakufu[Single]
|
|
#ScriptVersion[3]
|
|
#Title["SampleVS02"]
|
|
#Text["SampleVS02: Vertex Shader-Based Distortion Effect"]
|
|
#Background["script/default_system/Default_Background_IceMountain.txt"]
|
|
|
|
#include "script/default_system/Default_ShotConst.txt"
|
|
|
|
let objEnemy;
|
|
let objPlayer;
|
|
let frame = 0;
|
|
|
|
@Event {
|
|
alternative(GetEventType())
|
|
case(EV_REQUEST_LIFE) {
|
|
SetScriptResult(500);
|
|
}
|
|
}
|
|
|
|
@Initialize {
|
|
objPlayer = GetPlayerObjectID();
|
|
|
|
objEnemy = ObjEnemy_Create(OBJ_ENEMY_BOSS);
|
|
ObjEnemy_Regist(objEnemy);
|
|
|
|
let imgExRumia = GetCurrentScriptDirectory ~ "ExRumia.png";
|
|
ObjPrim_SetTexture(objEnemy, imgExRumia);
|
|
ObjSprite2D_SetSourceRect(objEnemy, 64, 1, 127, 64);
|
|
ObjSprite2D_SetDestCenter(objEnemy);
|
|
|
|
let cx = GetStgFrameWidth() / 2;
|
|
ObjMove_SetDestAtFrame(objEnemy, cx, 180, 60);
|
|
|
|
TWaveCircle();
|
|
TFinalize();
|
|
}
|
|
|
|
@MainLoop {
|
|
let ex = ObjMove_GetX(objEnemy);
|
|
let ey = ObjMove_GetY(objEnemy);
|
|
|
|
if (frame == 120) {
|
|
let px = GetPlayerX();
|
|
ObjMove_SetDestAtFrame(objEnemy, rand(192 - 80, 192 + 80), rand(100, 230), 40);
|
|
//ObjMove_SetDestAtFrame(objEnemy, 0, rand(120, 300), 40);
|
|
|
|
frame = 0;
|
|
}
|
|
|
|
ObjEnemy_SetIntersectionCircleToShot(objEnemy, ex, ey, 32);
|
|
|
|
frame++;
|
|
yield;
|
|
}
|
|
|
|
task TWaveCircle() {
|
|
wait(60);
|
|
|
|
let color = [1, 0.065, 0.065];
|
|
let renderTexture = GetReservedRenderTargetName(0);
|
|
|
|
let stripWave = [];
|
|
|
|
let countEdge = 32;
|
|
let countStrip = 4;
|
|
let maxRadius = 128;
|
|
|
|
let frameLeft = GetStgFrameLeft();
|
|
let frameTop = GetStgFrameTop();
|
|
|
|
let objWave = ObjPrim_Create(OBJ_PRIMITIVE_2D);
|
|
|
|
Obj_SetRenderPriorityI(objWave, 26);
|
|
ObjPrim_SetPrimitiveType(objWave, PRIMITIVE_TRIANGLELIST);
|
|
ObjPrim_SetTexture(objWave, renderTexture);
|
|
|
|
ObjPrim_SetVertexCount(objWave, countEdge * countStrip * 6);
|
|
|
|
ascent (i in 0..countStrip) {
|
|
let stripWidth = maxRadius / (countStrip - 1);
|
|
let rInEdge = stripWidth * i;
|
|
FillRingVertex(i * countEdge * 6, rInEdge, rInEdge + stripWidth);
|
|
}
|
|
|
|
ObjRender_SetVertexShaderRenderingMode(objWave, true);
|
|
ObjShader_SetShaderF(objWave, GetCurrentScriptDirectory() ~ "SampleVS02_HLSL.txt");
|
|
ObjShader_SetTechnique(objWave, "Render");
|
|
|
|
let ex = ObjMove_GetX(objEnemy);
|
|
let ey = ObjMove_GetY(objEnemy);
|
|
|
|
let nowRadius = 0;
|
|
|
|
let t = 0;
|
|
while (!Obj_IsDeleted(objEnemy)) {
|
|
ex = ObjMove_GetX(objEnemy);
|
|
ey = ObjMove_GetY(objEnemy);
|
|
|
|
if(nowRadius < maxRadius){
|
|
let tmp = sin((t + 1) / 50 * 90);
|
|
nowRadius = maxRadius * tmp;
|
|
}
|
|
|
|
Update();
|
|
}
|
|
{
|
|
let _radius = nowRadius;
|
|
|
|
descent(i in 0..30){
|
|
let tmp = sin((i + 1) / 30 * 90);
|
|
nowRadius = _radius * tmp;
|
|
|
|
Update();
|
|
}
|
|
}
|
|
|
|
Obj_Delete(objWave);
|
|
|
|
function Update() {
|
|
RenderToTextureA1(renderTexture, 20, 25, true);
|
|
|
|
ObjShader_SetFloat(objWave, "frame_", t);
|
|
ObjShader_SetFloat(objWave, "waveSine_", 0.8 + sin(t * 5) * 0.5);
|
|
ObjShader_SetFloatArray(objWave, "waveRadius_", [nowRadius, maxRadius]);
|
|
|
|
ObjShader_SetFloatArray(objWave, "enemyPos_", [ex + frameLeft, ey + frameTop]);
|
|
ObjShader_SetFloatArray(objWave, "waveColor_", color);
|
|
|
|
//ObjRender_SetPosition(objWave, ex, ey, 1);
|
|
|
|
t++;
|
|
yield;
|
|
}
|
|
|
|
function FillRingVertex(vi_start, r_inner, r_outer) {
|
|
ascent (i in 0..countEdge) {
|
|
let vi = vi_start + i * 6;
|
|
let v_angle = 360 / (countEdge - 1);
|
|
let s1 = sin(v_angle * i);
|
|
let c1 = cos(v_angle * i);
|
|
let s2 = sin(v_angle * (i + 1));
|
|
let c2 = cos(v_angle * (i + 1));
|
|
ObjPrim_SetVertexPosition(objWave, vi + 0, r_inner * c1, r_inner * s1, 1);
|
|
ObjPrim_SetVertexPosition(objWave, vi + 1, r_outer * c1, r_outer * s1, 1);
|
|
ObjPrim_SetVertexPosition(objWave, vi + 2, r_inner * c2, r_inner * s2, 1);
|
|
ObjPrim_SetVertexPosition(objWave, vi + 3, r_outer * c1, r_outer * s1, 1);
|
|
ObjPrim_SetVertexPosition(objWave, vi + 4, r_inner * c2, r_inner * s2, 1);
|
|
ObjPrim_SetVertexPosition(objWave, vi + 5, r_outer * c2, r_outer * s2, 1);
|
|
ObjPrim_SetVertexUVT(objWave, vi + 0, r_inner * c1, r_inner * s1);
|
|
ObjPrim_SetVertexUVT(objWave, vi + 1, r_outer * c1, r_outer * s1);
|
|
ObjPrim_SetVertexUVT(objWave, vi + 2, r_inner * c2, r_inner * s2);
|
|
ObjPrim_SetVertexUVT(objWave, vi + 3, r_outer * c1, r_outer * s1);
|
|
ObjPrim_SetVertexUVT(objWave, vi + 4, r_inner * c2, r_inner * s2);
|
|
ObjPrim_SetVertexUVT(objWave, vi + 5, r_outer * c2, r_outer * s2);
|
|
}
|
|
}
|
|
}
|
|
|
|
task TFinalize(){
|
|
while (ObjEnemy_GetInfo(objEnemy, INFO_LIFE) > 0) { yield; }
|
|
Obj_Delete(objEnemy);
|
|
wait(120);
|
|
CloseScript(GetOwnScriptID());
|
|
} |