Parallax

by Ron Gilbert
Apr 01, 2015

First of all, I know this is a little off topic, but I always want to spell "paralaxx" with two x's, not two l's.  I don't know why, but I can't spell for shit, so just ignore me on all spelling related issues.

Quick post today with a short video showing parallax scrolling and actor scaling.

Parallaxing creates a nice sense of depth by just having the foreground and background layers scroll at different rates. To keep things simple, I set it up so there are two foreground and two background layers. It made the code a little easier to have a fixed number, and I don't think we'll need more.

This also shows actor scaling, which will allow Gary to create room layouts that have some depth and dimension. Actor scaling wasn't introduced in the SCUMM system until Monkey Island.

The foreground bushes are my crappy programer art.

Here is some code porn from the engine:

void Room::renderLayer(int layer)
{
    if (_images[layer]) {
        _images[layer]->renderAt(GGPoint(-((_cameraPos.x-(_roomScreenSize.x/2.0f))*
                _imageParallax[layer])-(_roomScreenSize.x/2.0f), 0.0f));
    }
}

Simple things excite me.

- Ron



Natalija1999 - Apr 01, 2015 at 09:38
I got one question Ron: Can I play Monkey island on android? Is it possible to play it on phone using scumm?

Beforan - Apr 01, 2015 at 09:49
ScummVM has been ported to Android, and should probably be your first port of call for SCUMM games (and many other adventure games) on any platform these days.

http://wiki.scummvm.org/index.php/Android/Guide

You'll need to get the data files from a copy of the game you own, but the ScummVM wiki has good guides on which files are needed and which aren't, if you're pulling them from a CD-ROM edition, for example.

Natalija1999 - Apr 01, 2015 at 10:06
Thanks! Hope I'll play it on phone one day! :)

Dustin - Apr 01, 2015 at 10:00
Is this an April fool's joke?

Steffen - Apr 01, 2015 at 10:29
If so it has got to be the worst I've seen so far today.

Rob Carlson - Apr 01, 2015 at 13:46
Ron never does April Fool's Day jokes, it's his explicit policy. If anything he made extra sure to put up a normal post today just to combat April Fool's Day.

entropy - Apr 01, 2015 at 09:45
Really nice, Ron!

BTW, isn't there a clever trick that avoids that moonwalk effect?
Maybe it's just a very minor thing but *I* find it annoying when the
foot is not fixed to the ground during walking.

Isn't there a clever way to adapt the animation frequency of the feet
with velocity of sprite movement?

Steffen - Apr 01, 2015 at 10:28
Hmm.

I agree with you on that it looks weird but somehow I also like the effect which makes the game feel 1987-ish, I guess...

Ciantic - Apr 01, 2015 at 12:29
This is first time you see character getting smaller, I'm sure they will refine it.

Damian - Apr 01, 2015 at 10:03
"Paralaxx" looks like a retro C64 game name...

Oliver Bachmann - Apr 02, 2015 at 09:19
Sounds a bit like Interplay :)

José Malvárez - Apr 01, 2015 at 11:13
Just wanted to say that this blog is amazing and perfect for people like me who love your adventure games and want to make one. Thanks!!

Alessander - Apr 01, 2015 at 12:24
+1
I dream of a world in which Ron Gilbert licenses his amazing engine as open source, so us underlings may have some fun following his wisdoms and pretending to make a game.

natalija - Apr 02, 2015 at 15:42
I totally agree with you! :-) And I also want Ron to make another Monkey island!! I think he deserves that!

Mattias Cedervall - Apr 01, 2015 at 11:18
That's nice!

I've heard that LucasArts will be resurrected and Ron Gilbert will be the new boss and in charge of creating the first point and click-adventure game with a Star Wars-theme.

NylonGamer - Apr 01, 2015 at 12:04
aprils fool?

Mattias Cedervall - Apr 01, 2015 at 12:14
I was born in September so I guess that makes me an September fool.

Grafekovic - Apr 01, 2015 at 12:17
I can't wait until this day is over.

Andy - Apr 02, 2015 at 05:37
No please no Star Wars shooting games anymore...

Jalte Sørensen - Apr 01, 2015 at 12:09
When I watch that video it transports me back to the early 90s to the old school adventure games :-)

Brian S - Apr 01, 2015 at 12:26
This is really cool.  Thanks for posting.  I'm getting excited for the game.

On your code..  Is a "GGPoint' a "Grumpy Gamer Point"?

I probably shouldn't be, but I'm trying to understand your code.  Why is the Y position of the render always 0.  Is it always 0?  I guess if you don't intend to provide vertical parallax effect, if I'm understanding this correctly.

And _imageParallax[layer] looks like it would be a floating point number, taking a value of 0, for something infinitely distant - seeming not to move as the camera does (like the stars), to 1, for something immediately in front of the camera which moves at the same speed as the camera but in the opposite direction, (the foreground bushes).  Or did I get that backwards.

Augusto - Apr 02, 2015 at 05:32
I'd guess that's the Z coordinate, there's a formula for both X and Y. 0 is the third parameter.

Augusto - Apr 02, 2015 at 05:33
Forget it, yup, the Y is always zero.

Dr. J - Apr 01, 2015 at 12:29
Great!

Mario - Apr 01, 2015 at 12:35
the question is: do we need actor scaling at all? i mean for a MM successor... shouldnt be a MI successor ;-)

Dan - Apr 01, 2015 at 14:12
Why not. Actor sizing is a great idea and the implementation shown in the video looks excellent! Just as the parallax scrolling!

But I have noticed that all the displayed elements in the screen have no consistent pixel sizes and raster. So you can see that the low resolution is only pretended. I hope it will get harmonised for a perfect retro-look.

Rmn - Apr 02, 2015 at 03:20
Indeed, even though the characters' faces may be somehow crumpled on certain scales, I think it's necessary to sustain a consistent look and feel.

But I'm also 100% sure that we're only seeing the very first attempt that assigns the character a "depth" in the room and represents this visually. I don't remember if Ron is using SDL or some other library, but I think the engine is currently just using the library's builtin sprite scaling instead of custom image scaling by Ron.

Tomimt - Apr 01, 2015 at 12:47
Very cool little update. The engine seems to be shaping up very nicely. Ron, do you have a roadmap on the features you're hoping to implement before you start the full scale production? Or maybe I've missed that post, but if I haven't, it would be nice to see one post about that subject: what needs to be in before you start production and what you can implement later if need arises.

Peter Campbell - Apr 01, 2015 at 13:42
I really like the starry sky in the background and the different shades of light/darkness.  It's funny that many developers will spend millions of dollars and who knows how many dozens of work hours in order to render each individual strand of hair on a character's head, and yet sometimes simple and basic art like what's shown in this video can be just as appealing if not more so.

I didn't know TP was going to feature different scaling and scrolling for the characters and backgrounds/foregrounds so this is a very nice surprise =)

Jammet - Apr 01, 2015 at 13:50
Good. I like that. It allows for so many nice tricks with the background.
Will you have foreground parallax, too? I  know we haven't had that until maybe Indiana Jones and the last crusade, or Monkey Island.
Here's what I mean.

( https://youtu.be/MRzspUTksDk?t=257 ) The bottleship.

smartypants - Apr 01, 2015 at 14:23
> Will you have foreground parallax, too?

Watch the video again and pay close attention.

Jammet - Apr 01, 2015 at 17:41
The best effects are those you don't notice.

My apologies. :)

Kim Jørgensen - Apr 01, 2015 at 15:08
Looks great, ship it!

There was some "actor scaling" in Zak McKracken albeit not within the same room
http://youtu.be/Ju5j4cobIrU?t=1492

Mathias Berglund - Apr 01, 2015 at 16:01
I'm not sure that's really scaling going on there as the character don't really change scale live, just pops up at a different size in the scene.

Mathias Berglund - Apr 01, 2015 at 16:03
Then again, I might be wrong as the character only moves horizontally. I only played Zak very briefly during my youth so I don't really remember.

Text_Fish - Apr 02, 2015 at 04:51
IIRC that's not done by scaling, it's essentially different "actors". They brought in Warwick Davis at great expense for the far away bits and André the Giant did all the close-ups.

Mathias Berglund - Apr 02, 2015 at 09:18
Good one.

Mario - Apr 02, 2015 at 08:11
yes right. ok. lets stick with it ;-)

Christopher Griffin - Apr 01, 2015 at 15:10
I'm dying to know what the pixelated white sign sticking out off of the Quickie Pal says... Rinfeid?

Kim Jørgensen - Apr 01, 2015 at 16:22

Christopher Griffin - Apr 02, 2015 at 10:07
Thanks!  Now that you pointed that out, I remember seeing it in the original post -- it's just that the scaled down version doesn't look anything similar to Restroom.

Ron Gilbert - Apr 02, 2015 at 13:42
This is very very early wire frame art. Gary doesn't spend any more time on these than he needs. We do some as fast as possible to get it into the game.

I.d.iot - Apr 01, 2015 at 15:28
Hey Big R.! (Regarding to graphics) -> will the game look like MM or MI2?

Peter Campbell - Apr 01, 2015 at 19:22
If this was Shadowgate, if the player "looked" inside the hole in the tree a message would probably pop up saying "You peek into the hole in the tree but it's too dark to see what's inside.  Suddenly a vicious were-squirrel leaps out at you and rips your throat out!  You begin to slip into unconsciousness as blood squirts out of your neck.."  ::transition to picture of Death:: "It's a sad thing your adventures have ended here!"  Game over.

Iron Curtain - Apr 01, 2015 at 20:21
However, since this game is supposed to be based on the LucasArts adventures, there's no death (except as a plot device). Not to mention these rules were formalized and formulated by the very person managing this devblog. ;-)

Andy - Apr 02, 2015 at 05:29
A question to Ron: When the character walks to the far distance its seems that the pixels also shrink in size but detail keeps exact, no blocks. Do you strict build on 320x200 screen resolution as back in time, or is there a higher resolution embedded such as 640x400/480?

Ron Gilbert - Apr 02, 2015 at 13:39
The scaling is done in the with OpenGL and on the GPU, so the pixels do shrink in size. Scaling was really hard and time consuming back in the SCUMM days (and it looked like crap).  Scaling today is basically free. I went back and forth on scaling and if I should use hardware or do the old style. I think I'm going to use hardware, there are too many benefits over doing it in software. For of the game, characters will remain at 100%, so it will only for special things, like walking off into the distance.

Fulvio - Apr 02, 2015 at 20:40
I have to say I think the opposite is actually true, the pixel shrinking looks really out of place :S
The SCUMM scaling might have looked like crap, but if you are working with certain resolutions constraints they should be respected, imho

Ron Gilbert - Apr 02, 2015 at 22:37
Keep in mind that everything we post here are very early, un-pr-sanitized screen shots. My philosophy is to do the easy thing first, then after I've sat with it, more on the the more complex if it's needed.

I do agree that there is something "off" with the current scaling, but I want to think about it for a while. It's not a high priority right now because it's not slowing down our ability to move forward on the game. It's just a visual tweak that can happen 12 months from now. A lot of stuff is like that. You know you can solved the problem, so it just sits while you tackle more important and risky stuff.

I have thought about doing a pixel-retro™ mode that forces the pixels and truly renders everything in 320px res. If someone wanted that, they can turn it on, or maybe it's on by default and the players can turn it off.  Again, not a high priority, I have more pressing things to do in the short team.

Leon Ortegas - Apr 03, 2015 at 15:39
I agree with Fulvio that the hi res rendering makes it look weird as it is, and I worry that if you bolt it on later on that the low res view will not look as good as it otherwise would if the game were developed in 320*2x0.

Beside the scaling thing, the position of actors, objects, parallax planes, and the cursor should IMO always fall on an integer low resolution pixel boundary, otherwise you'll get glitches that will break the "old school" illusion.

As of now, you could start rendering in a small, off screen buffer and stretch it in a nearest neighbor fashion.

Fulvio - Apr 03, 2015 at 17:51
Indeed. I started to develop a game on a higher resolution than the pixel art I was given, and I had to pay the price during mid-development. Pixel shrinking, and half-pixel scrolling started to be noticeable, and instead of coding a pixel snapping functionality I opted to redo everything in the intended resolution, in the end. "honor and respect the pixels" is my motto since then :)

Nosebleed Forthteal - Apr 04, 2015 at 06:32
A simple way to ensure things look good in low resolution would be to use integer math in 320-space for layout and scaling.

Squrirrel supports integers out of box, I don't know if the / operator respects the types, though.

Michael Grafl - Apr 03, 2015 at 18:04
Speaking of visual tweaks and retro modes: have you considered using a shader to make the final output resemble the look of a CRT screen from the 80s? I'm a fan of low resolution graphics in video games, but on modern screens they tend to look a bit harsh, losing quite a bit of their charm.

I did a quick search and found this site: http://filthypants.blogspot.co.at/2013/04/multipass-shaders-ntsc-motion-blur-and.html

Some of those shaders give the image a really warm, nostalgic quality. You could make such a shader optional, too.

Just a thought.

Horace - Apr 04, 2015 at 19:50
My two cents as a player:

I feel like this issue is actually of some philosophical importance to the project's original promise ("It will be like opening a dusty old desk drawer and finding an undiscovered Lucasfilm graphic adventure game you’ve never played before"), which made it sound like your ambition was for the game to be more than just fashionably "retro," but to actually have its own kind of anachronistic integrity.

At least to my eye, the visual force of pixel graphics is in the fact that everything onscreen exists within a unifying grid structure. The resolution constraints of the 80s didn't just happen to inspire the "pixelly" style that people remember fondly: the constraints WERE the style. Jaggedness and boxy-ness are just superficial consequences of the larger principle that gives it aesthetic meaning and power.

When modern "retro" games have objects made of big jagged "pixels" but still render in high-resolution and do away with the grid, they reveal themselves to be, at some level, fakes, merely exercises in nostalgia. Since the visual style doesn't have any deep coordinating integrity, it's intuitively clear that the designers didn't arrive at this "pixel" concept on their own terms — they just superficially copied it from another era. As a result, the games end up feeling like second-class creations. As a player, I can't get as invested in something if it's fundamentally an imitation of another thing, instead of confidently being a thing itself. Know what I'm saying?

So, whenever you do get around to it, I urge you to consider making the true 320 resolution mandatory — not to be "pixel-retro™," but actually the opposite: to be aesthetically cohesive, here and now, rather than just dependent on fuzzy sentimental memories.

Lennart - Apr 05, 2015 at 04:26
I also feel that the pixels must stay the same size while scaling. It is an issue that has bothered me every time I came across it in AGS games that ran at a higher resolution. To me it's an immersion breaker. You do no longer see the world through the filter of a retro computers graphic abilities, you now are in a blocky world.  And immersion is very important for a game. It's also the reason why low res graphics work so well for adventure games imho. Your imagination has to do the work and when it does, you're automatically invested. No high res adventure game has ever really done the trick for me. It's like reading a book vs. watching a movie.
Having said that, 16:9 is great.

Kayamon - Apr 02, 2015 at 23:31
Agreed, you really need to restrict the framebuffer to 320x240, and then scale the *final* result up to full-size. Mixing pixel resolutions within a single scene just looks completely fake.

Mathias Berglund - Apr 03, 2015 at 05:33
I agree with you, but it also poses more problems (less so in a 320x200 resolution - and more in a 320x240) due to most people are running with widescreen monitors nowadays. Thoose aspect ratios cause oldschool games art becoming stretched in bad ways. Same goes for the scrolling and mousmovement in the scene which will look less smooth.

Dan - Apr 03, 2015 at 13:50
The game could feature a pillarbox mode, to get a 4:3 aspect ratio on a widescreen display, and an alternative stretch mode, to employ the whole screen.

It's easy to get accustomed to the stretched screen, I think, because the stylized graphics never claimed to be photo-realistic anyway.

Michael Grafl - Apr 05, 2015 at 11:14
Just make it 427x240 then.

Mathias Berglund - Apr 02, 2015 at 09:17
At present time it's (as far as I can see) based on the current screen resolution which is higher than 640x480 judging from the size of that mousepointer. The retrostyle art is applied to it. Scaling might look odd at this mode, but the downside using 320x200 is that mousecursors movement as well as scrolling looks less smooth.

Jammet - Apr 02, 2015 at 12:48
I remember the hall inside the giant face on Mars in Zak. That didn't have actor scaling but you still used a very small bunch of pixels to show just how big it was! Back then that was already awe inspiring for me as a child.

Ralph Upton - Apr 02, 2015 at 13:11
What a beautifully zen night sky (and tree). Pixel pr0n for the win!

badde - Apr 02, 2015 at 16:09
who designed the background ?

Paul - Apr 02, 2015 at 18:24
"Because of its privacy settings, this video cannot be played here."...I assume its just me that can't get Vimeo to work? Perhaps something to do with Firefox's update a few days ago?

Ron Gilbert - Apr 02, 2015 at 23:25
This should be fixed now. Config error on my part.

Paul - Apr 05, 2015 at 22:30
Thanks! Looks lovely :-)

Doug - Apr 02, 2015 at 19:21
You had me up until CGPoint.  Too kinky and weird.

Brian Ruff - Apr 02, 2015 at 19:21
I know this might have been touched on before, but I would love to play a version of the game using Gary's "very early wireframe art". Maybe just save the PNG files? Ahh, too much work...

delMar - Apr 03, 2015 at 03:10
Ah, those are this week's 14 seconds of joy ;-)

Peter Campbell - Apr 04, 2015 at 23:18
28 seconds if you watch it twice =)

Gravitas - Apr 03, 2015 at 04:16
PARALLAX VIEW! Watch it now! You have been ordered!

DZ-Jay - Apr 03, 2015 at 07:30
Hi, Ron,

(Sorry for the double-post, but I just realized I posted in an old thread, and you may miss it.)

I just caught up with this blog and I have a question regarding the dependency charts.  This may be stupid, but I'm trying to understand exactly what sort of information it is trying to convey.  When a node has, say, two connections coming from above, does it mean that there are two paths to arrive at that node, or that in order to arrive at that node you must complete two other paths?

I know you've mentioned before that it's a "dependency" chart, not a "flow" chart; but I'm having a hard time making a distinction between them.  Anyway, thanks for sharing your fantastic work--I look forward with enthusiasm to playing the game.

      -dZ.

prbalbontin - Apr 04, 2015 at 00:49

DZ-Jay - Apr 04, 2015 at 11:16
Thanks, prbalbontin

That does help.  I had read that article before, but had forgotten.  I see that Mr. Gilbert points out that multiple nodes converging on a single one indicate the dependencies for the last one, so you need to "unlock door" *and* "oil hinges" in order to "open door."

Now, the part that I'm still a bit confused about is, what are the nuances to which he alludes that differentiates Dependency Charts from Flow Charts.  As I work on Dependency Charts for my own game (I make 8-bit games for early 1980s consoles), they tend feel a bit "flowy".

Best regards,
      -dZ.

DZ-Jay - Apr 05, 2015 at 11:23
I also have a related question to the Dependency Chart.  If multiple connections converging on a node describe all required actions for that node, how do you depict optional paths to the same node?  For example, supposed that you could either open the door with a key or take out the hinges with a screwdriver:

  find key -> unlock door -> open door
or
  find screwdriver -> take out hinges -> open door

How is that depicted on the chart?

    Thanks!
      -dZ.

Alan - Apr 06, 2015 at 20:49
So... beautiful.... should have... sent a poet....

Eramai - Apr 17, 2015 at 00:13
You're not protected against out of bound errors, are using magic numbers, duplicated computation, and have too many imbrication levels instead of using clearly named variables.
Hopefully you guys are good game makers.

Liz - Mar 07, 2017 at 06:20
As far as I noticed, graphics are not very good. Should be improved.

Nor Treblig - Mar 07, 2017 at 09:09
New bug tracker item added for Gary: "Improve graphics"

In case you are mistaking this two year old blog post for the current state:
In the press kit you can find more current screenshots: https://thimbleweedpark.com/presskit
And here is the Steam page: http://store.steampowered.com/app/569860