Toon posts:

[JAVA] bal met balkje

Pagina: 1
Acties:
  • 77 views sinds 30-01-2008

Verwijderd

Topicstarter
Ik ben op dit moment bezig met een project. Daarvoor moet ik 10 ballen laten stuiteren binnen een vierkant en in de vierkant zit ook nog een balkje wat ik kan bewegen als ik het balkje met de muis inhoudt en waar ook de balletjes tegen aan kunnen stuiteren.

Nou heb ik de basis. 2 balltjes die stuiteren tegen de zijkant. Maar er is nog steeds 1 probleem. In totaal moet ik 10 ballen hebben. Ik heb er alvast 2 voor de basis. Ik kan 1 bal alleen maar tegen de Y-as van het balkje laten stuiteren maar ik wil het net zo laten stuiteren als een soort breakout/atkanoid balkje maar dan helemaal rondom ipv van alleen de bovenkant.

Zou iemand hier mij mee kunnen helpen?
Ik zal het script hieronder plaatsen.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package projectbal;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Applet1 extends Applet implements Runnable {
  int x,x2,y,y2,dx,dx2,dy,dy2,diam,sizex,sizey;
  private int xb = 50, yb = 100;

  public void init () {
    setBackground (Color.white);

    x=150;
    x2=40;
    y=52;
    y2=150;
    dx=dy=2;
    dx=dy2=2;
    diam=20;

    sizex=300;
    sizey=300;

    (new Thread (Applet1.this)).start();

    addMouseMotionListener (new MuisHandler() );
  }

    public void run() {
      while (true) {
        try  {
          Thread.currentThread().sleep(50);
      }
      catch (InterruptedException e) {};

      x+=dx; y+=dy;
      if ((x<=0)||(x+dx+diam>=sizex)) dx=-dx;
      if ((y<=0)||(y+dy+diam>=sizey)) dy=-dy;

      x2+=dx2; y2+=dy2;
      if ((x2<=0)||(x2+dx2+diam>=sizex)) dx2=-dx2;
      if ((y2<=0)||(y2+dy2+diam>=sizey)) dy2=-dy2;

      x+=dx; y+=dy;
      if ((y<=0)||(y+dy+diam>=yb-10)) dy=-dy;

      repaint ();
    }
  }

  public void paint (Graphics g) {
    g.setColor(Color.black);
    g.fillArc(x,y,diam,diam,0,360);
    g.fillArc(x2,y2,diam,diam,0,360);

    g.setColor (Color.red);
    g.fillRect (xb-10,yb-10,75,25);

    }

  public void setXY (int xb, int yb) {
    this .xb=xb;
    this .yb=yb;
    }

    class MuisHandler extends MouseMotionAdapter {
    public void mouseDragged (MouseEvent e) {
      setXY ( e.getX(), e.getY() );
      repaint ();
    }
  }
}

Verwijderd

Java is ten eerste een object georienteerde taal dus denk ik dat je een
en ander wat abstracter kan zien in plaats van alle ballen te hardcoden.

Als je de opzet van hieronder gebruikt maakt het niet uit of je een of
honderd ballen wilt. Het gaat om het algoritme, als dat maar klopt.

Heb je al eens gedacht aan iets als

public class Bal{
protected int x;
protected int y;
protected int deltaX; // -1 of +1
protected int deltaY; // -1 of +1

// get set methods hier
}

// Dit in je class
public static int BALLEN = 10;

Bal balArray[] = new Bal[NBALLEN];
for(int i=0; i<NBALLEN; i++){
// initialisatie
}

// Zoiets ook als paint

Groet,

Jurrian de Valk
Sereon Technology
www.sereon.com

  • MachoM
  • Registratie: April 2003
  • Laatst online: 19-08 15:21
Ik zou het toch iets aanpakken dan de meneer boven mij.

Het is denk ik (weet ik ;) ) het makkelijkst om een apparte klassen te maken die een bal tekend en het plankie. deze laat je dan canvas extenden.
(sorry ik hou nou eenmaal van veeeeeeeeeeeeeeel klassen, is makkelijk veranderen zonder veel problemen later ;) )

Mijn methode zorgt ervoor dat de balletjes wel wat knipperen, maar niet je complete scherm. (is namelijk een veel voorkomend probleem met applets)

Ik neem iig aan dat je wel wat ervaring hebt met java?

dus:

public class beeld extends canvas
{

public beeld(int maxx, int maxy)
{// x, y is grootte
...
balletje a = new objecten(x2, y2, maxx, maxy); // dus met beginposities mee...
balletje b = new objecten(x1, y1);
...
this.add(a);
this.add(b);
...
}

}

hierna maak je een klasse balletje

public class objecten
{
int grootsteX, grootsteY;

public balletje(int x, int y, int maxX, int maxY)
{
this.tekenbal(x,y);
}
...

public void check()
{
// hier kun je dus de posities van de plank ook toevoegen...

if (x= maxX)
{ deltaX = -1;}
else if ...

}
}

Ow ja je moet natuurlijk ook ff beeld aanroepen in je hoofdklasse :)

Een andere methode is het schrijven van een methode getX en getY in de klasse objecten, het enige wat deze is return X, danwel return Y.

Dan kun je dus het omkeren in Beeld omdraaien.

Geef maar een gil als je het nog niet vat ;)

Verwijderd

Topicstarter
Bedankt voor de reacties. En ik begrijp dat jullie me op deze manier willen helpen maar ik ben al zo lang bezig geweest met deze code en ik wil deze gewoon afmeken zodat het niet heel veel anders wordt. Gewoon een code die door een beginner is geschreven ;-)

Het enigste wat ik eigenlijk wil weten is hoe ik em kan stoten tegen die balk... als ik dat weet ben ik er uit hoop ik....

  • Reefer
  • Registratie: Mei 2000
  • Laatst online: 21-02-2025

Reefer

madness

ik heb ooit dit geprutst misschien heb je er wat aan

Java:
1
2
3
4
5
6
7
8
9
10
boolean goingdown, goingright;

public void move()
    {
            /* collision detection */
            if(goingdown)   { if(_y<=300) { _y+=5; } if(_y>=300) { goingdown=false;  }}
            if(!goingdown)  { if(_y>=10)  { _y-=5; } if(_y<=10)  { goingdown=true;   }}
            if(goingright)  { if(_x<=405) { _x+=5; } if(_x>=405) { goingright=false; }}
            if(!goingright) { if(_x>=15)  { _x-=5; } if(_x<=15)  { goingright=true;  }}
    }

A Breakbeat A Day Keeps Religion Away.


  • MachoM
  • Registratie: April 2003
  • Laatst online: 19-08 15:21
correct ;) alleen moet hij ff de cijfers variabel maken denk ik ;)

Verwijderd

Topicstarter
dit is de collison detection van tegen het balkje gaan? is dit in mijn script te gebruiken :S

  • MachoM
  • Registratie: April 2003
  • Laatst online: 19-08 15:21
Nee tegen een muur, maar de balk werkt net zo

Verwijderd

Topicstarter
als je op msn online komt zou je me mischien verder kunnen helpen ;)

alsjeblieft ;D

Verwijderd

Toch zou ik sowieso wel een object maken van Bal, gewoon al omdat het ontzettend lelijk wordt als je straks 10 ballen hard gaat zitten coderen + dat nou juist het voordeel is van een OO taal ;)

  • MachoM
  • Registratie: April 2003
  • Laatst online: 19-08 15:21
juistem ;)

en het gaat knipperen als een gek :D

  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 10-08 15:15
en het gaat knipperen als een gek :D
Daar heb je diverse oplossingen voor. Bijvoorbeeld backbuffering.

[ Voor 14% gewijzigd door Infinitive op 31-05-2003 18:42 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • MachoM
  • Registratie: April 2003
  • Laatst online: 19-08 15:21
ja, maar dat heeft ie dus niet toegepast ;)

Verwijderd

Topicstarter
code:
1
2
3
      x+=dx; y+=dy;
      if ((x<=0)||(x+dx+diam>=sizex)) dx=-dx;
      if ((y<=0)||(y+dy+diam>=sizey)) dy=-dy;


is het mogelijk om naat sizex en sizey ook daarbij de yb en xb aan te spreken?

[ Voor 5% gewijzigd door Verwijderd op 31-05-2003 20:10 ]


Verwijderd

Je hebt ze private klassevariabelen gemaakt, dat houdt dus in dat ze alleen zichtbaar zijn in deze gehele klasse. Aangezien deze methode zich in die klasse bevindt, zijn yb en xb aanspreekbaar in deze methode. Tenminste ik hoop dat dit is wat je bedoelt 8)

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
btw als je gebounced hebt moet je nog wel effe de laatste dx/dy ongedaan maken want anders zit je in je blokje... ook moet je niet met een punt met een blok maar een lijnstuk met een blok vergelijken anders gaat ie bij grote snelheden er gewoon doorheen...

  • MachoM
  • Registratie: April 2003
  • Laatst online: 19-08 15:21
Verwijderd schreef op 31 mei 2003 @ 20:10:

is het mogelijk om naat sizex en sizey ook daarbij de yb en xb aan te spreken?
Leg eens in wat meer woorden uit wat je hiermee bedoelt.

edit:

ow ik snap het al je bedoelt of je ze gewoon kunt gebruiken, natuurlijk ze staan bovenaan dezelfde klasse dus kun je ze altijd aanroepen, als ze nou in een methode zaten was het anders.

[ Voor 30% gewijzigd door MachoM op 31-05-2003 21:18 ]


Verwijderd

Topicstarter
zou iemand mij kunnen helpen om gewoon het script te kunnen afmaken....

dit is de code die ik op dit moment heb

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package projectbal;

import java.awt.*;
import java.awt.event.*;
import java.applet.*;

public class Applet1 extends Applet implements Runnable {
  int x,y,dx,dy,diam,sizex,sizey;
  private int xb = 50, yb = 100, lb=100 , hb=25;

  public void init () {
    setBackground (Color.white);

    x=10;
    y=52;
    dx=dy=2;
    diam=20;

    sizex=300;
    sizey=300;

    (new Thread (Applet1.this)).start();

    addMouseMotionListener (new MuisHandler() );
  }

    public void run() {
      while (true) {
        try  {
          Thread.currentThread().sleep(50);
      }
      catch (InterruptedException e) {};

      x+=dx; y+=dy;
      if ((x<=0)||(x+dx+diam>=sizex)) dx=-dx;
      if ((y<=0)||(y+dy+diam>=sizey)) dy=-dy;

      repaint ();
    }
  }

  public void paint (Graphics g) {
    g.setColor(Color.black);
    g.fillArc(x,y,diam,diam,0,360);

    g.setColor (Color.red);
    g.fillRect (xb-10,yb-10,lb,hb);

    }

  public void setXY (int xb, int yb) {
    this .xb=xb;
    this .yb=yb;
    }

    class MuisHandler extends MouseMotionAdapter {
    public void mouseDragged (MouseEvent e) {
      setXY ( e.getX(), e.getY() );
      repaint ();
    }
  }
}


ik weet namelijk wel dat ik iets moet toevoegen of veranderen aan dit
code:
1
2
3
      x+=dx; y+=dy;
      if ((x<=0)||(x+dx+diam>=sizex)) dx=-dx;
      if ((y<=0)||(y+dy+diam>=sizey)) dy=-dy;

maar ik weet niet welke codes hiervoor moet invoeren.
als iemand mij dit wete op te lossen kan ik het vanzelf wel die 10 ballen erbij maken ;) ik wil eerst gewoon 1 bal tegen de balk aan stoten...

Verwijderd

Ik zou er voor de netheid
code:
1
private int x,x2,y,y2,dx,dx2,dy,dy2,diam,sizex,sizey;

van maken. Mocht je vanuit andere klassen toch deze variabelen nodig hebben, dan kan dat mooi met een get/set methode

edit: Ah ja is goed, ik zal er morgen wel even naar kijken :>

[ Voor 14% gewijzigd door Verwijderd op 31-05-2003 21:31 ]


  • MachoM
  • Registratie: April 2003
  • Laatst online: 19-08 15:21
Ehm ja ik zie al een klein foutje:

code:
1
2
3
x+=dx; y+=dy;
      if ((x<=0)||(x>=sizex)) dx=-dx;
      if ((y<=0)||(y>=sizey)) dy=-dy;


anders checkt ie namelijk niet of je bij het einde bent, maar iets anders :)

Verwijderd

Topicstarter
machom kan je me ook vertellen hoe ik tegen het balkje stoot enzo??

bedankt voor de andere reactie:) helpt me weer verder;)

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Mjah sorry dat we zo laat zijn, maar het is en blijft een scriptrequest en die willen we pertinent niet hebben.
Je reply's geven ook al aan waarom niet. Je wilt niet leren, je wilt alleen dat wij helpdesken voor je en je script 1-2-3 in elkaar zetten.
Jammer maar zo gaat het niet :) Dan kunnen we wel bezig blijven en is er voor ons ook geen lol meer aan. :)
Pagina: 1

Dit topic is gesloten.