Bouncing ball spelletje

Status
Niet open voor verdere reacties.

suikerklontje

Gebruiker
Lid geworden
4 dec 2007
Berichten
75
Goede avond,

Ik ben voor de fun een simpel java spelletje in elkaar aan het zetten. Om een lang verhaal kort te maken, hier een screenshot
bouncing ball
bouncingball.jpg


Zodra de bal op het plankje komt stuitert de bal weer omhoog.
Om te controleren of de bal op het plankje komt en de bodem raakt doe ik de volgende controles

#1 De bal moet een y coordinaat hebben met de hoogte van de grond om te mogen stuiteren aan de onderkant.

om het plankje wat breeder te maken dan 1 pixel moet de bal vallen in een range van middelpunt -18 en middelpunt +18
#2 De bal moet vallen op de x coordinaat van het plankje -18 of groter.
#3 De bal moet vallen op de x coordinaat van het plankje +18 of kleiner

..........plankje..........
===============
L-18...... X........R+18

X middelpunt coordinaat
L = Links
R = Rechts

In de klasse balletje staat deze logica(aangegeven met comment)

Nu weet ik niet zeker of bovenstaande informatie van toepassing is op mijn probleem. Toch zet ik het neer om een compleet beeld te krijgen van de situatie.

Het volgende probleem doet zich voor:

In sommige gevallen gaat de bal recht door het plankje heen. Om het te illustreren heb ik de klasse balletje, plankje, paneel en ping pong(startklasse) als bijlage toegevoegd aan deze post en de bal en het plankje in de juiste positie gezet zodat als je de applicatie opstart je in de eerste 3 seconde het probleem ziet mits je het plankje niet verschuifd met de pijltjes toetsen.

Het vreemde is dat als ik in paneel in mijn thread (die het balletje laat bewegen) een sleep time gebruik van 4 of lager het probleem zich niet voordoet. Zodra het hoger is gaat de bal in de huidige setting recht door het plankje heen (en dat terwijl het beukehout is).

Misschien kan het ook op een totaal betere wijze geprogrammeerd worden, in dat geval sta ik open voor tips. Wel zal ik graag willen weten hoe ik middels de methodes die ik gebruikt heb dit probleem zou kunnen oplossen.

download en unbug me

Alvast heel erg bedankt,
 
Laatst bewerkt:
Is er iemand??? Hopelijk komt er nog een java geek voorbij op deze post want heb werkelijk geen idee wat ik aan dit probleem kan doen...

vg,

Suikerklontje.
 
Gedult is een mooie zaak!

Ik heb al iets gelijkaardig gehad: http://www.helpmij.nl/forum/showthread.php?t=383925 (de oplossing voor jou probleem staat iets lager op die pagina) Mijn bewegende bal ging ook door een muur, oplossing:

Skinflowers zei:
Je gebruikt verschillende threads, die dezelfde variabelen gebruiken. Terwijl de ene thread de variabele wijzigt, probeert de andere deze te lezen. Hierdoor kan je rare effecten krijgen. Je functie die de bewegingen controleert alleen de echte grenzen. Een combinatie van beide geeft dat je soms door een muur heen kan. Een eenvoudige oplossing is om je variabele volatile te maken. (dit zal het wel langzamer maken, omdat je variabele niet in het register wordt gehouden, maar steeds wordt opgehaald uit het geheugen...

Je xmincontrole enz. kan ook efficienter. Je kan adhv je coordinaten wel terug rekenen in welke veld je zit. Hoefje niet elke keer alle velden af.

gr.

(ik weet niet of dit de juiste uitleg bij jou is maar je kan het proberen)
 
Een probleem is dat je setBounds() gebruikt in je balletjes. Hiervoor neem je getHeigth() en getWidth() van Paneel. Maar je paneel kan pas deze waarden geven als het paneel getekend is...

Je moet dus eerst het paneel laten tekenen en het starten van het spelletje uitstellen. Dit laatste doe je met SwingUitlities.invokeLater(..).
Ik zal je code deze week wel even aanpassen.. Maar heb zelf eerst een deadline.... :(
 
Bedankt Stienno voor je reactie. Het probleem dat jij had is niet bij mij het geval omdat ik alles aanstuur middels 1 thread. Wel staat er in jou topic erg veel nuttige informatie die ik ook voor mijn spel kan gebruiken.

En skinflowers... bedankt voor je info. Ik had niet gedacht dat het aan de getHeight functie zou liggen, maar zoals jij het uitlegd klinkt het best logisch dat het daaraan ligt. Het SwingUitlities.invokeLater(..) heb ik nog nooit gebruikt. Ik ga is ff flink googlen. Bedankt alvast voor je reactie met verbeterde code.
 
Hoi,

Ik heb wat aanpassing gedaan. Ik het balletje thread save gemaakt en heb her en dat wat code verschoven,zodat eigenschappen van object bij elkaar staan.
Bv de breedte van het plankje is alleen bekend in klasse plankje en niet meer in balletje..

Als je een plankje aanpast hoef je dat maar op een plaats te doen..
 

Bijlagen

  • pingpong.zip
    2,8 KB · Weergaven: 24
Hartelijk dank voor het kijken naar mijn code.

Wat ik erg interessant vond was het toevoegen van syncronised in methodes in plankje en het gebruik van volatile. Ik heb het gegoogled en weet nu wat het is.

Wat mij opviel was dat je in de klasse pingpong als comment neer zet: '(Swing is niet thread save)' Wat bedoel je hier precies mee?

Erg bedankt voor je hulp iig.
 
Als je swing gebruikt moet je altijd opletten dat je als je tekent of een swing component aanpast, dit gebeurt in "event dispatch thread" (=edt)

Deze edt wordt door java zelf gebruikt voor alle swing handelingen. Omdat dus alle swing code in deze thread plaats vindt hoeft java geen synchronized/volatile te gebruiken voor zijn variabelen. (synchronzed/volatile is nml erg langzaam!).

Alle events die jou programma krijgt lopen in edt. Dus mag je hier altijd swing componenten gebruiken.. Er is echter een plaats in je programma die niet loopt in de edt, nml de main functie.. Dus hier mag je dus geen swing code gebruiken!.. als je dit toch doet kan het fout gaan.. Als je toch swing code wil gebruiken in je main functie moet je invokeLater() gebruiken. Deze functie genereerd een event die loopt op de edt.. en waar je dus weer swing mag gebruiken...

Eigenlijk moet je in de main altijd invokeLater gebruiken.. en je niet afvragen waarom... ;)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan