Archief - Snel vraagje ivm automatisch laten bewegen van voorwerpen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

boro

Legacy Member
Hoihoi!

Ik ben op het moment bezig om een spelletje te ontwerpen voor school (herexamens :\) en ik zit op het moment even vast..

Het deel waar ik nu aan bezig ben is simpel: mijn veld bestaat uit een rooster (array) en bovenaan in het rooster valt er een druppel naar beneden (automatisch). Wanneer de druppel de onderste rij van het rooster raakt moet hij verdwijnen en moet er bovenaan aan nieuwe druppel vertrekken.

Ik ben al zover dat de druppel valt maar wanneer deze de grond raakt blijft hij daar liggen en gebeurd er niets meer. Iemand enig idee hoe ik dit kan verhelpen?

Ik werk met een tick in mijn Model klasse (Model-View-Controller) die er zo uitziet:

Code:
public void tick()
    {
        for(int i=0;i<breedte;i++)
        {
            for(int j=hoogte-2;j>=0;j--)
            {
                Item item = rooster[i][j];
                
                if(item instanceof Druppel)
                {
                    Druppel druppel = (Druppel)item;
                                            
                    if(rooster[i][j+1] == null)
                    {
                        rooster[i][j+1] = item;
                        rooster[i][j] = null;
                    }
                }
            }
        }
    }

De klasse Item bevat verschillende voorwerpen die op het scherm komen zoals bijvoorbeeld de druppel. (dmv erving)

Zou iemand me kunnen helpen? Als je meer info nodig hebt: laat aub weten!

Mvg

NeverwinterX

Legacy Member
Tja ik zie ook geen code om de druppel te verwijderen (of wat er ook mee moet gebeuren) als hij beneden is, dus dan is het logisch dan hij niet zomaar verdwijnt. Een zetje: als positie (i,j) de onderrand is, doe dan ...

Voorts zie ik een instanceof en dat wijst erop dat het design vermoedelijk beter kan, maar dat is meer iets voor later.

nameless

Legacy Member
En ik neem aan dat tick methode opgeroepen wordt door een timer? Ga je de waarde van de y-positie niet gewoon moeten verhogen bij elke tick?

Nu gaat de druppel toch 1 keer van boven naar beneden vallen.

boro

Legacy Member
Ja inderdaad, die druppel viel maar 1x en dan was het gedaan: ik heb de code wat aangepast: nu blijft hij vallen maar het probleem is nu nog dat hij ook vanonder op de laatste rij van het rooster blijft liggen en met de code achter // krijgt ik dit niet verholpen... Enig idee?

Code:
public void tick()
    {
        for(int i=0;i<breedte;i++)
        {
            for(int j=hoogte-2;j>=0;j--)
            {
                Item item = rooster[i][j];
               
                if(item instanceof Druppel)
                {
                    Druppel druppel = (Druppel)item;
                    
                    if(j+1==17) 
                    {
                        [COLOR="Red"]//rooster[i][j] = null;[/COLOR]
                        int xBegin = 4;
                        rooster[xBegin][0] = item;
                    } 

                    if(rooster[i][j+1] == null)
                    {
                        rooster[i][j+1] = item;
                        rooster[i][j] = null;
                    }
                }
            }
        }
    }

SavaB

Legacy Member
1. Ik neem aan dat druppel overerft van Item? Dan gebruik je beter
Code:
dynamic_cast<druppel *>(item);

2. In een for lus ga je geen objecten kunnen verwijderen uit de lijst waar je in loopt (logisch). Dus ga je een pointer moeten bijhouden naar het object dat je wilt verwijderen, en na de loop moeten checken of de pointer is ingevuld: zo ja, verwijder je hem, zo niet, laat je het voor wat het is.

boro

Legacy Member
Nice SavaB! Dankjewel ;) dat wist ik nog niet.. Ik heb de code dus zodanig aangepast:

<in de methode tick aangepast>
Code:
if(j+1==17) 
                    {
                        druppel.weg();
                        iOnder = i;
                        int xBegin = 4;
                        rooster[xBegin][0] = item;
                    }

<in de methode tick onder de for-lussen toegevoegt>
Code:
if(druppel.isWeg() == true)
        {
            rooster[iOnder][17] = null;
        }

<en in mijn klasse Druppel toegevoegt>
Code:
private boolean onder;

public void weg()
    {
        onder = true;
    }
    
    public boolean isWeg()
    {
        return onder;
    }

En ivm die dynamic_cast.. De methode wat ik gebruik is die wat we hebben aangeleerd in school dus zal ik beter die gebruiken denk ik :p Zolang het werkt ben ik al heel tevreden! :p

Volgende stap is het naar links en rechts bewegen van de druppel! Maar ga eerst zelf wat prutsen!

Cycloon

Legacy Member
SavaB zei:
1. Ik neem aan dat druppel overerft van Item? Dan gebruik je beter
Code:
dynamic_cast<druppel *>(item);

Volgens mij gebruikt die java en geen c++ :p

boro

Legacy Member
Ok, ik heb een Controller klasse ingevoerd in het project maar nu elke keer als ik naar links of rechts wil bewegen komt er een nieuwe druppel (die wel verplaatst is)... Heb vanalles zitten proberen maar ik zit redelijk vast :s


<in de controller klasse een keylistener>
Code:
switch(e.getKeyCode())
        {
            case KeyEvent.VK_LEFT:
                model.links();
                view.repaint();
                break;
            case KeyEvent.VK_RIGHT:
                model.rechts();
                view.repaint();
                break;
        }


<in de model klasse volgende methodes ingevoegd>

Code:
protected void beweeg(int dx)
    {
        try
        {
            doelX = druppel.getX() + dx;

            [COLOR="Red"]xDel = druppel.getX();[/COLOR]
            druppel.beweegNaar(doelX);
        }
        catch(Exception e) {}
        
        rooster[doelX][druppel.getY()] = druppel;
        [COLOR="Red"]rooster[xDel][druppel.getY()] = null;[/COLOR]
    }
    
    public void links()
    {
        beweeg(-1);
    }
    
    public void rechts()
    {
        beweeg(1);
    }

-> met het rode deel heb ik wat zitten proberen maar het werkt niet

<in de druppel klasse komt volgende methode bij>

Code:
public void beweegNaar(int nieuweX)
    {
        x = nieuweX;
    }


Mijn volledige code is hier terug te vinden: MEGAUPLOAD - The leading online storage and file delivery service
Ik programmeer in BlueJ...

NeverwinterX

Legacy Member
Het probleem zit hem in het feit dat je de y waarde in Druppel nooit update. Bij elke tick zou je die moeten verlagen. Voorts zet je een druppel op "weg" als die beneden is, maar je laat die vanboven terug beginnen: dan mag die natuurlijk niet meer "weg" zijn. Ook vraag ik mij af waarom je over het hele boord loopt in tick om de druppel te verplaatsen als er toch maar 1 druppel is.

boro

Legacy Member
Ah maar in de klassa Druppel staat ook dit he:

Code:
public Druppel(int startX,int startY)
    {
        x = startX;
        y = startY;
        onder = false;
    }

Dan wordt die onder toch gereset?

En hoe bedoel je met als er maar 1 druppel is? En die y-waarde kan ik inderdaad nog bijhouden door gewoon hetvolgende toe te voegen:

Code:
if(rooster[i][j+1] == null)
                    {
                        rooster[i][j+1] = item;
                        rooster[i][j] = null;
                        druppel.updateY(j);
                    }

public void updateY(int nieuweY)
    {
        y = nieuweY;
    }

Maar ik weet niet zo goed waarom dat mij helpt in mijn probleem :D

NeverwinterX

Legacy Member
boro zei:
Ah maar in de klassa Druppel staat ook dit he:

Code:
public Druppel(int startX,int startY)
    {
        x = startX;
        y = startY;
        onder = false;
    }

Dan wordt die onder toch gereset?

En hoe bedoel je met als er maar 1 druppel is? En die y-waarde kan ik inderdaad nog bijhouden door gewoon hetvolgende toe te voegen:

Code:
if(rooster[i][j+1] == null)
                    {
                        rooster[i][j+1] = item;
                        rooster[i][j] = null;
                        druppel.updateY(j);
                    }

public void updateY(int nieuweY)
    {
        y = nieuweY;
    }

Maar ik weet niet zo goed waarom dat mij helpt in mijn probleem :D

Die wordt niet gereset, dat is enkel als je een nieuwe Druppel aanmaakt dat die dan start als "niet weg". Maar je hergebruikt uw druppels dus dan moet je dat veranderen (ofwel nieuwe druppel maken ofwel een soort "terug" methode, niet bepaalde goede methodenamen trouwens maar bon).

Wel waarom loop je in tick over het hele bord om de druppel te zoeken als er toch maar 1 druppel is? Waarom verlaag je niet direct de y positie van die ene druppel (en dat natuurlijk ook aanpassen in het bord) ipv die eerst te zoeken in het bord. (Als er geen andere zaken moeten gebeuren natuurlijk, als er later nog dingen bijkomen kan het wel steek houden om over het hele bord te loopen.)

Dat lost het probleem op omdat de y-waarde in druppel op het start niveau bleef. Dus als je in beweeg "rooster[doelX][druppel.getY()] = druppel;" deed, dan plaatste dat een druppel op de verkeerde y positie en bovendien werkte "rooster[xDel][druppel.getY()] = null;" niet goed omdat die druppel.getY() een verkeerde waarde teruggaf: je verwijderde de druppel waar die niet meer was. Allez ik neem aan dat het nu toch opgelost is, ik had het hier gisteren even getest en dat werkte (moet het trouwens niet druppel.updateY(j+1) zijn?).

Probeer wat beter te debuggen, ik weet niet in hoeverre dat gaat in BlueJ, plaats desnoods wat printouts om zelf beter te analyseren wat er gaande is.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan