zadanie ruch pionowy w dół

0

Witajcie,

kod przedstawia ruch kilku obiektów. Ruch ma się odbywać od środka szerokości okna pionowo w górę. Jeśli obiekty te osiągnął połowę wysokości okna apletu, ruch ma się odbyć pionowo w dół. Problem polega na tym, że moje obiekty dostają "drgawek." Widać, że się poruszają ale coś blokuje ruch. Obiekty przesuwają się może o kilka px i tak w kółko ale to zasługa repaint().

Proszę o pomoc w zwróceniu uwagi, gdzie zrobiłam błąd i jak go rozwiązać.

Dziękuję z góry za wszelkie sugestie

 
 public class Kula extends JApplet {
 
    int x = 200;
    int y = 100;
    int w = 130;
    int dx, dy = 1;
    int dt = 20;
 
    public void init() {
        setBackground(Color.green);
    }
 
    public void paint(Graphics g) {
        x = getWidth() / 2;
        y = getHeight() - w;
        y += dy;
        if (y >= getHeight()/2 || y <= 0) {
            dy = -dy;
        }
        try {
            Thread.sleep(dt);
        } catch (InterruptedException e) {
        }
        repaint();
        g.clearRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.white);
        g.fillOval(x, y, 30, 30);
        g.setColor(Color.BLACK);
        g.fillOval(x + 9, y + 9, 3, 3);
        g.fillOval(x + 21, y + 9, 3, 3);
        g.fillRect(x + 6, y - 7, 20, 7);
        g.drawLine(x, y, x + 30, y);
        g.drawLine(x + 10, y + 20, x + 20, y + 20);
        g.setColor(Color.white);
        g.fillOval(x - 7, y + 29, 40, 40);
        g.fillOval(x - 17, y + 68, 60, 60);
0
y0annka napisał(a):

coś blokuje ruch (...)

Thread.sleep(dt);

Ciekawe co blokuje...

Generalnie podstawowe błędy masz dwa: właśnie powyższy sleep w metodzie paint(). Oraz wywołanie repaint() w paint(). Powinieneś zrobić odpowiedni Timer, który policzy wszystko co trzeba narysować i dopiero potem wywoła repaint(). Dzięki temu przy okazji z paint() pozbędziesz się obliczeń.

0

Nie mozesz tego zrobic tak troche bardzie po ludzku?

W klasie glownej aplikacji czy w mainie:

inicjalizacja obiektow
while(true)
    wyliczenie fps
    pobranie danych od usera o zamknieciu okna czy jakichkolwiek chcesz
    sprawdzenie kolizji
    zmiana pozycji obiektu
    rysowanie
    dopelnienie do czasu klatki
0
n0name_l napisał(a):

Nie mozesz tego zrobic tak troche bardzie po ludzku?

W klasie glownej aplikacji czy w mainie:

inicjalizacja obiektow
while(true)
    wyliczenie fps
    pobranie danych od usera o zamknieciu okna czy jakichkolwiek chcesz
    sprawdzenie kolizji
    zmiana pozycji obiektu
    rysowanie
    dopelnienie do czasu klatki

noname, nie komplikujmy...

zadanie jest banalne, to sa podstawy....
Wiem, że bład lezy gdzies w if'ie a nie try...

Ktoś ma jakies propozycje? Potrzebuje pomocy z tym zadaniem...

0

Twój kod to bzdura. Propozycja: popraw go tak, jak wskazują ci n0name_l i airborn.

0
ŻadnychKomplikacjiOK napisał(a):

Twój kod to bzdura. Propozycja: popraw go tak, jak wskazują ci n0name_l i airborn.

Nie rozumiem dlaczego twierdzicie, że to co napisałam to bzdura...
Ten kod działa tak jak powinien:

 x+=dx; y+=dy;
        if(x>=getWidth()-d||x<=0){dx=-dx;}
        if(y>=getHeight()-d|| y<=0){dy=-dy;}
        try{
        Thread.sleep(dt);
        }catch(InterruptedException e){}
        repaint(); 

Moje zadanie polega na ustawieniu obiektu w połowie szerokości i na dole okna apletu i ruch ma się odbywać pionowo góra-dół-góra.
O ile z ustawieniem obiektu nie problemu, to jest problem z ruchem, bo to co jest poniżej nie działa prawidłowo...

x = getWidth()/2;
        y=  getHeight()-d;   
        y -= dy;
        if (y>=getHeight()/2 || y<=getHeight()/2){dy=-dy;}
        try {
            Thread.sleep(dt);
        } catch (InterruptedException e) {
        }
        repaint();  

I nie jest to moje uparcie się tylko metoda prowadzącego zajęcia. Czy nikt nie jest mnie w stanie naprowadzić i tylko będziecie morały prawić jaki ten kod do bani jest....?

0

Kod jest bez sensu więc nie będę go poprawiał. Wyjaśnię tylko co jest przyczyną drgawek. y jest od razu duże, większe od getHight()/2 zatem za każdym razem dy zmienia znak. Wywołujesz metodę repaint() z metody paint(), ale repaint() samo z kolei wywołuje paint(), masz więc nieskończona pętlę wywołań paint() => repaint() => paint() => ..., w każdym przebiegu pętli dy zmienia znak, więc na zmianę są przesunięcia w górę i w dół (drgawki).
P.S. Zmień prowadzącego.

0

Miałaś złą wartość początkową dy (powinna być ujemna) i złe warunki.
Jeszcze się musisz zająć mruganiem, dodałem pola width i height, żeby nie wywoływać ciągle funkcji getWidth() i getHeight()

 import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 
 public class Kula extends JApplet {
 
    int x = 200;
    int y = 100;
    int w = 130;
    int dx, dy = -1;
    int dt = 20;
	int width = 0;
	int height = 0;
 
    public void init() {
        setBackground(Color.green);
		width = getWidth();
		height = getHeight();
        x = width / 2;
        y = height - w;
        Timer timer = new Timer(30, new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                y += dy;
                if (y < height/2 || y > height - w) 
				{
                    dy = -dy;
                }
                repaint();
            }
        });
        timer.start();		
    }
 
    public void paint(Graphics g) {
        g.clearRect(0, 0,width,height);
        g.setColor(Color.white);
        g.fillOval(x, y, 30, 30);
        g.setColor(Color.BLACK);
        g.fillOval(x + 9, y + 9, 3, 3);
        g.fillOval(x + 21, y + 9, 3, 3);
        g.fillRect(x + 6, y - 7, 20, 7);
        g.drawLine(x, y, x + 30, y);
        g.drawLine(x + 10, y + 20, x + 20, y + 20);
        g.setColor(Color.white);
        g.fillOval(x - 7, y + 29, 40, 40);
        g.fillOval(x - 17, y + 68, 60, 60);
	}
}

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