Pixel-Based walking with dwimmercrafty (etheldreme!)

Make games! Discuss those games here.

Moderators: Bob the Hamster, marionline, SDHawk

User avatar
Bob the Hamster
Lord of the Slimes
Posts: 7658
Joined: Tue Oct 16, 2007 2:34 pm
Location: Hamster Republic (Ontario Enclave)
Contact:

Post by Bob the Hamster »

You don't want to reparent the hero.

If the hero's position x position is smaller than 0 then you add the map width in pixels. If the hero x is greater than the map width in pixels, then you subtract the map width in pixels.

Same for y
User avatar
sheamkennedy
Liquid Metal Slime
Posts: 1110
Joined: Mon Sep 16, 2013 9:29 pm
Location: Tama-shi, Tokyo, Japan
Contact:

Post by sheamkennedy »

@Bob: Ahh cool, I see now. I guess I didn't really understand the code overall.
⊕ P E R S O N A L M U S I C: https://open.spotify.com/album/6fEo3fCm5C3XhtFRflfANr
� C O L L A B M U S I C: https://dustpuppets.bandcamp.com/releases
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

Actually, it's more complicated than that. Map wrapping is really hard to get right.
This is a deficiency in the engine, which I do want to fix. NPC and hero slices appear over the edges of a wrapping map because the engine does some special voodoo with their positions to make it work. Other slices parented to a map don't get this, and so aren't drawn correctly. But the slice system ought to be made to just draw slices over the map edge without requiring special positioning.
That's also the only way fix wrapping maps which are as wide as the screen, in which case a slice that crossing the screen edge ought to be drawn on both sides of the screen!

Add the following script:

Code: Select all

# This script ONLY works to make a slice correctly appear over the
# edge of a wrapping map if "camera follows slice" is
# called on that slice. In other cases, the voodoo required is even worse!
script, fix slice position on wrapped map, slice, begin
    variable(mapw, maph, halfw, halfh)
    mapw := map width * 20
    maph := map height * 20
    halfw := slice width(slice) / 2
    halfh := slice height(slice) / 2
    put slice(slice,
              (slice x(slice) + halfw + mapw), mod, mapw -- halfw,
              (slice y(slice) + halfh + maph), mod, maph -- halfh)
end
Then add the following line right at the end of the main loop, before the wait(1):

Code: Select all

        fix slice position on wrapped map(player)
You can call that script on non-wrapped maps too; it does no harm.
Last edited by TMC on Sun Nov 12, 2017 12:57 pm, edited 1 time in total.
User avatar
sheamkennedy
Liquid Metal Slime
Posts: 1110
Joined: Mon Sep 16, 2013 9:29 pm
Location: Tama-shi, Tokyo, Japan
Contact:

Post by sheamkennedy »

TMC wrote:Actually, it's more complicated than that...
Interesting. This was becoming more and more clear as I started playing around with things. I would definitely be interested in a feature which allowed all slices to wrap properly.

In the meantime I am wondering if parenting each slice to an invisible NPC would work since NPC's can wrap properly or is it not that simple? Or is the "camera follows slice" necessary? I do have the camera following a slice parented to an invisible hero and this slice wraps perfectly when it hits the edge region.

I assume this also means something like walktall will have visual issues when the NPC crosses over the wrap edge?

I should point out that my maps are always going to be larger than the screen height and width so if there's a fix in the meantime for maps of this variety which handle multiple slices, I'd be interested.
Last edited by sheamkennedy on Sun Nov 12, 2017 1:58 pm, edited 1 time in total.
⊕ P E R S O N A L M U S I C: https://open.spotify.com/album/6fEo3fCm5C3XhtFRflfANr
� C O L L A B M U S I C: https://dustpuppets.bandcamp.com/releases
User avatar
kylekrack
Liquid Metal Slime
Posts: 1240
Joined: Mon Jun 16, 2014 8:58 am
Location: USA
Contact:

Post by kylekrack »

Sorry the code is cryptic. My next goal here is to remove the "check cardinal direction" script and just use the friction TMC implemented. That alone should condense the code pretty significantly in addition to making it read better. I'm also working on an animation handler that doesn't just alternate between two frames. There's a sprite set per direction. I'm only animating 4 directions in my sprites but will make the code account for 8 directions. I plan on making this integrate well with the new sprite editor that has customizable frame counts. I know I shouldn't be holding my breath for that, but hey, design for the future, I guess.

After those, I'm probably going to add NPCs. They'll be slice-based fake NPCs, rather than manipulating the actual NPC slices. I'm treating slices like objects, adding children to provide more data fields. Sort of like the slice based fake array scripts on the wiki.

I'll look into the wrapping issue, but if it's not simple to fix, I'll probably put it on the backburner, just because the aforementioned items are a little bit higher priority. That being said, removing bugs is also important to me. If I find the time, I'll really try to fix it.
Attachments
Spent some time making 8 frame walking sprites in each direction for testing purposes.
Spent some time making 8 frame walking sprites in each direction for testing purposes.
Screen Shot 2017-11-12 at 5.47.30 PM.png (10.95 KiB) Viewed 3024 times
My pronouns are they/them
Ps. I love my wife
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

Parenting slices to a hero or npc walkabout slice will work fine (provided your slices appear about at the same position as the hero/npc), because those slices get positioned correctly. For the same reason, walktall works fine on wrapping maps.

The script I provided to fix the wrapping isn't going to work if there are slice-based fake npcs. I'll work on getting automatic wrapping implemented.
(If you care to look how you would script it, it's done by the closestwrappedpos, framewalkabout and update_walkabout_pos functions in the OHR source)
User avatar
sheamkennedy
Liquid Metal Slime
Posts: 1110
Joined: Mon Sep 16, 2013 9:29 pm
Location: Tama-shi, Tokyo, Japan
Contact:

Post by sheamkennedy »

TMC wrote:Parenting slices to a hero or npc walkabout slice will work fine (provided your slices appear about at the same position as the hero/npc), because those slices get positioned correctly. For the same reason, walktall works fine on wrapping maps.
Okay I think I can get by doing that for now then. I'm messing around with making a space shooter game (which has a wrapping screen) and there's no walls in the game so I think I can just parent every instance of a slice to an instance of an invisible NPC, then I can manipulate the NPC's positions for things like projectiles and the projectiles should wrap properly because the slice will be stay relatively close to it's invisible NPC pair. I'll also suspend obstacles so no NPCs interfere with eachother which repositioning them.

This is more just a test than anything but I think once slice wrapping is implemented a game like this would be quite feasible and really neat.
⊕ P E R S O N A L M U S I C: https://open.spotify.com/album/6fEo3fCm5C3XhtFRflfANr
� C O L L A B M U S I C: https://dustpuppets.bandcamp.com/releases
User avatar
kylekrack
Liquid Metal Slime
Posts: 1240
Joined: Mon Jun 16, 2014 8:58 am
Location: USA
Contact:

Post by kylekrack »

Working on cleaning everything up. Removed the "check cardinal direction" subscript and altered much of how the velocity and direction are interpreted. I added an animation handler that uses 8 sprite sets (of any type) for each direction. It cycles through each frame of that sprite set, meaning if you're using walkabout sprites, you'll have 8-frame walking animations. However, you could load the player as a weapon sprite and have 3-frame walking. Bear in mind, the sprite dimensions do not determine the hitbox. There are player width and height constants defined at the top of the scripts.

I'll post an updated version after some testing.
Attachments
Here's some walking in action.
Here's some walking in action.
pixel-walker0000.gif (714.5 KiB) Viewed 2999 times
My pronouns are they/them
Ps. I love my wife
User avatar
kylekrack
Liquid Metal Slime
Posts: 1240
Joined: Mon Jun 16, 2014 8:58 am
Location: USA
Contact:

Post by kylekrack »

This is the script I used to quick fix the wrapping issue.

Code: Select all

script, wrap player position, begin
    variable(w, h)
    
    w := map width(current map) * 20
    h := map height(current map) *20
    
    if&#40;slice x&#40;player&#41; < 0&#41; then&#40;
        put slice&#40;player, w+slice x&#40;player&#41;, slice y&#40;player&#41;&#41;
    &#41; else if&#40;slice x&#40;player&#41; > w&#41; then&#40;
        put slice&#40;player, w--slice x&#40;player&#41;, slice y&#40;player&#41;&#41;
    &#41;
    
    if&#40;slice y&#40;player&#41; < 0&#41; then&#40;
        put slice&#40;player, slice x&#40;player&#41;, h+slice y&#40;player&#41;&#41;
    &#41; else if&#40;slice y&#40;player&#41; > h&#41; then&#40;
        put slice&#40;player, slice x&#40;player&#41;, h--slice y&#40;player&#41;&#41;
    &#41;
end
It's not perfect. It has some weirdness when crossing the wrap line, but it's usable. I think I'll need some guidance on how to make it work more smoothly.

EDIT: Uploaded the new scripts. You can take a look if you want.
Last edited by kylekrack on Tue Nov 14, 2017 12:50 am, edited 1 time in total.
My pronouns are they/them
Ps. I love my wife
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

That animation system is nice.
I noticed a bug before (not sure if it's still in the latest version), where if you're standing still facing one direction and tap the opposite direction key, then the hero moves backwards but doesn't change their facing direction.
kylekrack wrote:It has some weirdness when crossing the wrap line, but it's usable. I think I'll need some guidance on how to make it work more smoothly.
Err... just use the script I posted. It's largely the same as yours, but fixes the glitch when you cross the map edge.
Last edited by TMC on Sat Nov 18, 2017 12:18 am, edited 1 time in total.
User avatar
kylekrack
Liquid Metal Slime
Posts: 1240
Joined: Mon Jun 16, 2014 8:58 am
Location: USA
Contact:

Post by kylekrack »

TMC wrote:Err... just use the script I posted. It's largely the same as yours, but fixes the glitch when you cross the map edge.
It'd probably help if I read things, wouldn't it? I think I was in a hurry when I posted that, for some reason. Anyway, I fixed the script to what you posted earlier. The player position no longer glitches, but the sprite still goes invisible for a bit while on the edge of wrapping.
TMC wrote:That animation system is nice.
I noticed a bug before (not sure if it's still in the latest version), where if you're standing still facing one direction and tap the opposite direction key, then the hero moves backwards but doesn't change their facing direction.
The animation system is completely reworked. That bug doesn't happen anymore, but I remember when it did. Animations worked using a timer before, which is what I think caused the delayed update in direction. This new system runs every tick, and it's based on the sprite's extra data, which gets incremented every tick. It resets the extra data to 0 and increments the sprite's frame once the extra data reaches the animation speed, defined by a constant. It's much smoother and will be easier to transfer to other animated sprites on the screen. It'll also allow for sprites that animate at different speeds but use the same script. Timers were a bad call for animating sprites.
My pronouns are they/them
Ps. I love my wife
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

kylekrack wrote:Anyway, I fixed the script to what you posted earlier. The player position no longer glitches, but the sprite still goes invisible for a bit while on the edge of wrapping.
What? I downloaded the last version you uploaded (from the 14th), simply replaced your wrapping script with mine, and it works perfectly. Maybe you made some other edits to the scripts since then.
The animation system is completely reworked. That bug doesn't happen anymore, but I remember when it did. Animations worked using a timer before, which is what I think caused the delayed update in direction.
Oh I see, the problem with using a timer is that timer-triggered scripts will run before other scripts, but you need them to happen afterwards.

Your animation scripts look clean and reasonable. You have the grisly details isolated to some utility scripts, but aside from those it's quite simple and general.
Last edited by TMC on Sat Nov 18, 2017 5:03 am, edited 1 time in total.
User avatar
kylekrack
Liquid Metal Slime
Posts: 1240
Joined: Mon Jun 16, 2014 8:58 am
Location: USA
Contact:

Post by kylekrack »

TMC wrote:
kylekrack wrote:Anyway, I fixed the script to what you posted earlier. The player position no longer glitches, but the sprite still goes invisible for a bit while on the edge of wrapping.
What? I downloaded the last version you uploaded (from the 14th), simply replaced your wrapping script with mine, and it works perfectly. Maybe you made some other edits to the scripts since then.
It was a typo. My bad. Thanks for providing that fix, though. I would never have come up with that solution on my own.

I kept anything that accessed slice extra data in utility scripts because that's the part that's totally unintuitive. That way, adding changes to the scripts should be more doable, and if I want to change how data is managed, I won't have to change the main scripts. I'm happy to hear you endorse them.
My pronouns are they/them
Ps. I love my wife
User avatar
kylekrack
Liquid Metal Slime
Posts: 1240
Joined: Mon Jun 16, 2014 8:58 am
Location: USA
Contact:

Post by kylekrack »

Update: NPC movement

I got slice-based NPCs to load, animate, and move properly based on various attributes. You can adjust in the scripts what sprite type your NPCs have, allowing you to load any sprite as an NPC. However, you will be limited to the frame count that sprite type provides. NPCs can animate in 8, 4, or 1 (no sprite change based on direction) directions. In order to give an NPC more animated directions, you'll have to add sprite sets. For example, if you want an NPC to have 4 different directional sprites, you'll create the original as facing right, then the 3 sets directly below that original will be down, right, and up, respectively.

There are currently two functional move types: Wander, and not. Standing still counts as a move type, at least that's what I tell myself. Because the built-in move types are grid-based and I'm not using actual NPCs, I have to script all of the different types of movement. This means James's new pathfinding probably won't make its way into these scripts.

Drawbacks and major hurdles for NPCs are collisions with the player and between NPCs, and zone behavior for NPC movement. Because I am using move slice with wallchecking() to move NPCs, they ignore zones, and adding in that check to bypass the command will be challenging. I'll figure something out. For now, this is what I've got. I still need to clean up the scripts a lot. They're expanding at an unfortunate rate, and getting quite convoluted. I plan on splitting the scripts into multiple files so that the massive list of utility scripts doesn't become overwhelming.
Attachments
A 4-directional NPC's sprite sets
A 4-directional NPC's sprite sets
Screen Shot 2017-11-28 at 3.48.46 PM.png (66.34 KiB) Viewed 2885 times
Here's some NPCs wanderin around
Here's some NPCs wanderin around
pixel-walker0003.gif (314.2 KiB) Viewed 2887 times
My pronouns are they/them
Ps. I love my wife
TMC
Metal King Slime
Posts: 4308
Joined: Sun Apr 10, 2011 9:19 am

Post by TMC »

Cool, is this getting somewhere! Lack of NPC-NPC collision doesn't look terrible; the biggest thing missing is NPC activation.

Aside from a command to do zone checking, I guess it might make sense to have one for moving with collision checking too... put probably it should just be a script anyone can use, because which slices should obstruct each other, or whether anything special should happen when they collide is game-specific.

Amusing use of the default graphics... when I saw an earlier .gif you posted, it never dawned on me that two NPC graphics might be a single NPC.
Post Reply