This site requires JavaScript, please enable it in your browser!
Greenfoot back
Neymar.Jr
Neymar.Jr wrote ...

2014/4/13

Not sure how to make delays for shooting bullets

Neymar.Jr Neymar.Jr

2014/4/13

#
I am wanting to make my bullets shoot like every 3 seconds.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Here's My Bullet Code
 
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
 
/**
 * Write a description of class Bullet here.
 *
 * @author (your name)
 * @version (a version number or a date)
 */
 
public class Bullet extends Mover
{
 
    private int direction, speed;
     
       private int timeTillCanFire;
 
    
 
    public Bullet(int dir)
    {
        direction = dir;
        speed = 18;
    }
 
    public void act()
    {
        setRotation(360);
        move(1);
        setLocation(getX() + speed, getY()); 
        checkBoundary();
 
 
    }
 
    public Bullet()
    {
        setVelocity(10); //velocity is 10
        setRotation(270);
 
    }
 
    public void checkBoundary()
    {
        if (getWorld() != null && getX() <= -10) //if lazer leaves screen
        {
            getWorld().removeObject(this); //remove self
        }
        if (getWorld() != null && getX() <= +10) //if lazer leaves screen
        {
            getWorld().removeObject(this); //remove self
        }
        if (getWorld() != null && getY() <= +10) //if lazer leaves screen
        {
            getWorld().removeObject(this); //remove self
        }
        if (getWorld() != null && getY() <= -10) //if lazer leaves screen
        {
            getWorld().removeObject(this); //remove self
        }
    }
    //"destroyEnemies()" destroys enemies.
    
     
    //"destroyEnemies()" destroys enemies.
    
    public static void delay(int time)
    {
        time = 3;
    }
 
}
 
 
and here's my player code for the bullets
 
 public void act()
{
 if (Greenfoot.isKeyDown("space"))
        {
            getWorld().addObject(new Bullet(getRotation()), getX(), getY());
        }
}
erdelf erdelf

2014/4/13

#
well, one way would be to add a double in the player class and write the act method like this
1
2
3
4
5
6
7
8
9
private double lastShot
 public void act() 
{  
        if (Greenfoot.isKeyDown("space") && System.currentTimeMillis()>lastShot+3000
        
            getWorld().addObject(new Bullet(getRotation()), getX(), getY()); 
            lastShot = System.currentTimeMillis();
        
}
oh and btw. use seperate code tags for different class codes on the site
Neymar.Jr Neymar.Jr

2014/4/14

#
Thank you erdelf, it works perfectly. Now I'm trying to give enemy health but i have no idea how.
erdelf erdelf

2014/4/14

#
to add health, give the enemies an integer with the name health, and if the bullet hits them, a specific amount of the health is subtracted. if it reaches zero, the enemy should disappear
Neymar.Jr Neymar.Jr

2014/4/14

#
Could you write down the code here
davmac davmac

2014/4/14

#
Just one thing:
well, one way would be to add a double in the player class
Why a double? A 'long' is what you want here.
erdelf erdelf

2014/4/14

#
@davmac, i always use a double there and it works, as far as i can remember a long should work too, but thats his decision @Neymar.Jr, well, declare the integer health
1
private int health;
in the constructor of the enemy class set it to a specific number
1
2
3
4
public Enemy()
{
     this.health = 100;
}
and in the act something like this
1
2
3
4
5
6
7
8
9
10
11
12
public void act()
{
    if(getOneIntersectingObject(Bullet.class)!=null)
    {
        getWorld().removeObject((Actor)getOneIntersectingObject(Bullet.class));
        this.health -= 10;
    }
    if(this.health <=0)
    {
         getWorld().removeObject(this);
    }
}
this should work i think
danpost danpost

2014/4/14

#
@erdelf, anything that is done more than once, that does not have to be, should be avoided. You can avoid using 'getOneIntersectingObject(Bullet.class)' twice by creating a local variable to hold the bullet object found. Also, it will already be cast as an Actor object, so the '(Actor)' typecasting is not needed. Secondly, you only need to check to see if 'health' is equal to or less than zero when the value is decreased; so, putting the second 'if' block at the end and inside the first one is recommended (right after the value is decreased). My revised coding would be the following:
1
2
3
4
5
6
7
8
9
public void act()
{
    Actor bullet = getOneIntersectingObject(Bullet.class);
    if (bullet != null)
    {
        getWorld().removeObject(bullet);
        if ((health -= 10) <= 0) getWorld().removeObject(this);
    }
}
erdelf erdelf

2014/4/14

#
@danpost, i wasnt sure how if the typecast was needed or not and i know the local variable stuff, i am sorry that i didnt use it
danpost danpost

2014/4/14

#
@erdelf, no need to be sorry. It was just FYI, mostly.
davmac davmac

2014/4/14

#
@davmac, i always use a double there and it works, as far as i can remember a long should work too, but thats his decision
Well, System.currentTimeMillis() returns a long not a double, furthermore, a double does not have enough precision to represent all possible long values. Finally, using a long is more efficient because it avoids the need for conversion between long and double.
You need to login to post a reply.