In my two-player-game, I am currently working on one player just works fine, while the other hits itself with the bullet.
Bullet code:
Entire player-class:
public class Bullet extends Actor
{
boolean justCreated = false;
private int timer = 10;
public Bullet(int dir)
{
setRotation(dir);
justCreated = true;
}
/**
* Act - tut, was auch immer Bullet tun will. Diese Methode wird aufgerufen,
* sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden.
*/
public void act()
{
if(justCreated){
justCreated = false;
Greenfoot.playSound("gun.wav");
move(35);
}
move(8);
if(atWorldEdge())
getWorld().removeObject(this);
}
public boolean atWorldEdge()
{
if(getX() < 10 || getX() > getWorld().getWidth() - 10)
return true;
if(getY() < 10 || getY() > getWorld().getHeight() - 10)
return true;
else
return false;
}
}public class Player extends Actor
{
String leftKey, rightKey, upKey, downKey;
GreenfootImage myImage;
public int myPlayerNum = 0;
int playerNum;
boolean didShoot = false;
public double xVel = 0.0;
public double yVel = 0.0;
public double terminalSpeed = 5.0;
public int counter;
boolean playerContact = false;
double currentForce = 0;
int shotCoolDown = 0;
String shootKey = "o";
public Player(int playerNum, String image, String left, String right, String up, String down)
{
myImage = new GreenfootImage(image);
myPlayerNum = playerNum;
leftKey = left;
rightKey = right;
upKey = up;
downKey = down;
didShoot = false;
myImage.scale(50, 50);
setImage(myImage);
if (playerNum == 0)
{
myImage = new GreenfootImage("tank.png");
rightKey = "right";
leftKey = "left";
upKey = "up";
downKey = "down";
shootKey = "o";
}
else
{
myImage = new GreenfootImage("tank2.png");
rightKey = "d";
leftKey = "a";
upKey = "w";
downKey = "s";
shootKey = "e";
}
myImage.scale(50, 50);
setImage(myImage);
}
/**
* Act - tut, was auch immer Player tun will. Diese Methode wird aufgerufen,
* sobald der 'Act' oder 'Run' Button in der Umgebung angeklickt werden.
*/
public void act()
{
movementEngine();
turnTowardsEnemy();
wallBounce();
calculateForce();
doBulletHit(myPlayerNum);
playerCollider();
shootStuff();
didShoot = false;
}
public void turnTowardsEnemy()
{
if(myPlayerNum == 1) {
turnTowards(BattleWorld.p2X, BattleWorld.p2Y);
}
else {
turnTowards(BattleWorld.p1X, BattleWorld.p1Y);
}
}
public void movementEngine()
{
//int angle = getRotation();
setLocation((int) (getX() + xVel), (int) (getY() + yVel));
if(Greenfoot.isKeyDown(rightKey))
xVel += 0.5;
if(Greenfoot.isKeyDown(leftKey))
xVel -= 0.5;
if(Greenfoot.isKeyDown(upKey))
yVel -= 0.5;
if(Greenfoot.isKeyDown(downKey))
yVel += 0.5;
friction();
terminalVelocity();
}
public void friction()
{
if(xVel >= 0)
xVel -= 0.125;
if(xVel <= 0)
xVel += 0.125;
if(yVel >= 0)
yVel -= 0.125;
if(yVel <= 0)
yVel += 0.125;
}
public void terminalVelocity()
{
if(xVel >= terminalSpeed)
xVel = terminalSpeed;
if(xVel <= -terminalSpeed)
xVel = -terminalSpeed;
if(yVel >= terminalSpeed)
yVel = terminalSpeed;
if(yVel <= -terminalSpeed)
yVel = -terminalSpeed;
}
public void bleed(int particles, int x, int y)
{
for(int a = 0; a < particles; a++) {
bleed(x, y);
}
}
public void bleed(int x, int y)
{
getWorld().addObject(new Particle("blood", ((Greenfoot.getRandomNumber(21)-10)/4.0), ((Greenfoot.getRandomNumber(21)-10)/5.0)), x, y);
}
public boolean atWorldLeft()
{
if(getX() < 20)
return true;
else return false;
}
public boolean atWorldRight()
{
if(getX() > getWorld().getWidth() - 20)
return true;
else return false;
}
public boolean atWorldTop()
{
if(getY() < 20)
return true;
else return false;
}
public boolean atWorldBottom()
{
if(getY() > getWorld().getHeight() - 20)
return true;
else return false;
}
public void bleed()
{
getWorld().addObject(new Particle("blood", ((Greenfoot.getRandomNumber(21)-10)/4.0), ((Greenfoot.getRandomNumber(21)-10)/5.0)), getX(), getY());
}
public void wallBounce()
{
if(atWorldRight()&& xVel > 0) {
xVel *= -1.1;
setLocation((int) (getX() + xVel), (int) (getY() + yVel));
}
if(atWorldLeft()&& xVel < 0) {
xVel *= -1.1;
setLocation((int) (getX() + xVel), (int) (getY() + yVel));
}
if(atWorldTop()&& yVel < 0) {
yVel *= -1.1;
setLocation((int) (getX() + xVel), (int) (getY() + yVel));
}
if(atWorldBottom()&& yVel > 0) {
yVel *= -1.1;
setLocation((int) (getX() + xVel), (int) (getY() + yVel));
}
}
public void calculateForce()
{
currentForce = Math.hypot(Math.abs(xVel), Math.abs(yVel));
}
public void playerCollider()
{
if(isTouching(Player.class)) {
playerContact = true;
Actor oPlayer = (Actor) getOneIntersectingObject(Player.class);
int oPlayerX = oPlayer.getX();
int oPlayerY = oPlayer.getY();
double k = 1.5 * currentForce;
int angle = getRotation();
if (oPlayerX > getX()) {
if(oPlayerY < getY()) {
xVel = (-1) * (k) * Math.cos(Math.toRadians(360-angle));
yVel = (1) * (k) * Math.sin(Math.toRadians(360-angle));
}
else {
xVel = (1) * (k) * Math.cos(Math.toRadians(angle-180));
yVel = (1) * (k) * Math.sin(Math.toRadians(angle-180));
}
}
else {
if(oPlayerY < getY()) {
xVel = (1) * (k) * Math.cos(Math.toRadians(180-angle));
yVel = (-1) * (k) * Math.sin(Math.toRadians(180-angle));
}
else {
xVel = (-1) * (k) * Math.cos(Math.toRadians(angle));
yVel = (-1) * (k) * Math.sin(Math.toRadians(angle));
}
}
}
else {
playerContact = false;
}
}
public void doBulletHit(int playerNum)
{
World myWorld = getWorld();
BattleWorld battleWorld = (BattleWorld)myWorld;
myPlayerNum = playerNum;
if ((playerNum == 1)&& isTouching(Bullet.class) && !(didShoot))
{
Bar bar = battleWorld.getBar(playerNum);
Actor bull = (Actor) getOneIntersectingObject(Bullet.class);
bleed((Greenfoot.getRandomNumber(3)+2), bull.getX(), bull.getY());
getWorld().removeObject(bull);
bar.loseHealth();
if(bar.health <=0)
{
GameOver gameover = new GameOver(myPlayerNum);
myWorld.addObject(gameover, myWorld.getWidth()/2, myWorld.getHeight()/2);
myWorld.removeObject(this);
if (++counter == 100) Greenfoot.setWorld(new TitleScreen());
}
}
}
public void shootStuff()
{
if(Greenfoot.isKeyDown(shootKey) && shotCoolDown == 0) {
getWorld().addObject(new Bullet(getRotation()), getX(), getY());
shotCoolDown = 20;
didShoot = true;
}
if(shotCoolDown > 0)
shotCoolDown -= 1;
}
}
