This site requires JavaScript, please enable it in your browser!
Greenfoot back
Sfven
Sfven wrote ...

2021/3/6

Help with volume bar

Sfven Sfven

2021/3/6

#
Hi all. My code seems to be working fine except for line 26 of the VolumeBar class. Whenever I actually click VolumeUp, the if loop in line 26 does not execute. I don't know why; it's probably pretty simple, but I'm missing it. Also, for our homework it is required that refreshVolumeBar() only execute when one of the volume buttons is pressed, it cannot just be spammed in the act method. Here is VolumeBar class:
// VolumeBar class

import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class VolumeBar extends Actor
{
    //MyWorld world = ((MyWorld)getWorld());
    private GreenfootImage bar = new GreenfootImage(130, 15);
    private int volume = 50;
    
    VolumeBar()
    {
        bar.drawRect(0, 0, 175, 20);
        bar.setColor(Color.BLACK);
        bar.fillRect(1, 1, 200, 19);
        
        bar.setColor(Color.GRAY);
        bar.fillRect(6, 6, 100, 4);
        
        bar.setColor(Color.CYAN);
        bar.fillRect(6, 6, volume, 4);
        
        setImage(bar);
    }
    
    public void act() 
    {
        if ((Greenfoot.mouseClicked(VolumeUp.class)))
        {
            refreshVolumeBar();
        }
    }    
    
    public void refreshVolumeBar()
    {
        MyWorld world = ((MyWorld)getWorld());
        volume = world.getVolume();
        bar.clear();
        
        bar.drawRect(0, 0, 175, 20);
        bar.setColor(Color.BLACK);
        bar.fillRect(1, 1, 200, 19);
        
        bar.setColor(Color.GRAY);
        bar.fillRect(6, 6, 100, 4);
        
        bar.setColor(Color.CYAN);
        bar.fillRect(6, 6, volume, 4);
        System.out.println("Volume Bar Refreshed; new volume: " + volume);
    }
}
and here is VolumeDown class:
// VolumeDown class

import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class VolumeDown extends Actor
{
    
    VolumeDown()
    {
        setImage("image_button_volumeDown.png");
    }
    
    public void act() 
    {
        changeVolume();
    }    
    
    public void changeVolume()
    {
        MyWorld world = ((MyWorld)getWorld());
        if ((Greenfoot.mouseClicked(this)) && (world.getVolume() > 0))
        {
            System.out.println("changeVolume (down)");
            world.adjustVolume(-2);
        }
    }
}
and here's VolumeUp class:
// VolumeUp class

import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class VolumeUp extends Actor
{
    VolumeUp()
    {
        setImage("image_button_volumeUp.png");
    }
    
    public void act() 
    {
        changeVolume();
    }    
    
    public void changeVolume()
    {
        MyWorld world = ((MyWorld)getWorld());
        if ((Greenfoot.mouseClicked(this)) && (world.getVolume() < 100))
        {
            System.out.println("changeVolume (up)");
            world.adjustVolume(2);
        }
    }
}
Any help is appreciated ;) Also, how would one execute refreshVolumeBar() from within another subclass, like VolumeDown or VolumeUp, because I think that might be a better approach to this?
Sfven Sfven

2021/3/6

#
Shoot I meant line 28, not 26
danpost danpost

2021/3/6

#
The mouseClicked method requires an Actor object (or null), not a class. You could try this:
if (Greenfoot.mouseClicked(null))
{
    Actor mouseActor = Greenfoot.getMouseInfo().getActor();
    if (mouseActor != null && mouseActor instanceof VolumeUp)
    {
        ...
You need to login to post a reply.