【直播】我要做一个玩游戏自动机
ready方法调用了GameControl.revise(selfInfo);
我目前还不能识别出距离以及计算力度角度,
写死了45度 50力度。
先看看能不能跑一个流程再说
我目前还不能识别出距离以及计算力度角度,
写死了45度 50力度。
先看看能不能跑一个流程再说
GameControl的当前代码:
public class GameControl {
static Robot robot;
static {
try {
robot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
}
public static void revise(SelfInfo selfInfo) {
int count = selfInfo.getAngle() - 45;
if (count > 0) {
//up count次
while (count-- > 0) {
robot.keyPress(KeyEvent.VK_UP);
robot.keyRelease(KeyEvent.VK_UP);
}
} else {
//down count次
while (count++ < 0) {
robot.keyPress(KeyEvent.VK_DOWN);
robot.keyRelease(KeyEvent.VK_DOWN);
}
}
selfInfo.setAngle(45);
selfInfo.setPower(50);
}
public static void keyPressSpace(){
robot.keyPress(KeyEvent.VK_SPACE);
}
public static void keyReleaseSpace(){
robot.keyRelease(KeyEvent.VK_SPACE);
}
}
public class GameControl {
static Robot robot;
static {
try {
robot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
}
public static void revise(SelfInfo selfInfo) {
int count = selfInfo.getAngle() - 45;
if (count > 0) {
//up count次
while (count-- > 0) {
robot.keyPress(KeyEvent.VK_UP);
robot.keyRelease(KeyEvent.VK_UP);
}
} else {
//down count次
while (count++ < 0) {
robot.keyPress(KeyEvent.VK_DOWN);
robot.keyRelease(KeyEvent.VK_DOWN);
}
}
selfInfo.setAngle(45);
selfInfo.setPower(50);
}
public static void keyPressSpace(){
robot.keyPress(KeyEvent.VK_SPACE);
}
public static void keyReleaseSpace(){
robot.keyRelease(KeyEvent.VK_SPACE);
}
}
现在跑完了一个流程。。。
不过角度貌似识别的不对。
READY 之前:READY
角度:18
PRE_SHOOT 之前:READY
fromReadyToPreShootOnPreShoot
之后状态:PRE_SHOOT
SHOOT 之前:PRE_SHOOT
fromPreShootToShootingOnShoot
之后状态:SHOOTING
SHOOT_DONE 之前:SHOOTING
fromShootingToSufShootOnShootDone
之后状态:SUF_SHOOT
之后状态:READY
角度:-4
SelfInfo{angle=-4, power=null, width=null, height=null}
0
READY 之前:READY
角度:-4
PRE_SHOOT 之前:READY
fromReadyToPreShootOnPreShoot
之后状态:PRE_SHOOT
SHOOT 之前:PRE_SHOOT
fromPreShootToShootingOnShoot
之后状态:SHOOTING
SHOOT_DONE 之前:SHOOTING
fromShootingToSufShootOnShootDone
之后状态:SUF_SHOOT
之后状态:READY
角度:-10
SelfInfo{angle=-10, power=null, width=null, height=null}
60
READY 之前:READY
角度:-10
PRE_SHOOT 之前:READY
fromReadyToPreShootOnPreShoot
之后状态:PRE_SHOOT
SHOOT 之前:PRE_SHOOT
fromPreShootToShootingOnShoot
之后状态:SHOOTING
SHOOT_DONE 之前:SHOOTING
fromShootingToSufShootOnShootDone
之后状态:SUF_SHOOT
之后状态:READY
角度:-10
SelfInfo{angle=-10, power=null, width=null, height=null}
60
READY 之前:READY
角度:-10
PRE_SHOOT 之前:READY
fromReadyToPreShootOnPreShoot
之后状态:PRE_SHOOT
SHOOT 之前:PRE_SHOOT
fromPreShootToShootingOnShoot
之后状态:SHOOTING
不过角度貌似识别的不对。
READY 之前:READY
角度:18
PRE_SHOOT 之前:READY
fromReadyToPreShootOnPreShoot
之后状态:PRE_SHOOT
SHOOT 之前:PRE_SHOOT
fromPreShootToShootingOnShoot
之后状态:SHOOTING
SHOOT_DONE 之前:SHOOTING
fromShootingToSufShootOnShootDone
之后状态:SUF_SHOOT
之后状态:READY
角度:-4
SelfInfo{angle=-4, power=null, width=null, height=null}
0
READY 之前:READY
角度:-4
PRE_SHOOT 之前:READY
fromReadyToPreShootOnPreShoot
之后状态:PRE_SHOOT
SHOOT 之前:PRE_SHOOT
fromPreShootToShootingOnShoot
之后状态:SHOOTING
SHOOT_DONE 之前:SHOOTING
fromShootingToSufShootOnShootDone
之后状态:SUF_SHOOT
之后状态:READY
角度:-10
SelfInfo{angle=-10, power=null, width=null, height=null}
60
READY 之前:READY
角度:-10
PRE_SHOOT 之前:READY
fromReadyToPreShootOnPreShoot
之后状态:PRE_SHOOT
SHOOT 之前:PRE_SHOOT
fromPreShootToShootingOnShoot
之后状态:SHOOTING
SHOOT_DONE 之前:SHOOTING
fromShootingToSufShootOnShootDone
之后状态:SUF_SHOOT
之后状态:READY
角度:-10
SelfInfo{angle=-10, power=null, width=null, height=null}
60
READY 之前:READY
角度:-10
PRE_SHOOT 之前:READY
fromReadyToPreShootOnPreShoot
之后状态:PRE_SHOOT
SHOOT 之前:PRE_SHOOT
fromPreShootToShootingOnShoot
之后状态:SHOOTING
现在距离应该是能算出来了,不过还没测。
但是计算……这个公式我TMD忘了,不会算了。
水平距离S = Vx * t
垂直距离怎么算来着。。。
但是计算……这个公式我TMD忘了,不会算了。
水平距离S = Vx * t
垂直距离怎么算来着。。。
水平距离S = Vx * t ,S 已知
竖直距离H = 1/2(Vy * t1 - Vy * g * t1)
t = 2 * t0 + t1
Vy = g * t0
应该能推导出来吧
竖直距离H = 1/2(Vy * t1 - Vy * g * t1)
t = 2 * t0 + t1
Vy = g * t0
应该能推导出来吧
我好牛逼,我算出来了。
不知道算的对不对,不管了。
去测试一把。
double radian = selfInfo.getAngle() * 2 * Math.PI / 360;
double tan = Math.tan(radian);
double up = distanceInfo.getWidth() * (1 - WorldInfo.getGravity()) * tan - 2 * distanceInfo.getHeight();
double down = (2 / WorldInfo.getGravity() - 2) * tan * tan;
double v = Math.sqrt(up / down * (1 + tan * tan));
不知道算的对不对,不管了。
去测试一把。
double radian = selfInfo.getAngle() * 2 * Math.PI / 360;
double tan = Math.tan(radian);
double up = distanceInfo.getWidth() * (1 - WorldInfo.getGravity()) * tan - 2 * distanceInfo.getHeight();
double down = (2 / WorldInfo.getGravity() - 2) * tan * tan;
double v = Math.sqrt(up / down * (1 + tan * tan));
这个公式当H=0时,会退化成一个水平面上的情况,
公式变为Vx = 根号(S* g / 2tan(a) )
和按水平面直接计算的公式得到的结果相同,
S = Vx * t
Vy = g * 1/2t
Vy = tan(a) * Vx
也得到Vx = 根号(S* g / 2tan(a) )
所以我觉得这次计算的是对的
公式变为Vx = 根号(S* g / 2tan(a) )
和按水平面直接计算的公式得到的结果相同,
S = Vx * t
Vy = g * 1/2t
Vy = tan(a) * Vx
也得到Vx = 根号(S* g / 2tan(a) )
所以我觉得这次计算的是对的
刚才用新公式打了一下,打的还不是太准,不过已经打死了一个悲剧的10级小菜。
READY高度105
宽度255
角度:15
速度44.02430361971539
revise
DistanceInfo{width=95, height=1, red=Point{h=72, w=87}, blue=Point{h=73, w=182}}
SelfInfo{angle=15, power=44, leftOrRight=null}
PRE_SHOOTfromReadyToPreShootOnPreShoot
SHOOTfromPreShootToShootingOnShoot
SHOOT_DONEfromShootingToSufShootOnShootDone
READY角度:23
速度36.24277795351789
revise
DistanceInfo{width=94, height=1, red=Point{h=75, w=87}, blue=Point{h=76, w=181}}
SelfInfo{angle=23, power=36, leftOrRight=null}
PRE_SHOOTfromReadyToPreShootOnPreShoot
SHOOTfromPreShootToShootingOnShoot
SHOOT_DONEfromShootingToSufShootOnShootDone
READY角度:38
速度27.915201295606305
revise
DistanceInfo{width=65, height=8, red=Point{h=75, w=87}, blue=Point{h=83, w=152}}
SelfInfo{angle=38, power=27, leftOrRight=null}
PRE_SHOOTfromReadyToPreShootOnPreShoot
SHOOTfromPreShootToShootingOnShoot
SHOOT_DONEfromShootingToSufShootOnShootDone
READY高度105
宽度255
角度:15
速度44.02430361971539
revise
DistanceInfo{width=95, height=1, red=Point{h=72, w=87}, blue=Point{h=73, w=182}}
SelfInfo{angle=15, power=44, leftOrRight=null}
PRE_SHOOTfromReadyToPreShootOnPreShoot
SHOOTfromPreShootToShootingOnShoot
SHOOT_DONEfromShootingToSufShootOnShootDone
READY角度:23
速度36.24277795351789
revise
DistanceInfo{width=94, height=1, red=Point{h=75, w=87}, blue=Point{h=76, w=181}}
SelfInfo{angle=23, power=36, leftOrRight=null}
PRE_SHOOTfromReadyToPreShootOnPreShoot
SHOOTfromPreShootToShootingOnShoot
SHOOT_DONEfromShootingToSufShootOnShootDone
READY角度:38
速度27.915201295606305
revise
DistanceInfo{width=65, height=8, red=Point{h=75, w=87}, blue=Point{h=83, w=152}}
SelfInfo{angle=38, power=27, leftOrRight=null}
PRE_SHOOTfromReadyToPreShootOnPreShoot
SHOOTfromPreShootToShootingOnShoot
SHOOT_DONEfromShootingToSufShootOnShootDone
这个公式是下面5个公式推导出来的:
S = Vx * t
H = Vy*t1 + 1/2 * g * t1*t1
t = 2*t0 + t1
Vy = tan(a) * Vx
Vy = g * t0
待求的是V,就是Vx / cos(a),也等于根号(Vx*Vx + Vy*Vy)
其中S是两个玩家的水平距离,H是竖直距离
Vy是大炮分解到y轴的速度,Vx是分解到x轴的速度
g是重力加速度
t是开炮到落地总时间
t0是从开炮到最高点的时间
t1是炮弹落到水平线开始,击中敌人结束的时间
S = Vx * t
H = Vy*t1 + 1/2 * g * t1*t1
t = 2*t0 + t1
Vy = tan(a) * Vx
Vy = g * t0
待求的是V,就是Vx / cos(a),也等于根号(Vx*Vx + Vy*Vy)
其中S是两个玩家的水平距离,H是竖直距离
Vy是大炮分解到y轴的速度,Vx是分解到x轴的速度
g是重力加速度
t是开炮到落地总时间
t0是从开炮到最高点的时间
t1是炮弹落到水平线开始,击中敌人结束的时间