Prosta gra, nie działa poprawnie.

0

Witam, dopiero od niedawna bawię się w Javie. Chciałem stworzyć grę w której odbija się piłęczkę tak aby nie wypadła za ekran. Problem w tym że wypada przy innych ścianach.

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Timer;

public class GraI extends Applet implements MouseMotionListener
{

static Applet applet;


work silnik = new work();
Timer timer = new Timer();
int rozmiar1=800, rozmiar2=600; // ROZMIAR OKNA
Graphics bg;
Image bufor;



public void init(){
addMouseMotionListener(this);

applet = this;
applet.setSize(800,600);
applet.setBackground(Color.LIGHT_GRAY);
bufor=createImage(rozmiar1,rozmiar2);
bg=bufor.getGraphics();
timer.scheduleAtFixedRate(silnik,3,4);


}
public void update(Graphics g){
bg.clearRect(0, 0, rozmiar1, rozmiar2);	
paint(bg);	
g.drawImage(bufor,0,0,applet);	
}
public void paint(Graphics g){

g.setColor(Color.DARK_GRAY);
g.fillRect(750,0, 750, 600);	
	
g.setColor(Color.RED);
g.fillOval(silnik.KOLOX, silnik.KOLOY, 30, 30);


	
g.setColor(Color.BLUE);
g.fillRect(silnik.poz1,silnik.poz2, 30, 100);


	
}

public void mouseDragged(MouseEvent e) {	
}
@Override
public void mouseMoved(MouseEvent e) {
	silnik.x=e.getX();
	silnik.y=e.getY();
	}



}
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Random;
import java.util.TimerTask;

public class work extends TimerTask{

public int level=3; // maksymalna szybkosc pileczki
public Random generator = new Random();	// sluzy do losowania predkosci pileczki
public int parametrX = generator.nextInt(level); // losuje predkosc wektora x pileczki
public int parametrY = generator.nextInt(level); // losuje predkosc wektora y pileczki 

public int KOLOX=40,KOLOY=40; // ustawienie początkowe pileczki
public int poz1=750 ; // pozycja suwaka X
public int poz2=0; // pozycja suwaka y
public int y; //  zmienne potrzebne do przekazania współrzędnych myszki y
public int x;	//  zmienne potrzebne do przekazania współrzędnych myszki x
public int mnoznik1=1; // potrzebne do ustalenia kierunku pileczki
public int mnoznik2=1; // potrzebne do ustalenia kierunku pileczki
public void run(){

poz2=y; // ustalenie wysokosci suwaka

parametrX= generator.nextInt(level); // losuje wektory x
parametrY=generator.nextInt(level); // losuje wektory y




new Thread(){
	public void run(){
if ((KOLOY>=poz2)&&(KOLOY<=poz2+100)&&(poz1-30<KOLOX)&&(poz1>KOLOX)){ // PILECZKA UDERZA W SUWAK
mnoznik1= -mnoznik1; // ZMIANA KIERUNKU

}}}.start();
new Thread(){
	public void run(){
if(KOLOY==570){
mnoznik2= -mnoznik2; // ZMIANA KIERUNKU


}}
}.start();

new Thread(){
	public void run(){
if(KOLOY==0){
mnoznik2= -mnoznik2; // ZMIANA KIERUNKU

}}}.start();

new Thread(){
	public void run(){
if(KOLOX==0){
mnoznik1= -mnoznik1; // ZMIANA KIERUNKU


}}}.start();;



KOLOX=KOLOX + parametrX*mnoznik1; // KIERUJE PILECZKĄ x
KOLOY=KOLOY + parametrY*mnoznik2; // KIERUJE PILECZKĄ Y
GraI.applet.repaint();

}



}

Mam nadzieję że znajdzie się ktoś, kto mi tutaj pomoże. Liczę na wyrozumiałość ! Dopiero zaczynam w Javie ;)
Pozdrawiam.

0

A sprawdzałeś pod debuggerem co się dzieje?

0
new Thread(){
    public void run(){
if(KOLOY==0){
mnoznik2= -mnoznik2; // ZMIANA KIERUNKU
 
}}}.start(); 

Nie do konca wiem co ma robić ta linijka ale zgaduje, że chodziło ci o:

new Thread(){
    public void run(){
while(true){
if(KOLOY==0){
mnoznik2= -mnoznik2; // ZMIANA KIERUNKU
 }
}}}.start();
 
0

Szczerze mówiąc, nie wiem czy potrafię z niego poprawnie korzystać.

0

Czy pętla while(true) jest konieczna jeśli pracuje TimerTask?

0

Chyba nie powinno być KOLOY<=0 ponieważ dałem dodałem mnożniki(mnożnik1 i mnożnik2) które w momencie odbicia się piłeczki od jakiejś sciany nadają jej kierunek aż do następnego odbicia. opcja z while(true) nie działa. A wątki są po to żeby na bieżąco sprawdzać czy piłeczka nie dotyka z jednej ze ścian.

1

KOLOY=KOLOY + parametrY*mnoznik2;
Powiedzmy, że twój parametrY wylosowal się na 3
Twój mnożnik wynosi -1 jeżeli KOLOY=40
to kiedy wyniesie on 0 ? będzie 37,34,...,1,-2,-5 Warunek nigdy się nie spełni, w skrócie zrób

if(KOLOY<=0 || KOLOY >= 570) {
mnoznik2=-mnoznik2;
}

Zrobiłem też, z 2 ifów jeden bo rozbiłeś ten sam kod na 2 if,y
Po drugie twoj task wykonuje co chwile jakies dzialanie i co chwile tworzy 4 nowe watki jest to nie oplacalne
Więc zdecyduj się albo na while(true) i wątki i usuń task albo usuń wątki i niech task sprawdza warunki
EDIT: poza tym koordynaty powinny byc fachowo zmienno przecinkowe
EDIT2:
zrob tak tego run'a

public void run(){
if(KOLOY<=0 || KOLOY >= 570) {
mnoznik2=-mnoznik2;
}
if(KOLOX<=0 || KOLOX >= 570){ //tu dodalem KOLOX >= 570 bo tego nie widzialem
mnoznik1=-mnoznik1;
}
KOLOX=KOLOX + parametrX*mnoznik1; // KIERUJE PILECZKĄ x
KOLOY=KOLOY + parametrY*mnoznik2; // KIERUJE PILECZKĄ Y
GraI.applet.repaint();
}

I nie mam pojęcia co robi pierwszy if w run(). Więc go sobie dodaj lub nie
EDIT3:
Czytam na temat timer tasków i koleś ma takie coś czego u ciebie brakuje

 TimerTask timerTask = new MyTimerTask();
 Timer timer = new Timer(true);
timer.scheduleAtFixedRate(timerTask, 0, 10*1000);

Czyli u ciebie

TimerTask timerTask = new work();
Timer timer = new Timer(true)
timer.scheduleAtFixedRate(timerTask,0,1000);// ruch piłki co sekunde ???

Co do ostatniego pewien nie jestem, bo dopiero czytam o tych timertaskach
Bo odziwo piłka ci się porusza

0

OK, ogarnąłem. Dziękuje za pomoc.

0

Ja zawsze sądziłem, że do gier używa się specjalnych bibliotek lub środowisk.

To tak jakbyś pisał grę w C i WinAPI.

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