add movers
This commit is contained in:
parent
632c8a7fcf
commit
0a3e7b0e09
93
src/yugecin/opsudance/movers/CircleMover.java
Normal file
93
src/yugecin/opsudance/movers/CircleMover.java
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
/*
|
||||||
|
* opsu!dance - fork of opsu! with cursordance auto
|
||||||
|
* Copyright (C) 2016 yugecin
|
||||||
|
*
|
||||||
|
* opsu!dance is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* opsu! is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with opsu!dance. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package yugecin.opsudance.movers;
|
||||||
|
|
||||||
|
import itdelatrisu.opsu.Container;
|
||||||
|
import itdelatrisu.opsu.Utils;
|
||||||
|
import itdelatrisu.opsu.objects.GameObject;
|
||||||
|
|
||||||
|
public class CircleMover extends Mover {
|
||||||
|
|
||||||
|
private double radius;
|
||||||
|
private double SOME_CONSTANT;
|
||||||
|
private double middlexoffset;
|
||||||
|
private double middleyoffset;
|
||||||
|
private double ang;
|
||||||
|
|
||||||
|
public CircleMover(GameObject start, GameObject end, int dir) {
|
||||||
|
super(start, end, dir);
|
||||||
|
if (startX - endX == 0 && startY - endY == 0) {
|
||||||
|
int quadr = Utils.getQuadrant(startX, startY);
|
||||||
|
switch (quadr) {
|
||||||
|
case 1: ang = 135d / 180d * Math.PI; break;
|
||||||
|
case 2: ang = 45d / 180d * Math.PI; break;
|
||||||
|
case 3: ang = -45d / 180d * Math.PI; break;
|
||||||
|
case 4: ang = -135d / 180d * Math.PI; break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ang = Math.atan2(startY - endY, startX - endX);
|
||||||
|
}
|
||||||
|
SOME_CONSTANT = dir * 2d * Math.PI;
|
||||||
|
// TODO: circle into slider?
|
||||||
|
radius = end.getTime() - start.getEndTime();
|
||||||
|
if (start.isSpinner() || end.isSpinner()) {
|
||||||
|
middlexoffset = -Math.cos(ang) * radius;
|
||||||
|
middleyoffset = -Math.sin(ang) * radius;
|
||||||
|
} else {
|
||||||
|
calcMaxRadius();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void calcMaxRadius() {
|
||||||
|
double[] pos = new double[2];
|
||||||
|
for (int tries = 0; tries < 7; tries++) {
|
||||||
|
middlexoffset = -Math.cos(ang) * radius;
|
||||||
|
middleyoffset = -Math.sin(ang) * radius;
|
||||||
|
boolean pass = true;
|
||||||
|
for (double t = 0d; t < 1d; t += 0.1d) {
|
||||||
|
double a = ang + SOME_CONSTANT * t;
|
||||||
|
pos[0] = (startX + (endX - startX) * t) - middlexoffset - Math.cos(a) * radius;
|
||||||
|
pos[1] = (startY + (endY - startY) * t) - middleyoffset - Math.sin(a) * radius;
|
||||||
|
if (pos[0] < 0 || Container.width < pos[0] || pos[1] < 0 || Container.height < pos[1]) {
|
||||||
|
pass = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pass) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
radius *= 0.8d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double[] getPointAt(int time) {
|
||||||
|
double t = getT(time);
|
||||||
|
double ang = this.ang + SOME_CONSTANT * t;
|
||||||
|
return new double[] {
|
||||||
|
(startX + (endX - startX) * t) - middlexoffset - Math.cos(ang) * radius,
|
||||||
|
(startY + (endY - startY) * t) - middleyoffset - Math.sin(ang) * radius
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "Circle";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
52
src/yugecin/opsudance/movers/HalfCircleMover.java
Normal file
52
src/yugecin/opsudance/movers/HalfCircleMover.java
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* opsu!dance - fork of opsu! with cursordance auto
|
||||||
|
* Copyright (C) 2016 yugecin
|
||||||
|
*
|
||||||
|
* opsu!dance is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* opsu! is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with opsu!dance. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package yugecin.opsudance.movers;
|
||||||
|
|
||||||
|
import itdelatrisu.opsu.Utils;
|
||||||
|
import itdelatrisu.opsu.objects.GameObject;
|
||||||
|
|
||||||
|
public class HalfCircleMover extends Mover {
|
||||||
|
|
||||||
|
private double middlex;
|
||||||
|
private double middley;
|
||||||
|
private double radius;
|
||||||
|
private double ang;
|
||||||
|
|
||||||
|
public HalfCircleMover(GameObject start, GameObject end, int dir) {
|
||||||
|
super(start, end, dir);
|
||||||
|
middlex = (startX + endX) / 2d;
|
||||||
|
middley = (startY + endY) / 2d;
|
||||||
|
radius = Utils.distance(middlex, middley, startX, startY);
|
||||||
|
ang = Math.atan2(startY - middley, startX - middlex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double[] getPointAt(int time) {
|
||||||
|
double ang = this.ang + Math.PI * getT(time) * dir;
|
||||||
|
return new double[] {
|
||||||
|
middlex + Math.cos(ang) * radius,
|
||||||
|
middley + Math.sin(ang) * radius
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "Half circle";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
67
src/yugecin/opsudance/movers/HalfEllipseMover.java
Normal file
67
src/yugecin/opsudance/movers/HalfEllipseMover.java
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* opsu!dance - fork of opsu! with cursordance auto
|
||||||
|
* Copyright (C) 2016 yugecin
|
||||||
|
*
|
||||||
|
* opsu!dance is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* opsu! is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with opsu!dance. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package yugecin.opsudance.movers;
|
||||||
|
|
||||||
|
import itdelatrisu.opsu.Utils;
|
||||||
|
import itdelatrisu.opsu.objects.GameObject;
|
||||||
|
|
||||||
|
public class HalfEllipseMover extends Mover {
|
||||||
|
|
||||||
|
private double middlex;
|
||||||
|
private double middley;
|
||||||
|
private double radius;
|
||||||
|
private double ang;
|
||||||
|
private double mod;
|
||||||
|
|
||||||
|
public HalfEllipseMover(GameObject start, GameObject end, int dir) {
|
||||||
|
super(start, end, dir);
|
||||||
|
middlex = (startX - endX) / 2d;
|
||||||
|
middley = (startY - endY) / 2d;
|
||||||
|
radius = Utils.distance(middlex, middley, startX, startY);
|
||||||
|
ang = Math.atan2(startY - middley, startX - middlex);
|
||||||
|
mod = 2d;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMod(double mod) {
|
||||||
|
this.mod = mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double[] getPointAt(int time) {
|
||||||
|
double Tangle = Math.PI * getT(time) * dir;
|
||||||
|
double x = middlex + Math.cos(Tangle) * radius;
|
||||||
|
double y = middley + Math.sin(Tangle) * radius;
|
||||||
|
double dx = middlex - x;
|
||||||
|
double dy = middley - y;
|
||||||
|
|
||||||
|
double d = Math.sqrt(dx * dx + dy * dy);
|
||||||
|
double a = Math.atan2(dy, dx);
|
||||||
|
double my = a - ang;
|
||||||
|
|
||||||
|
return new double[] {
|
||||||
|
middlex - Math.cos(my) * d,
|
||||||
|
middley - Math.sin(my) * d
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "Half ellipse " + mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
44
src/yugecin/opsudance/movers/JumpMover.java
Normal file
44
src/yugecin/opsudance/movers/JumpMover.java
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* opsu!dance - fork of opsu! with cursordance auto
|
||||||
|
* Copyright (C) 2016 yugecin
|
||||||
|
*
|
||||||
|
* opsu!dance is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* opsu! is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with opsu!dance. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package yugecin.opsudance.movers;
|
||||||
|
|
||||||
|
import itdelatrisu.opsu.objects.GameObject;
|
||||||
|
|
||||||
|
public class JumpMover extends Mover {
|
||||||
|
|
||||||
|
private double[] pos;
|
||||||
|
|
||||||
|
public JumpMover(GameObject start, GameObject end, int dir) {
|
||||||
|
super(start, end, dir);
|
||||||
|
this.pos = new double[] {
|
||||||
|
end.start.x,
|
||||||
|
end.start.y
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double[] getPointAt(int time) {
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "Jump";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
42
src/yugecin/opsudance/movers/LinearMover.java
Normal file
42
src/yugecin/opsudance/movers/LinearMover.java
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* opsu!dance - fork of opsu! with cursordance auto
|
||||||
|
* Copyright (C) 2016 yugecin
|
||||||
|
*
|
||||||
|
* opsu!dance is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* opsu! is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with opsu!dance. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package yugecin.opsudance.movers;
|
||||||
|
|
||||||
|
import itdelatrisu.opsu.objects.GameObject;
|
||||||
|
|
||||||
|
public class LinearMover extends Mover {
|
||||||
|
|
||||||
|
public LinearMover(GameObject start, GameObject end, int dir) {
|
||||||
|
super(start, end, dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double[] getPointAt(int time) {
|
||||||
|
double t = getT(time);
|
||||||
|
return new double[] {
|
||||||
|
startX + (endX - startX) * t,
|
||||||
|
startY + (endY - startY) * t
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "Linear";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
52
src/yugecin/opsudance/movers/Mover.java
Normal file
52
src/yugecin/opsudance/movers/Mover.java
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* opsu!dance - fork of opsu! with cursordance auto
|
||||||
|
* Copyright (C) 2016 yugecin
|
||||||
|
*
|
||||||
|
* opsu!dance is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* opsu! is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with opsu!dance. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package yugecin.opsudance.movers;
|
||||||
|
|
||||||
|
import itdelatrisu.opsu.objects.GameObject;
|
||||||
|
|
||||||
|
public abstract class Mover {
|
||||||
|
|
||||||
|
protected int dir;
|
||||||
|
|
||||||
|
private int startT;
|
||||||
|
private int totalT;
|
||||||
|
|
||||||
|
protected double startX;
|
||||||
|
protected double startY;
|
||||||
|
|
||||||
|
protected double endX;
|
||||||
|
protected double endY;
|
||||||
|
|
||||||
|
public Mover(GameObject start, GameObject end, int dir) {
|
||||||
|
this.dir = dir;
|
||||||
|
this.startX = start.end.x;
|
||||||
|
this.startY = start.end.y;
|
||||||
|
this.endX = end.start.x;
|
||||||
|
this.endY = end.start.y;
|
||||||
|
this.startT = start.getEndTime();
|
||||||
|
this.totalT = end.getTime() - startT;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final double getT(int time) {
|
||||||
|
return (time - startT) / totalT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract double[] getPointAt(int time);
|
||||||
|
public abstract String getName();
|
||||||
|
|
||||||
|
}
|
57
src/yugecin/opsudance/movers/QuartCircleMover.java
Normal file
57
src/yugecin/opsudance/movers/QuartCircleMover.java
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
* opsu!dance - fork of opsu! with cursordance auto
|
||||||
|
* Copyright (C) 2016 yugecin
|
||||||
|
*
|
||||||
|
* opsu!dance is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* opsu! is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with opsu!dance. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package yugecin.opsudance.movers;
|
||||||
|
|
||||||
|
import itdelatrisu.opsu.Utils;
|
||||||
|
import itdelatrisu.opsu.objects.GameObject;
|
||||||
|
|
||||||
|
public class QuartCircleMover extends Mover {
|
||||||
|
|
||||||
|
private double middlex;
|
||||||
|
private double middley;
|
||||||
|
private double radius;
|
||||||
|
private double ang;
|
||||||
|
|
||||||
|
public QuartCircleMover(GameObject start, GameObject end, int dir) {
|
||||||
|
super(start, end, dir);
|
||||||
|
middlex = (startX - endX) / 2d;
|
||||||
|
middley = (startY - endY) / 2d;
|
||||||
|
radius = Utils.distance(middlex, middley, startX, startY);
|
||||||
|
ang = Math.atan2(startY - middley, startX - middlex) + Math.PI / 2d * dir;
|
||||||
|
middlex = middlex + Math.cos(ang) * radius;
|
||||||
|
middley = middley + Math.sin(ang) * radius;
|
||||||
|
radius = Utils.distance(middlex, middley, startX, startY);
|
||||||
|
ang = Math.atan2(startY - middley, startX - middlex);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double[] getPointAt(int time) {
|
||||||
|
double ang = this.ang - Math.PI / 2d * getT(time) * dir;
|
||||||
|
|
||||||
|
return new double[] {
|
||||||
|
middlex + Math.cos(ang) * radius,
|
||||||
|
middlex + Math.sin(ang) * radius
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return "1/4th circle";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user