Jak utworzyć kilka obiektów z takiego kodu, aby działały poprawnie?

0

Mam napisać program w którym pojazdy (max 12) będą stosować się do zasad ruchu drogowego na skrzyżowaniu równorzędnym, a że dopiero zacząłem przygodę z Javą to nie wiem jak utworzyć kilka obiektów i sterować nimi oddzielnie (migotają kiedy jest wywołany więcej niż 1 obiekt)
sądzę, że to przez metodę paint mi tak "migają" proszę o pomoc.
Może ktoś ma pomysł jak to przerobić, albo co z tym zrobić żeby ruszyło to dalej..
Proszę o pomoc
Dodaje paczkę plików i kod źródłowy:

Main.java:

package auto_anim;
import java.awt.Dimension;
import javax.swing.JFrame;


public class Main {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Auto Animacja");
        frame.add(new Operacje());
        frame.setSize(new Dimension(407, 429));
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.show();

    }
}

Operacje.java

package auto_anim;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

public final class Operacje extends JPanel implements Runnable{
    Dude p;
    Image img;
    public Thread thread;

    boolean narysowano = false;

    public Operacje() {
        p = new Dude();
        setFocusable(true);
        ImageIcon i = new ImageIcon("C:/tlo.jpg");
        img = i.getImage();
        start();
    }

    public void start(){
        System.out.println("Start uruchomiono!");
        if (thread == null) {
          thread = new Thread(this);
          thread.start();
        }
    }

   public void stop(){
       System.out.println("Stop uruchomiono!");
      if (thread != null){
          thread = null;
       }
   }

    public void run() {
        System.out.println("Run uruchomiono!");
        while(thread != null){
            repaint();
            p.move();
            try{
                Thread.sleep((int) ((Math.random()*20)+50));
            }catch(InterruptedException exc){return;}
        }
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        System.out.println("Paint uruchomiono!");
        Graphics2D g2d = (Graphics2D) g;

        g.setColor(Color.black);
        g.drawLine(0, 150, 150, 150);
        g.drawLine(0, 250, 150, 250);

        g.drawLine(150, 0, 150, 150);
        g.drawLine(150, 250, 150, 400);

        g.drawLine(250, 150, 400, 150);
        g.drawLine(250, 0, 250, 150);

        g.drawLine(250, 250, 250, 400);
        g.drawLine(250, 250, 400, 250);
        //g2d.drawImage(img, 0, 0, null);
        g2d.drawImage(p.getImage(), p.getX(), p.getY(), null);        
    }
}

Dude.java

package auto_anim;

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

public class Dude {
int x, y, predkosc;
int kierunek;
private int[][] pozycja_poczatkowa = {
        {212, 375},
        {375, 162},
        {0, 212},
        {162, 0}
    };

Image still;
    public Dude(){
    ImageIcon i = new ImageIcon("C:/obiekt.jpg");
    still = i.getImage();
    kierunek = (int)Math.round(Math.random()*3);
    System.out.println("Kierunek to: "+ kierunek);
    x = pozycja_poczatkowa[kierunek][0];
    y = pozycja_poczatkowa[kierunek][1];
    predkosc = Math.round((int)(Math.random()*3)+1);
    }

    public void move(){
        System.out.println("Move uruchomiono!");
        if(kierunek == 0){
            y = y - predkosc ;
        }else if(kierunek == 1){
            x = x - predkosc ;
        }else if(kierunek == 2){
            x = x + predkosc ;
        }else if(kierunek == 3){
            y = y + predkosc ;
        } 
    }
    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }
    public Image getImage(){
        return still;
    }
}

P.S. W paczce jest folder z całym zestawem plików do importu i obrazek, który jest pobierany bezpośrednio z dysku C.

1

Włącz podwójne buforowanie na panelu to przestanie migotać (ale chyba i tak jest domyślnie włączone)
Jak nie pomoże, to nie rób repainta tylko odrysowuj osobno region w którym tam samochód się znajduje.

zawsze możesz się pokusić o java FX - tam mrugało nie będzie...

0

A możesz rozwinąć bardziej swoją myśl ?

0

JComponent.html#setDoubleBuffered() albo coś takiego - otwórz dokumentacje to zobaczysz o co chodzi.
Component#repaint(int x,int y, int width,int height)
lub
JComponent#paintImmediately(int x, int y, int w, int h)
z tych metod korzystaj

0

W międzyczasie przebudowałem program i korzystam z timerów zamiast wątków oraz z apletu. Obiekty ładnie się tworzą, nie migotają, ale teraz powstał problem jak stworzyć komunikację pomiędzy utworzonymi obiektami ? Może ich położenie, prędkość przechowywać w tablicy wielowymiarowej gdzie każdy rekord to byłby jeden obiekt (przypominam, że obiektów ma być max 12) ? Prosze o jakiś pomysł i dołączam kod oraz paczkę plików:

Program.java

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.util.Timer;

public class Program extends Applet{
	
	static Applet applet;
    Zadanie zadanie = new Zadanie();
    Timer timer = new Timer();
    static Samochod samochod = new Samochod();
    static Samochod samochod2 = new Samochod();
    static Samochod samochod3 = new Samochod();
    int rozmiar1 = 400, rozmiar2 = 400;
    Image bufor;
    Graphics bg;
    
    public void init() {
    	bufor = createImage(rozmiar1, rozmiar2);
        bg = bufor.getGraphics();
        
        applet = this;
        applet.setSize(400, 400);
        applet.setBackground(Color.LIGHT_GRAY);
        timer.scheduleAtFixedRate(zadanie, 50, 50);
        //timer2.schedule(zadanie2, 40, 50);
    }

    public void update(Graphics g){
        bg.clearRect(0, 0, rozmiar1, rozmiar2);
        paint(bg);
        g.drawImage(bufor, 0, 0, this);
    }
    
    public void paint(Graphics g){
        //g.setColor(Color.red);
        //g.fillRect(zadanie.poz1, zadanie.poz2, 50, 50);
        super.paint(g);
        System.out.println("Paint uruchomiono!");
        Graphics2D g2d = (Graphics2D) g;

        g.setColor(Color.black);
        g.drawLine(0, 150, 150, 150);
        g.drawLine(0, 250, 150, 250);

        g.drawLine(150, 0, 150, 150);
        g.drawLine(150, 250, 150, 400);

        g.drawLine(250, 150, 400, 150);
        g.drawLine(250, 0, 250, 150);

        g.drawLine(250, 250, 250, 400);
        g.drawLine(250, 250, 400, 250);
        //g2d.drawImage(img, 0, 0, null);
        g2d.drawImage(samochod.getImage(), samochod.getX(), samochod.getY(), null);   
        g2d.drawImage(samochod2.getImage(), samochod2.getX(), samochod2.getY(), null); 
        g2d.drawImage(samochod3.getImage(), samochod3.getX(), samochod3.getY(), null);  
    }
}

Zadanie.java

import java.util.TimerTask;


public class Zadanie extends TimerTask{
	int poz1 = 0;
    int poz2 = 0;
    int kierunek = 1;
    int licznik = 0;
    
    @Override
    public void run() {    
    	System.out.println("Run uruchomiono\n");

       Program.samochod.move();
       Program.samochod2.move();
       Program.samochod3.move();
       Program.applet.repaint();
    }

}

Samochod.java

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


public class Samochod {
	int x, y, predkosc;
	int kierunek;
	private int[][] pozycja_poczatkowa = {
	        {212, 375},
	        {375, 162},
	        {0, 212},
	        {162, 0}
	    };

	Image still;
	
    
    public Samochod(){
    	ImageIcon i = new ImageIcon("C:/obiekt.jpg");
        still = i.getImage();
        kierunek = (int)Math.round(Math.random()*3);
        System.out.println("Kierunek to: "+ kierunek);
        x = pozycja_poczatkowa[kierunek][0];
        y = pozycja_poczatkowa[kierunek][1];
        predkosc = Math.round((int)(Math.random()*3)+1);    	
    }
    
    public void move(){
        System.out.println("Move uruchomiono!");
        if(kierunek == 0){
            y = y - predkosc ;
        }else if(kierunek == 1){
            x = x - predkosc ;
        }else if(kierunek == 2){
            x = x + predkosc ;
        }else if(kierunek == 3){
            y = y + predkosc ;
        } 
    }
    public int getX(){
        return x;
    }
    public int getY(){
        return y;
    }
    public Image getImage(){
        return still;
    }
 }

Pilk obiekt.jpg do głównej lokacji na dysku C:

1

Timery to też wątki ;) tylko o predefiniowanym przeznaczeniu i specyficznym działaniu ;)
Komunikacja między wątkami musi wprowadzać synchronizacje bo inaczej armagedon stać się może.
WG mnie, najlepiej by było, jakbyś miał tylko jeden watek i sobie po kolei iterował po każdym samochodzie ustalając co się z każdym stanie w kolejnej "klatce animacji". Brak równoległości = brak bólu głowy ;)
A Timery mogą tutaj robić powiedzmy, za zmianę świateł na sygnalizacji:)

0

Tu jest skrzyżowanie równorzędne, gdzie obowiązuje jedynie zasada prawej ręki.
Co do porady to brzmi dobrze, ale nie mam pojęcia jak to przełożyć na kod (dopiero od tygodnia zajmuje się javą)
Gdybyś mógł to przedstawić w jakichś krokach mniej więcej zarysowane to sądzę, że bym sobie to już jakoś posklejał.
Jak na razie to dzięki :)

Udało mi się już ogarnąć ruszanie jeśli inny obiekt już odjechał, więc sądzę, że powolutku sobie rozkminię resztę warunków żeby to działało tak jak powinno.
Dzięki za pomoc ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1