Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Ongelma Java-appletin kanssa

The Chosen One [29.10.2010 17:56:19]

#

heipä hei.
Tuli ongelma vastaan koodatessani peliä
kääntäjä ei anna mitään virhettä,mutta silti ohjelma ei toimi
ongelma tuli kun yritin selvittää matkaa 2 pisteen välillä.
Pelin idea:ötökkää liikutetaan hiirellä ja jos osuu palloon niin peli loppuu.
ongelmani on kun hiiri osuu palloon koodauksessa toivottavasti joku minua nerokkaampi voi auttaa.Kiitos.

import java.net.*;
import java.awt.*;
import java.applet.*;

public class Saie extends Applet implements Runnable


{ Thread ajastin;
Graphics g;
boolean lopetusehto = false;
int x;
int y;
int ox;
int oy;
int laskuri=0;
int xkoords[];
int ykoords[];
public void start() {
		play(getDocumentBase(),"lotto.au");
		}
Color vari;
boolean nappi;
Image otokka=null;
Image tausta;
Image alusta;
public void init()


	{
for (int i=0;i<30;i++)
				{
				x=(int) (Math.random()*640);
				y=(int) (Math.random()*480);
				xkoords[i]=x;
				ykoords[i]=y;
				}




otokka=getImage(getCodeBase(),"otokka.gif");
tausta=createImage(640,480);
alusta=createImage(640,480);

ajastin=new Thread(this);
ajastin.start();
}

public boolean mouseMove(Event e, int x, int y) {
	int eta;
	for(int i=0;i<30;i++)
	{
		eta=laskeeta(xkoords[i],ykoords[i],x,y);
	}
	nappi=true;

	return true;
	}

public int laskeeta(int a, int b, int c, int d)
	{return (a-c)*(a-c)+(b-d)*(b-d);}


public void run()
	{
	while(lopetusehto==false)
		{


		if(laskuri==0)
			{
			g=tausta.getGraphics();
			vari=new Color(255,255,255);
			g.setColor(vari);
			g.fillRect(0,0,640,480);
			vari=new Color(0,0,0);
			g.setColor(vari);
			for (int i=0;i<30;i++)
				{
				x=(int) (Math.random()*640);
				y=(int) (Math.random()*480);
				g.drawOval(x,y,30,30);
				}
			vari=new Color(255,255,0);
			g.setColor(vari);
			g.fillRect(20,20,100,100);
			}

		laskuri=1;
			g=alusta.getGraphics();
			g.drawImage(tausta,0,0,this);
			g.drawImage(otokka,ox,oy,this);
			g=getGraphics();
			g.drawImage(alusta,0,0,this);
		try {
			ajastin.sleep(100);}
		catch (InterruptedException e) {;}
		}
		while(lopetusehto==true)
	{
		Image loppu;
		loppu=getImage(getCodeBase(),"loppu.jpg");
		g.drawImage(loppu,480,640,240,320,this);
		try{
		ajastin.sleep(3000);
		}
		catch(InterruptedException e)
		{;}
		repaint();
	}

	}


public void paint(Graphics g)
	{;}
 }

Mod. lisäsi kooditagit

johku90 [29.10.2010 22:14:55]

#

Hejssan..

Yksi virhe on ainakin etäisyyden laskemisessa. Etäisyys on siis

Math.sqrt((a-c)*(a-c)+(b-d)*(b-d));

En vain kyllä hoksaa, missä sinä käytät tätä etäisyyttä. Voisit esim. laittaa tuohon run() metodiin jonkun if lauseen, joka lopettaa pelin, jos etäisyys on liian pieni.

Toinen virhe taitaa olla tuossa, kun piirrät ne pallot siihen peliin.
Siinä nimittäin arvotaan pallojen paikat toistamiseen. Nythän siinä käy niin, että xkoords[] ja ykoords[] taulukoissa on eri arvot, kuin mitä näytöllä pallojen kuvat antavat ymmärtää. Sinun pitäisi piirtää ne pallot niiden taulukoissa olevien pisteiden avulla.

Siinäpä jo joitakin ajatuksia.

EDIT: Kannattaa muuten laittaa nuo piirto-operaatiot tuonne paint funktioon, tai ainakin johonkin omaan funktioon, jolloin tuo run() metodi selkenee huomattavasti.

The Chosen One [31.10.2010 13:56:56]

#

Kiitos vastauksesta.
Mutta omaa tyhmyyttäni en saanut tuota neuvoasi sovellettua koodiin.
Edit:tuon pituuden laskemisessa en onnistunut,mutta pallojen piirtämisessä kylläkin

johku90 [01.11.2010 16:16:06]

#

Luultavasti ongelma on siinä, että metodin pitäisi palauttaa int arvon. Math.sqrt() funktio palauttaa aina double-arvon. Sinun pitää joko muuttaa etäisyys int arvoksi, tai laskea kaikki etäisyyteen liittyvät jutut double-arvoilla. Double on tietysti tarkempi ja siten parempi. Muutat vain funktion muotoon:

 public double laskeeta(int a, int b){
    return Math.sqrt((a-c)*(a-c)+(b-d)*(b-d));
}

Vastaavasti run() metodissa otat huomioon, että etäisyys on double.

Jos haluat säilyttää epätarkemman, mutta kaiketi riittävän tarkan int arvon, laita
etäisyyden laskuun vain

int etaisyys =(int) Math.round(Math.sqrt((a-c)*(a-c)+(b-d)*(b-d)));
return etaisyys;

Mod. lisäsi kooditagit.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta