Java Objekt auf Objekt zu bewegen

RauchenderDachs

Cadet 4th Year
Registriert
Dez. 2012
Beiträge
70
Hi Leute,

ich bins schon wieder ;)
Mein Problem dieses mal ist das ich ein Objekt( Kreis) auf ein anderes Objekt zu bewegen lassen möchte. Hab schon gegoogelt allerdings konnt ich keinen Lösungsanatz umsetzen. Ein weiteres Problem wird denk ich sein das sich Objekt zwei bewegt.
Hier mal mein Quellcode:
Code:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package towerdefencev4;

import javax.swing.*;
import java.awt.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 */
public class GUI extends JFrame implements Runnable{

    /**
     * @param args the command line arguments
     */
    private Image dbImage;
    private Graphics dbGraphics;
    static Creep  dasCreep[] = new Creep[5];
    int verschiebung=25;//abstand zwischen den einzelnen Creeps
    static Tower turm ;
    static Bullet kugel ;
    JButton go = new JButton("go");
    
    public GUI(String title){
        super(title);
       for(int n=0 ;n<dasCreep.length;n++){
        dasCreep[n]= new Creep(40,verschiebung,this);
        verschiebung-=60; 
    }
       turm=new Tower(150,150,this);
    }
    public static void main(final String[] args) {
    final GUI dieOberfläche = new GUI("TowerDefencev4");;
    dieOberfläche.setSize(400, 600);
    dieOberfläche.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    new Thread(dieOberfläche).start();
    dieOberfläche.setVisible(true);
    dieOberfläche.add(new JPanel() {
     
    @Override
    public void paint(final Graphics g) {
    super.paint(g);
    //Hintergrund
    g.drawImage(Toolkit.getDefaultToolkit().getImage("../img/ground.gif"), 0, 0, this);
    //Creep
    for(int n=0 ;n<dasCreep.length;n++){
        dasCreep[n].paintcreep(g);  
    }
    turm.paintTower(g);
    kugel.paintB(g);
    }
    });
    }
     
    @Override
    public void run() {
        while(true){
           for(int n=0;n<dasCreep.length;n++){
                dasCreep[n].move();
                
           }
           //Bullet abfeuern
           kugel= new Bullet(Color.red,0);
           kugel.moveBullet();
           repaint();
            try {
                Thread.sleep(20);
            } catch (InterruptedException ex) {
                Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    public void update(Graphics g)
   {
      //Double-Buffer initialisieren
      if (dbImage == null) {
         dbImage = createImage(
            this.getSize().width,
            this.getSize().height
         );
         dbGraphics = dbImage.getGraphics();
      }
      //Hintergrund löschen
      dbGraphics.setColor(getBackground());
      dbGraphics.fillRect(
         0,
         0,
         this.getSize().width,
         this.getSize().height
       );
      //Vordergrund zeichnen
      dbGraphics.setColor(getForeground());
      paint(dbGraphics);
      //Offscreen anzeigen
      g.drawImage(dbImage,0,0,this);
   }
    
    }
    
    /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package towerdefencev4;

import java.awt.*;
import javax.swing.*;

/**
 *
 */
public class Creep {
    int x, y;
    Component comp;
    boolean perreicht [] = new boolean [5];
    public Creep(int x, int y, Component comp){
        this.x=x;
        this.y=y;
        this.comp=comp;
    }
    public void paintcreep(Graphics gr){
        gr.drawImage(Toolkit.getDefaultToolkit().getImage("../img/creep.gif"), x, y, comp);
    }
    public void move(){
        boolean lr=false;
        boolean hr=false;
        if(x!=40 && perreicht[0]==false || y!=83 && perreicht[0]==false){
            movev(hr);
        }
        if(x==40 && y==83){
            perreicht[0]=true;
        }
        if(perreicht[0]==true && y==83){
            if(x!=237){
                moveh(lr);
            }
        }
        if(x==237 && y==83){
            perreicht[1]=true;
        }
        if(perreicht[1]==true && x==237){
            if(y!=206){
                movev(hr);
            }
        }
        if(x==237 && y==206){
            perreicht[2]=true;
        }
        if(perreicht[2]==true && y==206){
            if(x!=79){
                lr=true;
                moveh(lr);
            }
        }
        if(x==79 && y==206){
            perreicht[3]=true;
        }
        if(perreicht[3]==true){
            if(y!=351){
                movev(hr);
            }
        }
        if(x==79 && y==350){
            perreicht[4]=true;
        }
        if(perreicht[4]==true){
            
        }
    }
    public void moveh(boolean lr){//lr=links oder rechts
        if(lr==false)
            x++;
        if(lr==true)
            x--;
    }

    public void movev(boolean hr){//hr = hoch oder runter
        if(hr==false)
            y++;
        if(hr==true)
            y--;
        
    }
            
            
        
    }

   
    

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package towerdefencev4;

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Toolkit;

/**
 *
 * @author Holger
 */
public class Tower {
    int x,y;
    Component comp;
    public Tower(int x ,int y, Component comp){
        this.x=x;
        this.y=y;
        this.comp=comp;
    }
    public void paintTower(Graphics gr){
        gr.drawImage(Toolkit.getDefaultToolkit().getImage("../img/tower.gif"), x, y, comp);
    }
}


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package towerdefencev4;

import java.awt.*;

/**
 *
 * @author Holger
 */
public class Bullet {
    int x,y;
    int speedx,speedy,n;
    Color color;
    
    public Bullet(Color color,int n){
        x=GUI.turm.x;
        y=GUI.turm.y;
        this.color=color;
        this.n=n;
        speedx=5;
        speedy=5;
    }
    public void paintB(Graphics gr){
        gr.setColor(color);
        gr.fillOval(x,y, 10, 10);
        
    }
    public void moveBullet(){
        
        x+=speedx;
        y+=speedy;
        /*y=(GUI.dasCreep[n].y-GUI.turm.y)/(GUI.dasCreep[n].x-GUI.turm.x)*(x*GUI.turm.x)+GUI.turm.y;
        if(GUI.dasCreep[n].x<x)
            x--;
        if(GUI.dasCreep[n].x>x)
            x++;
        if(GUI.dasCreep[n].x==x)
            x=x;*/
    }
}

In der letzen Klasse (Bullet) hab ich schon mal eine Lösung ausprobiert hat allerdings nicht funktioniert.

MFG RauchenderDachs
 
Vektorrechnung ist dir bekannt? Subtraktion der Vektoren bringt das gewünschte Ergebnis. Dass sich eines oder beide Objekte bewegen, ist kein Problem, wenn du den Bewegungsvektor ständig (z.B. in jeder update-Iteration) neu berechnest.
 
a) Erstelle nicht wegen jedem Problem einen neuen Thead
b) Erstelle nicht in jedem Schleifendurchgang eine neue Kugel
 
Wenn ich allerdings die initialisierung der Kugel zum Beispiel in den Kostruktor packe bekomm ich einen java.lang.NullPointerException.
 
RauchenderDachs schrieb:
Wenn ich allerdings die initialisierung der Kugel zum Beispiel in den Kostruktor packe bekomm ich einen java.lang.NullPointerException.

Muss hinter
Code:
turm=new Tower(150,150,this);
besser wäre wenn der Tower einen eigenen Thread hat in dem er neue Bullets erstellt ..
 
Ich habs hinter Turm gesetzt.
Code:
public GUI(String title){
        super(title);
       for(int n=0 ;n<dasCreep.length;n++){
        dasCreep[n]= new Creep(40,verschiebung,this);
        verschiebung-=60; 
    }
       turm=new Tower(150,150,this);
       kugel= new Bullet(Color.red,0);
    }
Ergänzung ()

Da ich dazu angehalten wurde keinen neuen Threads mehr zu erstellen poste ich mein Problem eben hier.
Ich möchte nun ein Objekt (Turm) an meiner Mausposition erstellen. Allerdings möchte ich zuerst auf einen Button klicken (build) und anschließend irgendwo auf das Spielfeld dort soll dann der Turm mit den x und y Koordinaten der Maus gebaut werden.
Ein lösungs anatz wäre deneke ich auch MousDragged allerdings habe ich noch keine erklärung zur Umsetzung gesehn.

MFG RauchenderDachs


PS
Code:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package towerdefencev4;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 */
public class GUI extends JFrame implements Runnable{

    /**
     * @param args the command line arguments
     */
    private Image dbImage;
    private Graphics dbGraphics;
    static Creep  dasCreep[] = new Creep[5];
    private int verschiebung=-40;//abstand zwischen den einzelnen Creeps
    static Tower turm ;
    static boolean schuss;
    private int i=0;//Nummer des Creeps
    private static boolean go;
    private static GUI dieOberfläche;
    private static boolean build;
    
    public GUI(String title){
        super(title);
       //Oberfläche initialisieren
        JButton go = new JButton();
        getContentPane().add(go);
        go.setText("Go");
        go.setSize(150,50);
        go.setLocation(550,25);
        go.setVisible(true);
        go.addMouseListener(new java.awt.event.MouseAdapter() { // Ohr f?r ButtonClick
                public void mousePressed(MouseEvent e) {
                    buttongo();         // bei Click diese Methode aufrufen
                }
            });
        JButton build = new JButton();
        getContentPane().add(build);
        build.setText("Build Tower");
        build.setSize(150,50);
        build.setLocation(550,100);
        build.setVisible(true);
        build.addMouseListener(new java.awt.event.MouseAdapter() { // Ohr f?r ButtonClick
                public void mousePressed(MouseEvent e) {
                    build();
                }
            });
        
       //Creeps und der gleichen
       for(int n=0 ;n<dasCreep.length;n++){
        dasCreep[n]= new Creep(40,verschiebung,this,100,true);
        verschiebung-=60; 
    }
       //Turm
    }
    public void build(){
          turm = new Tower(150,150,this,100); 
          turm.initkugel();
          build=true;
    }
    public void buttongo(){
        go=true;
    }
    public static void main(final String[] args) {
    dieOberfläche = new GUI("TowerDefencev4");
    //zur Bestimmung der aktuellen Mousposition
    dieOberfläche.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseMoved(MouseEvent e) {
                   System.out.println("x= "+e.getX()+"y= "+e.getY());         // bei Click diese Methode aufrufen
                }
                });
    dieOberfläche.setSize(700, 600);
    new Thread(dieOberfläche).start();
    dieOberfläche.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //ab hier JPanel
    dieOberfläche.add(new JPanel() {
    @Override
    public void paint(final Graphics g) {
    super.paint(g);
    //Hintergrund
    g.drawImage(Toolkit.getDefaultToolkit().getImage("../img/ground.gif"), 0, 0, this);
    //Creep
    if(go==true){
    for(int n=0 ;n<dasCreep.length;n++){
        dasCreep[n].paintcreep(g);  
    }
    }
    if(build==true){
        //Bullet
        turm.kugel.paintB(g);
        //Turm
        turm.paintTower(g);
    }
    }
    });
    //bis hier JPanel
    dieOberfläche.setVisible(true);
    }
     
    @Override
    public void run() {
        while(true){
           if(go==true){
            //Creep
           for(int n=0;n<dasCreep.length;n++){
                dasCreep[n].move();
                if(dasCreep[n].getroffen()==true){
                     dasCreep[n].todjanein();
                     turm.kugel.x=150;turm.kugel.y=150;
                }
                if(dasCreep[n].alive==false){
                     dasCreep[n].x=-50;
                     dasCreep[n].y=-50;
                     for(int a=i;a<dasCreep.length;a++){
                         if(dasCreep[a].alive==false){
                             i++;
                             if(i>=5)// sonst array Index out of Bounds da i immer eins vorraus ist also 5
                                 i--;
                             
                             turm.kugel.x=150;turm.kugel.y=150;
                         }
                             
                     }
                     System.out.println(i);
                     System.out.println(turm.kugel.x+" "+turm.kugel.y);
                     System.out.println(dasCreep[i].x+" "+dasCreep[i].y);
                     System.out.println(schuss);
                     System.out.println(dasCreep[i].life);
                }
                
           }
           //Abfrage ob Creep in Reichweite ist
           turm.checkreichweite();
           //Bullet abfeuern
           if(schuss==true)
           turm.kugel.moveBullet(i);
           //repaint
           }
           repaint();
            try {
                Thread.sleep(20);
            } catch (InterruptedException ex) {
                Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    public void update(Graphics g)
   {
      //Double-Buffer initialisieren
      if (dbImage == null) {
         dbImage = createImage(
            this.getSize().width,
            this.getSize().height
         );
         dbGraphics = dbImage.getGraphics();
      }
      //Hintergrund löschen
      dbGraphics.setColor(getBackground());
      dbGraphics.fillRect(
         0,
         0,
         this.getSize().width,
         this.getSize().height
       );
      //Vordergrund zeichnen
      dbGraphics.setColor(getForeground());
      paint(dbGraphics);
      //Offscreen anzeigen
      g.drawImage(dbImage,0,0,this);
   }
    
    }
 
Zuletzt bearbeitet:
Die Lösung ist viel einfacher: Beim Klick auf den Button merkst du dir nur, dass er geklickt wurde.
Beim Klick auf die Zeichenfläche prüfst du dies und setzt ggf. den Turm an diese Stelle.
 
Zurück
Oben