Animacja JAVA

0

Cześć,

piszę program, w którym kilka kulek ma odbijać się od siebie nawzajem. Niestety moja metoda, (touch()), nie chce działać. Czy pomógłby mi ktoś znaleźć błąd?


import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import acm.graphics.GImage;
import acm.graphics.GLabel;
import acm.graphics.GObject;
import acm.graphics.GOval;
import acm.program.GraphicsProgram;
import acm.util.RandomGenerator;
import acmx.export.javax.swing.Timer;

public class Graphics extends GraphicsProgram {

	private static final long serialVersionUID = 1L;

	private final static int SIZE = 50;
	private final static int WINDOW_SIZE = 600;
	private final static double GRAVITY = 1;
	private final static double ELASTICITY = 0.75;
	private final static double FPS = 1000 / 60;
	int[] i = { 0, 0, 0 };
	double[] SPEED = { 3, 3, 3 };
	double[] dyy = { 0, 0, 0 };
	GOval[] tabKulek = new GOval[3];
	GLabel[] ballText = new GLabel[3];

	public void run() {
		setSize(WINDOW_SIZE, WINDOW_SIZE);

		// RandomGenerator rgen = RandomGenerator.getInstance();
		int position = 0;
		for (int i = 0; i < 3; i++) {
			tabKulek[i] = ballDraw(position, 0, SIZE, SIZE);
			add(tabKulek[i]);
			ballText[i] = makeText(Integer.toString(i),
					position / 2 + SIZE / 2, SIZE / 2);
			add(ballText[i]);
			position += 150;

		}
		bounceBall();
	}

	private void bounceBall() {

		int a = 0;
		while (true) {
			int b = a % 3;
			GOval ball;
			GLabel text;
			text = ballText[b];
			ball = tabKulek[b];
			floorsWalls(ball, b, text, tabKulek);
			a++;

			pause(FPS);

		}
	}

	private void floorsWalls(GOval ball, int b, GLabel text, GOval[] tabKulek) {

		ball.move(SPEED[b], dyy[b]);
		text.move(SPEED[b], dyy[b]);
		dyy[b] += GRAVITY;

		if (belowFloor(ball) && dyy[b] >= 0) {
			dyy[b] *= -0.95;
		}
		if (nextToWall(ball)) {
			SPEED[b] *= -1;
		}
		touch(tabKulek);

	}

	private boolean nextToWall(GOval ball) {
		return ((ball.getX()) >= WINDOW_SIZE - ball.getWidth() || (ball.getX()) <= 0);
	}

	private boolean belowFloor(GOval ball) {
		return ball.getY() + ball.getHeight() >= getHeight();
	}

	private GLabel makeText(String i, double x, double y) {
		GLabel text = new GLabel(i);
		text.setLocation(x, y);
		text.setFont(Font.SANS_SERIF);
		return text;
	}

	private GOval ballDraw(double x, double y, double width, double height) {
		GOval ball = new GOval(x / 2, y, width, height);
		ball.setFilled(true);
		ball.setColor(Color.cyan);
		return ball;
	}

	/*
	 * private GImage backgroundDraw(String a) { GImage back = new GImage(a);
	 * return back; }
	 */

	private void touch(GOval[] ball) {

		for (int b = 0; b <= 3; b++) {
			for (int c = 0; c <= 3; c++) {
				if ((b != c && ball[b].getX() - ball[c].getX() <= ball[b].getWidth()) && (ball[b].getY() - ball[c].getY() <= ball[b].getHeight())) {
					SPEED[b] *= -1;
					SPEED[c] *= -1;
				}
			}
		}
	}
}
0

A możesz:

  1. Wstawić kod miedzy tagi <code class="java"></code>?
  2. Opisać na czym dokładnie polega problem?
  3. Napisać, czy dostajesz jakiś wyjątek/błąd i go tutaj wkleić?
  4. Zamknąć swój problem w działającym przykładzie?
  5. Powiedzieć co już próbowałeś robić?

Wtedy będzie łatwiej Ci pomóc.

0

Mój problem polegał na tym, że po kompilacji i uruchomieniu programu kulki pojawiały się w pozycji wyjściowej i nie chciały się ruszyć.
Teraz zauważyłem, ze w pętli for w touch() dałem zły warunek kończący pętle, zamiast b<3, dałem b<=3, co powodowało, że funkcja sprawdzała nieistniejący element.

PS. To mój pierwszy post na tym forum. Sorry za niewłaściwe rozpoczęcie wątku.

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