View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

# 2D Aiming accuracy

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

1 reply to this topic

### #1Thorion  Members

Posted 31 January 2012 - 12:22 AM

Hello,

I am making a 2D top down shooter and am struggling with aimed shots by enemies. At the moment it works OK but it's not very accurate. Here is my code: (startX,startY,playerX,playerY are class variables). Can anybody help me make this more accurate? Math's isn't my best subject!

private void aimShot() {
this.setLaserX(startX);
this.setLaserY(startY);

float distanceX = startX - playerX;
float distanceY = startY - playerY;

boolean xIsNegative = false;
boolean yIsNegative = false;

if (distanceX < 0) {
xIsNegative = true;
distanceX = -distanceX;
}

if (distanceY < 0) {
yIsNegative = true;
distanceY = -distanceY;
}

if (distanceX == 0) {
distanceX = 1;
}

if (distanceY == 0) {
distanceY = 1;
}

float ratio;
float speedX, speedY;

if (distanceX > distanceY) {
ratio = distanceY/distanceX;
speedX = 10*(1-ratio);
speedY = 10*ratio;
} else {
ratio = distanceX/distanceY;
speedY = 10*ratio;
speedX = 10*(1-ratio);
}

if (xIsNegative) {
speedX = -speedX;
}

if (yIsNegative) {
speedY = -speedY;
}

intSpeedX = Math.round(speedX);
intSpeedY = Math.round(speedY);

}

### #2Thorion  Members

Posted 02 February 2012 - 08:07 AM

I managed to fix it myself. One thing I did was store X and Y coordinates as floats and only rounded off when actually drawing. My code needed some improvement too, here's what it looks like now:
private void aimShot() {

float distanceX = this.fX - this.paX;
float distanceY = this.fY - this.paY;

boolean xIsNegative = false;
boolean yIsNegative = false;

if (distanceX < 0) {
xIsNegative = true;
distanceX = -distanceX;
}

if (distanceY < 0) {
yIsNegative = true;
distanceY = -distanceY;
}

if (distanceX == 0) {
distanceX = 1;
}

if (distanceY == 0) {
distanceY = 1;
}

float ratio = distanceX / distanceY;

this.speedY = 10 / (ratio + 1);
this.speedX = ratio * this.speedY;

if (xIsNegative) {
this.speedX = -this.speedX;
}

if (yIsNegative) {
this.speedY = -this.speedY;
}
}

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.