Maidens of the Kaleidoscope
~Hakurei Shrine~ => Rika and Nitori's Garage Experiments => Topic started by: KomeijiKoishi on June 24, 2009, 07:24:51 PM
-
Question's like this:
How do I make orbitals move around an orbital?
-
An attack of the boss battle I am working on does just that. :V
First, craete six global variables. Let's call them cx, cy, rad1 phase1, rad2 and phase2.
Those are the center coordinates of the inner circle and the radii and phases of the two circles.
First make sure the phase variables are increased every frame in the main loop.
Second, create an object bullets that uses the following command inside its loop:
Obj_SetPosition(obj, cx+rad1*cos(phase1)+rad2*cos(phase2), cy+rad1*sin(phase1)+rad2*sin(phase2));
-
Epicycloid:
The circle with radius r spins on the outside of a circle with radius R. The point is on the circle r.#TouhouDanmakufu
#Title[Epicycloid]
#BackGround[User(.\PIC\black.png, 1, 1)]
#Player[FREE]
#ScriptVersion[2]
script_enemy_main {
let R = 70;
let r = 40;
let a = 0;
@Initialize {
SetLife(2000);
SetTimer(40);
SetMovePosition02(GetCenterX, GetCenterY-70, 20);
rose;
}
@MainLoop {
SetCollisionB(GetX, GetY, 24);
yield;
}
@DrawLoop {
}
@Finalize {
}
task rose{
loop(100){yield;}
while(a>-1){
newpoint;
a+=3;
yield;
}
}
task newpoint{
let obj = Obj_Create(OBJ_SHOT);
Obj_SetX(obj, GetEnemyX + ((R + r) * cos(a)) - (r * cos(a * ((R / r) +1))));
Obj_SetY(obj, GetEnemyY + ((R + r) * sin(a)) - (r * sin(a * ((R / r) + 1))));
Obj_SetSpeed(obj, 0);
Obj_SetAngle(obj, a);
ObjShot_SetGraphic(obj, RED01);
ObjShot_SetDelay (obj, 3);
while(Obj_BeDeleted(obj)==false) {
yield;
}
}
}
Epitrochoid:
The circle with radius r spins on the outside of a circle with radius R. The point is d away from the circle r.#TouhouDanmakufu
#Title[Epitrocoid]
#BackGround[User(.\PIC\black.png, 1, 1)]
#Player[FREE]
#ScriptVersion[2]
script_enemy_main {
let R = 60;
let r = 40;
let d = 30;
let a = 0;
@Initialize {
SetLife(2000);
SetTimer(40);
SetMovePosition02(GetCenterX, GetCenterY-70, 20);
rose;
}
@MainLoop {
SetCollisionB(GetX, GetY, 24);
yield;
}
@DrawLoop {
}
@Finalize {
}
task rose{
loop(100){yield;}
while(a>-1){
newpoint;
a+=3;
yield;
}
}
task newpoint{
let obj = Obj_Create(OBJ_SHOT);
Obj_SetX(obj, GetEnemyX + ((R + r) * cos(a)) - (d * cos(a * ((R + r) / r))));
Obj_SetY(obj, GetEnemyY + ((R + r) * sin(a)) - (d * sin(a * ((R + r) / r))));
Obj_SetSpeed(obj, 0);
Obj_SetAngle(obj, a);
ObjShot_SetGraphic(obj, RED01);
ObjShot_SetDelay (obj, 3);
while(Obj_BeDeleted(obj)==false) {
yield;
}
}
}
Hypocycloid:
The circle with radius r spins on the inside of a circle with radius R. The point is on the circle r.#TouhouDanmakufu
#Title[Hypocycloid]
#BackGround[User(.\PIC\black.png, 1, 1)]
#Player[FREE]
#ScriptVersion[2]
script_enemy_main {
let R = 150;
let r = 20;
let a = 0;
@Initialize {
SetLife(2000);
SetTimer(40);
SetMovePosition02(GetCenterX, GetCenterY-70, 20);
rose;
}
@MainLoop {
SetCollisionB(GetX, GetY, 24);
yield;
}
@DrawLoop {
}
@Finalize {
}
task rose{
loop(100){yield;}
while(a>-1){
newpoint;
a+=3;
yield;
}
}
task newpoint{
let obj = Obj_Create(OBJ_SHOT);
Obj_SetX(obj, GetEnemyX + ((R - r) * cos(a)) + (r * cos(a * ((R - r) / r))));
Obj_SetY(obj, GetEnemyY + ((R - r) * sin(a)) - (r * sin(a * ((R - r) / r))));
Obj_SetSpeed(obj, 0);
Obj_SetAngle(obj, a);
ObjShot_SetGraphic(obj, RED01);
ObjShot_SetDelay (obj, 3);
while(Obj_BeDeleted(obj)==false) {
yield;
}
}
}
Hypotrochoid:
The circle with radius r spins on the inside of a circle with radius R. The point is d away from the circle r.#TouhouDanmakufu
#Title[Hypotrochoid]
#BackGround[User(.\PIC\black.png, 1, 1)]
#Player[FREE]
#ScriptVersion[2]
script_enemy_main {
let R = 150;
let r = 50;
let d = 60;
let a = 0;
@Initialize {
SetLife(2000);
SetTimer(40);
SetMovePosition02(GetCenterX, GetCenterY-70, 20);
rose;
}
@MainLoop {
SetCollisionB(GetX, GetY, 24);
yield;
}
@DrawLoop {
}
@Finalize {
}
task rose{
loop(100){yield;}
while(a>-1){
newpoint;
a+=3;
yield;
}
}
task newpoint{
let obj = Obj_Create(OBJ_SHOT);
Obj_SetX(obj, GetEnemyX + ((R - r) * cos(a)) + (d * cos(a * ((R - r) / r))));
Obj_SetY(obj, GetEnemyY + ((R - r) * sin(a)) - (d * sin(a * ((R - r) / r))));
Obj_SetSpeed(obj, 0);
Obj_SetAngle(obj, a);
ObjShot_SetGraphic(obj, RED01);
ObjShot_SetDelay (obj, 3);
while(Obj_BeDeleted(obj)==false) {
yield;
}
}
}
I ♥ complex curves.
-
while(a>-1){} == loop{}
:V
Lovely patterns you've constructed, now make a boss fight out of 'em!
Also, nice #BackGround.
-
by the way I stole that background from you
It's just a base demonstration so that you can add onto it. In even just the little I provided you can create complex patterns just by editing SetSpeed, SetAngle and the three base circle values.
For example, Virtue of Wind God is just three epicycloids on top of each other with a bunch of moderate editing.
EDIT: I did that just to spite you by the way. It's excellent.
-
A bunch of moderate editing.... I did remake it y'know. You're right though, took me about 5 hours, so it isn't hard once you know the math (plus a little guess and check).
EDIT: I love you Drake <3
And...
#TouhouDanmakufu
#Title[Epicycloid]
#BackGround[User(.\PIC\black.png, 1, 1)]
#Player[FREE]
#ScriptVersion[2]
script_enemy_main {
let R = 70;
let r = 40;
let v = 2;
let a = 0;
@Initialize {
SetLife(2000);
SetTimer(40);
SetMovePosition02(GetCenterX, GetCenterY-100, 20);
}
@MainLoop {
SetCollisionB(GetX, GetY, 24);
CreateShotA(0, GetX + ((R + r) * cos(a)) - (r * cos(a * ((R / r) +1))), GetY + ((R + r) * sin(a)) - (r * sin(a * ((R / r) + 1))), 20);
SetShotDataA(0, 0, 0, a*2, 0, 0, 0, RED01);
SetShotDataA(0, 90, 0, a*2, 0, 0.05, v, RED01);
FireShot(0);
a+=3;
CreateShotA(0, GetX + ((R + r) * cos(a)) - (r * cos(a * ((R / r) +1))), GetY + ((R + r) * sin(a)) - (r * sin(a * ((R / r) + 1))), 20);
SetShotDataA(0, 0, 0, a*2, 0, 0, 0, RED01);
SetShotDataA(0, 90, 0, a*2, 0, 0.05, v, RED01);
FireShot(0);
a+=3;
v+=0.001;
}
}
Or even....
#TouhouDanmakufu
#Title[Epicycloid]
#BackGround[User(.\PIC\black.png, 1, 1)]
#Player[FREE]
#ScriptVersion[2]
script_enemy_main {
let R = 70;
let r = 40;
let v = 2;
let a = 0;
@Initialize {
SetLife(2000);
SetTimer(40);
SetMovePosition02(GetCenterX, GetCenterY-100, 20);
}
@MainLoop {
SetCollisionB(GetX, GetY, 24);
CreateShotA(0, GetX + ((R + r) * cos(a)) - (r * cos(a * ((R / r) +1))), GetY + ((R + r) * sin(a)) - (r * sin(a * ((R / r) + 1))), 20);
SetShotDataA(0, 0, 0, a*2, 0, 0, 0, RED01);
SetShotDataA(0, 90, 0, a*2, 0, 0.05, v, RED01);
FireShot(0);
a+=2;
CreateShotA(0, GetX + ((R + r) * cos(-a)) - (r * cos(-a * ((R / r) +1))), GetY + ((R + r) * sin(-a)) - (r * sin(-a * ((R / r) + 1))), 20);
SetShotDataA(0, 0, 0, -a*2, 0, 0, 0, RED01);
SetShotDataA(0, 90, 0, -a*2, 0, 0.05, v, RED01);
FireShot(0);
a+=2;
v+=0.001;
}
}
Okay last one I swear....
#TouhouDanmakufu
#Title[Hypotrochoid]
#BackGround[User(.\PIC\black.png, 1, 1)]
#Player[FREE]
#ScriptVersion[2]
script_enemy_main {
let R = 150;
let r = 50;
let d = 60;
let a = 0;
@Initialize {
SetLife(2000);
SetTimer(40);
SetMovePosition02(GetCenterX, GetCenterY-70, 20);
rose;
}
@MainLoop {
SetCollisionB(GetX, GetY, 24);
yield;
}
@DrawLoop {
}
@Finalize {
}
task rose{
loop(100){yield;}
loop{
newpoint(0, RED01);
newpoint(120, GREEN01);
newpoint(240, BLUE01);
a+=3;
yield;yield;
}
}
task newpoint(aaa, ccc){
let getxa;
let getya;
let anglereflex;
let reflectcount = 0;
let objshot = Obj_Create(OBJ_SHOT);
Obj_SetX(objshot, GetX + ((R - r) * cos(a + aaa)) + (d * cos(a * ((R - r) / r + aaa))));
Obj_SetY(objshot, GetY + ((R - r) * sin(a + aaa)) - (d * sin(a * ((R - r) / r + aaa))));
Obj_SetSpeed(objshot, 0);
Obj_SetAngle(objshot, (a + aaa)*2);
ObjShot_SetGraphic(objshot, ccc);
ObjShot_SetDelay (objshot, 40);
let ff = -60;
let ll = 0;
while(!Obj_BeDeleted(objshot)){
ff++;
if(ff<=120 && ff>=70){
Obj_SetSpeed(objshot, ll);
ll+=0.02;
}
getxa = Obj_GetX(objshot);
getya = Obj_GetY(objshot);
if(getxa < GetClipMinX && reflectcount == 0){
anglereflex = -Obj_GetAngle(objshot)+180;
let position = GetClipMinX - Obj_GetX(objshot);
Obj_SetX(objshot, GetClipMinX + position);
Obj_SetAngle(objshot, anglereflex);
reflectcount = 5;}
if(getxa > GetClipMaxX && reflectcount == 0){
anglereflex = -Obj_GetAngle(objshot)+180;
let position = GetClipMaxX - Obj_GetX(objshot);
Obj_SetX(objshot, GetClipMaxX + position);
Obj_SetAngle(objshot, anglereflex);
reflectcount = 5;}
if((getya < GetClipMinY) && reflectcount == 0){
anglereflex = -Obj_GetAngle(objshot);
let position = GetClipMinY - Obj_GetY(objshot);
Obj_SetY(objshot, GetClipMinY + position);
Obj_SetAngle(objshot, anglereflex);
reflectcount = 5;}
yield;
}
}
}
-
You guys rock ಥ_ಥ
Now I take your math and raise you a BROFIST: http://www.mediafire.com/?ghjom2z2wyc
-
You know you can change R, r and d and get different results, right?
-
But that involves more than holding down ctrl, c and v.