I thought I’d run a post that is pulled straight from the greenfoot-discuss mailing list. I thought it was a good user story, as it illustrates some of how people “out there” are using Greenfoot, as well as being a fun read. At least, as someone who has taught Java using the Objects First textbook and used Greenfoot in the classroom, I certainly enjoyed the read.

This note comes in from Barry Brown at Sierra College:

I’ve been running a CS11 class this semester using BlueJ. I saw Greenfoot demoed at SIGCSE2 and participated in the Greeps competition.

Once the students completed chapter 4, I thought it would be a perfect opportunity to have a bit of fun and give them lots of practice writing Java. For two weeks, my students tackled the Greeps competition.

A bit of background: my students range in age from 17-ish up to the 40s. I have three high school students among traditional and returning college students. The students’ experience with Java is mixed; some were beginners and others had been exposed to Java before.

I introduced the competition on a Monday. They were shown the Greep class and the inherited methods from Creature. I started them out with a few hints, such as the obvious improvement of having the Greeps turn away from the water or the edge.

On Wednesday (two days later) we had the first round of competition. Of course, I ran the Greep classes on all ten maps. The top five finishers scored 52, 56, 61, 68, and 244. Interestingly, the 244 score was earned by a pair of the high schoolers and falls only 1 point short of the overall winner at SIGCSE.

Next Monday, we ran the Greeps again. This time the top five scores were 150, 174, 195, 215, and 254. The top two scores were earned by the same pair of students who were the top scorers in the first round. (They decided to split up and run their Greeps separately. Later, I would find it was a carefully calculated strategy to win.) Nearly all of the students had figured out how to get the Greeps to stop at the tomato piles and most had some kind of algorithm to steer them around the water.

Finals were on the following Wednesday. As with the SIGCSE competition, we did best-of-three for the finalists. The top five scores were 198, 206, 230, 236, and 281 with the top two scores being earned by the same two high school students.

Feedback from the students were overwhelmingly positive. Memorable quotations:

This was a lot of fun.

Much more fun than BlueJ.

I spent more time on Greeps than my other classes.

All students got a lot of practice invoking methods, reading documentation, writing loops and conditionals, and learning to make use of limited resources. In fact, by the time we got to Chapter 8, the subject matter of inheritance was easy and obvious. They had seen it all before in Greeps!

Kudos go to the Greenfoot team. Playing with Greeps was a fun break from the BlueJ exercises. I’m not sure if I would use Greenfoot exclusively next time, but I’m really leaning toward mixing BlueJ and Greenfoot.

What I like about this post is not just that it is a positive reflection of the use of Greenfoot in the classroom, but that Barry has provided a glimpse of his thoughts on how he would use it in the classroom in the future. The notion of mixing Greenfoot in with exercises from the Objects First textbook is certainly a good one, and might provide some good direction for a set of companion modules that instructors might use throughout the text for enrichment.

Also, what I think is even cooler was the constructivist learning that took place through the use of the Greeps competition. In particular, the students were not phased by the notion of inheritance when they saw it in the text because they had leveraged it throughout the Greeps competition. The purpose of the competition was to score points; however, the students were willing to tackle new learning in their attempt to score more points in the Greeps competition. This kind of self-driven, authentic learning is (in my opinion) the most powerful kind of learning an instructor can encourage in their classrooms. It usually requires giving students ill-defined challenges, and being willing to relinquish some control over how things will progress… but the rewards in terms of learning outcomes can be significant.

So, very cool stuff. That’s it for today, but in my next post, I really want to dive into a new feature in Greenfoot: the ability to export projects for sharing on the web! This is at the heart of the MyGame site, and will factor heavily into what I’m working on over the next few months. I think it is awesome, and before I’m done, I expect you will too.


Footnotes

1 CS1 is shorthand in the USA for a first course in computer science. It often implies a programming-intensive course, but not always. (back)

2 SIGCSE is the ACM Special Interest Group in Computer Science Education. When used in this way, “SIGCSE” implies the annual conference held in the USA each spring. Roughly 1400 computer science educators from all over the world, typically working with high-school and university-level students, attend. (back)

Somehow, we went from day -1 to day 2. In truth, I should have labeled “Day -1″ as “Day 0″, at which point things would make more sense.

*cough*

Today we’ve had a great response on the Greenfoot competition; in fact, things have been hotting up all afternoon as people come and go from the Sun Microsystems booth with their improved Greep programs. Sadly, I was too busy handling questions when we had really big crushes, but I do have some snapshots of the booth. I’m using the camera built into my MacBook, which is nothing to write home about… but it’s good enough for blogging!

Photo 3

Me!

MyPicture

The booth (or part thereof)

Photo 2

Ian and Poul

So, it’s good fun. I’m certainly having a good time, and lots of friends are coming by to say hi, and in some cases, be surprised by Greenfoot. It is awesome.

So, like a good Greep, I’m going to go tomato-hunting…


Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2020

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2020

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2392

Warning: implode() [function.implode]: Argument must be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3345

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3368

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3368

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3409

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3461

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3461

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3606

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3606

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2020

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2020

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2392

Warning: implode() [function.implode]: Argument must be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3345

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3368

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3368

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3409

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3461

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3461

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3606

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3606

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2020

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2020

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2392

Warning: implode() [function.implode]: Argument must be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3345

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3368

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3368

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3409

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3461

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3461

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3606

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3606

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2020

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2020

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2392

Warning: implode() [function.implode]: Argument must be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3345

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3368

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3368

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3409

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3461

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3461

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3606

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3606

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2020

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2020

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2392

Warning: implode() [function.implode]: Argument must be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3345

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3368

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3368

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3409

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3461

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3461

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3606

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3606

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2020

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2020

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2392

Warning: implode() [function.implode]: Argument must be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3345

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3368

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3368

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3409

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3461

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3461

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3606

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3606

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2020

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2020

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2392

Warning: implode() [function.implode]: Argument must be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3345

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3368

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3368

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3409

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3461

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3461

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3606

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3606

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2020

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2020

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 2392

Warning: implode() [function.implode]: Argument must be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3345

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3368

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3368

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3409

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3461

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3461

Warning: array_keys() [function.array-keys]: The first argument should be an array in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3606

Warning: Invalid argument supplied for foreach() in /home/jadudm/sububi.org/wp-content/plugins/wp-syntax/geshi/geshi.php on line 3606
All the world’s a stage, and this quote, often abused.

M. Jadud

What can an Actor do? Not as pressing a question as What Would an Actor Do? (WWAD?), but certainly an important question never-the-less. I want to remind the gentle reader that I have many grand schemes about great, sweeping themes and stories about agent-based programming in Java using Greenfoot… but at the moment, I’m just wandering around. And in my wanderings, I’d like to make the mushrooms in my LumpWorld wander around, too.

Of course, I don’t know how to do that. I could try and use Google to find out how, or I could go back and read the tutorial. However, I want to try something a little different. I’ll read some documentation.

Now, I know some of you are saying “Matt! Reading documentation! That’s awfully extreme, isn’t it?” Well, my friends, it is. Very extreme. And, for the record, it is very, very exciting. And Greenfoot has plenty of documentation hidden inside it, if you know where to look.


greenfoot-actor-classes

Documentation be hidden in them thar classes…

Lets start with the Actor class. If I double-click on the Actor class, I get a whole mess of Java.


greenfoot-mess-o-java

Double-clicking the Actor class yields a mess-o-Java.

This mess-o-Java is not for the faint-of-heart. If you look at the top of the file, you’ll see that it is written by @author Poul Henriksen, which means that a crazy person wrote that code. And we all know what happens when crazy people write software. So be careful if you spend any serious time looking at this code. What is more interesting is in the upper-right-hand corner of this window: a little drop-down menu. It has two options: Implementation and Interface Go ahead and select Interface.


greenfoot-interface-documentation


Documentation regarding the Actor class.

This is more like it! The interface documentation tells us about all the things we can do with an Actor object. For example, in my last example, I used the setRotation method; we can see that it is documented here, and not just in the Wombats tutorial. Along with it is a method called setLocation. The method summary is really quite straight-forward:

void setLocation(int x, int y)
          Assign a new location for this object.

This method consumes two integers, and returns nothing. I’m guessing it is a magic teleport method, and probably should have been called magicTeleporter(int x, int y), because it will magically make your Actor jump to anyplace in the Greenfoot World. I’m going to take my existing act() method:

public void act()
    {
        lump_rotation = lump_rotation + 1;
        setRotation(lump_rotation);
    }

and I’m going to modify it just a bit. I’m going to make my mushrooms wander around while they’re rotating.

A first attempt

The neat thing about sitting down to a piece of software as rich as Greenfoot is that you can find things you don’t expect. Put another way, I can come to the table with all kinds of assumptions, pre-conceived notions, and expectations about how Greenfoot should or will work, and then be surprised when it doesn’t work that way. Since the point of this blog is to wander around Greenfoot “kicking the tires” (so to speak), I might as well talk about some of my failures along side some of my successes, no?

Here was my first attempt at making a Lump that would march across the screen:

public class Lump extends Actor
{
    private int lump_rotation;
    private int lump_X;
    public Lump()
    {
       lump_X = getX();
    }
 
    public void act()
    {
        lump_rotation = lump_rotation + 1;
        setRotation(lump_rotation);
        // Move the Lump around!
        lump_X = lump_X + 1;
        setLocation(lump_X, getY());
    }
 
}

My previous post explored making my Lumps rotate around their axes; this would have them spinning and marching around. However, this code has a significant problem that didn’t really make sense to me at first:

java.lang.IllegalStateException: The actor has not been inserted into a world
                                 so it has no location yet. You might want to look at the
                                 method addedToWorld on the Actor class.
	at greenfoot.Actor.failIfNotInWorld(Actor.java:537)
	at greenfoot.Actor.getX(Actor.java:103)
	at Lump.<init>(Lump.java:23)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
	at greenfoot.core.WorldInvokeListener$2.run(WorldInvokeListener.java:150)

You see, I put the call getX() in the constructor for my Actor. (The constructor is a special Java class method that is called when a new object is created. It always has the same name as the class—in this case, it is called Lump().) When I right-click to create a new Lump() object, everything is fine… until I try and put it in the world. At this point, the object is created, but it doesn’t yet exist in the world. So, everything goes badly for my Lump, and this exception is thrown.

That’s cool. Since this post is about reading documentation, I then went back to the documentation I mentioned earlier and started reading. Sure enough, the docs tell me that I can’t do what I tried to do. Because I’m a slow monkey, it looks like the documentation might become even more explicit about this point—that would be cool. While reading more carefully, I discovered the addedToWorld() method. This fits in thusly:

  1. You right-click to create a new Actor object
  2. You drop your Actor on the World
  3. Your Actor’s constructor is called
  4. Your Actor’s addedToWorld() is called

Now, I’m sure other nifty things happen in there, but this is enough for us to be getting on with.

A second attempt

Now that I’ve learned to stop fearing Greenfoot, and learned to love the documentation, my life has been much, much better. My next attempt at making my Actor wander around was much better.

public class Lump extends Actor
{
    private int lump_rotation;
    private int lump_X;
    public Lump()
    {
 
    }
 
    public void addedToWorld(greenfoot.World world) {
       lump_X = getX();
    }
 
    public void act()
    {
        lump_rotation = lump_rotation + 1;
        setRotation(lump_rotation);
        // Move the Lump around!
        lump_X = lump_X + 1;
        setLocation(lump_X, getY());
    }
 
}

Now, my Lump correctly drops into the World! Woot! What happened next, however, was not expected; I’ve created a video to demonstrate what I encountered next.


greenfoot-exception-image

A video of my first Greenfoot exception! (6.9MB, right-click to download.)

An exception! In particular, this text popped up on my screen: