Domanda

I am basically coding this basic arcade game and i need the circle to shoot out small rectangles that looks like bullets or missiles to hit the bad guys whenever the space bar is hit but i cant figure out how.

Heres my code so far:

   import java.applet.Applet;
   import java.awt.Color;
   import java.awt.Graphics;
   import java.awt.Image;
   import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;

     public class main extends Applet implements Runnable, KeyListener {

private Image i;
private Graphics doubleG;
// x and y are used to set (x,y) positions
// dx and dy are the changes in position
private int x = 850;
private int y = 850;
private int x2 = 100;
private int y2 = 100;
private int dx = 50;
private int radius = 30;
private int dx2 = 4;
private int dy2 = 4;
private int x3 = 100;
private int y3 = 200;
private int dx3 = 5;
private int dy3 = 5;
private int x4 = 100;
private int y4 = 300;
private int dx4 = 3;
private int dy4 = 3;

public void init(){
    setSize(1920,1080);
    setBackground(Color.black);
    addKeyListener(this);
}

public void start(){
    Thread thread = new Thread(this);
    thread.start();

}

public void run() {
    while(true){
        //Enemy
        if(x2 + dx2 > this.getWidth() - radius - 1){
            x2 = this.getWidth() - radius - 1;
            dx2 = -dx2;
        }
        if(x2 + dx2 < 0 + radius){
            x2 =  0 + radius;
            dx2 = -dx2;
        }
        x2 += dx2;
        // Enemy
        if(x3 + dx3 > this.getWidth() - radius - 1){
            x3 = this.getWidth() - radius -1;
            dx3 = -dx3;
        }
        if(x3 + dx3 < 0 + radius){
            x = 0 + radius;
            dx3 = -dx3;
        }
        x3 += dx3;
        // Enemy
        if(x4 + dx4 > this.getWidth() - radius - 1){
            x4= this.getWidth() - radius -1;
            dx4 = -dx4;
        }
        if(x4 + dx4 < 0 + radius){
            x4 = 0 + radius;
            dx4 = -dx4;
        }
        x4 += dx4;
        // EVERYTHING ABOVE KEEPS ASTEROIDS IN THE SCREEN ALLOWING IT TO BOUNCE OFF WALLS
        repaint();
        try{
            Thread.sleep(17);
        } catch (InterruptedException e){
            e.printStackTrace();
        }
    }   
}
public void stop(){

}

public void update(Graphics g){
    // this function stops the flickering problem every time the ball moves by copying the image instead of repainting it
    if(i == null){
        i = createImage(this.getSize().width, this.getSize().height);
        doubleG = i.getGraphics();
    }
    doubleG.setColor(getBackground());
    doubleG.fillRect(0,0,this.getSize().width, this.getSize().height);
    doubleG.setColor(getForeground());
    paint(doubleG);
    g.drawImage(i,0,0,this);
}

public void paint(Graphics g){
    g.setColor(Color.BLUE);
    g.fillOval(x, y, radius*2, radius*2);
    g.setColor(Color.RED);
    g.fillOval(x2, y2, radius + 10, radius + 10);
    g.setColor(Color.RED);
    g.fillOval(x3,y3, radius + 10, radius + 10);
    g.setColor(Color.RED);
    g.fillOval(x4, y4, radius + 10, radius + 10);
}

public void moveRight(){
    if (dx-1 > -20){
        dx += 1;
    }
    if(x + dx > this.getWidth() - radius - 1){
        x = this.getWidth() - radius - 1;
        dx = -dx;
    }
    x += dx;
}

public void moveLeft(){
    if(dx - 1 > -20){
        dx -= 1;
    }
    if(x + dx < 0 + radius){
        x =  0 + radius;
        dx = -dx;
    }
    x -= dx;

}

public void keyPressed(KeyEvent e) {
    // TODO Auto-generated method stub
    switch(e.getKeyCode()){
        case KeyEvent.VK_LEFT:
            moveLeft();
            break;
        case KeyEvent.VK_RIGHT:
            moveRight();
            break;
    }   
}

public void keyReleased(KeyEvent arg0) {
    // TODO Auto-generated method stub

}

public void keyTyped(KeyEvent arg0) {
    // TODO Auto-generated method stub

}

}

È stato utile?

Soluzione

  1. KeyListener will only raise KeyEvents if the component it is registered to is focusable AND has foucs.
  2. You never call super.paint, expect some serious paint artifacts
  3. Avoid overriding paint of top level containers (like Applet)
  4. Consider using Swing based components over AWT, apart from been more update to date and more widely used, Swing components are also double buffered by default. Use a combination of JApplet and JPanel as the main drawing surface, overriding it's paintComponent method. In this case, also consider using a javax.swing.Timer over Thread, unless you want to try and maintain a variable delay between updates. This would also allow you to use the key bindings API overcoming the focus issues related to KeyListener
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top