Walking cycle animation glitch [SOLVED]

Discuss how to use the Ren'Py engine to create visual novels and story-based games. New releases are announced in this section.
Forum rules
This is the right place for Ren'Py help. Please ask one question per thread, use a descriptive subject like 'NotFound error in option.rpy' , and include all the relevant information - especially any relevant code and traceback messages. Use the code tag to format scripts.
Post Reply
Message
Author
lacticacid
Regular
Posts: 36
Joined: Fri Nov 23, 2018 6:44 pm
Contact:

Walking cycle animation glitch [SOLVED]

#1 Post by lacticacid » Tue Mar 19, 2019 9:26 pm

Hi! I'm planning my game to be a mix of a visual novel and a point-and-click adventure style game, so I'm trying to figure out methods to put in the player controlled walk segments. I'm using a slightly modified version of Per K Grok's code (Method 3) - I disliked the fact that the character would continuously walk after the player pressed the arrow key and the player would have to press the key a second time in order to make the character stop, as I felt it would be a bit confusing for the player, so I changed it in order to be more similar to the walking mechanics of a regular game (player holds down the key and the character walks, and stops when the player isn't holding down the key anymore). However, that made me run into a small problem: when a cycle is completed, the character disappears off the screen for a brief moment. I'd sincerely appreciate it if someone was willing to help me solve this issue!

Code: Select all

define sX= 440
define sY=130
default rX= -1000.0

default kdir=2

screen checkKey():
    if kdir==1:
        add "j walkr" xpos sX ypos sY
        timer 0.501 action SetVariable("kdir",2)
    elif kdir==-1:
        add "j walkl" xpos sX ypos sY
        timer 0.501 action SetVariable("kdir",-2)

    key "K_RIGHT" action [SetVariable("kdir",+1), Jump("t2")]
    key "repeat_K_RIGHT" action [SetVariable("kdir",+1), Jump("t2")]
    key "K_LEFT" action [SetVariable("kdir",-1), Jump("t2")]
    key "repeat_K_LEFT" action [SetVariable("kdir",-1), Jump("t2")]


# The game starts here.
label walk:
    scene bg room:
        xpos int(rX)
    show screen checkKey


label stand:
    if kdir==2:
        show j right:
            xpos sX
            ypos sY
    else:
        show j left:
            xpos sX
            ypos sY
    $ kdir=0
    $ renpy.pause(hard=True)

label wtimer:

    if rX>-351:
        $ rX=-351
        $ kdir=-2
        jump stand

    if rX<-4067:
        $ rX=-4067
        $ kdir=2
        jump stand

    $ renpy.pause(delay=0.002, hard=True)

label t2:
    if kdir>1:
        $ kdir=2
    if kdir<-1:
        $ kdir=-2

    if kdir==1:
        jump walkRight
    elif kdir==-1:
        jump walkLeft
    else:
        jump stand

label walkRight:
    $ rX -= 4.0
    scene bg panorama:
        xpos int(rX)
    jump wtimer

label walkLeft:
    $ rX += 4.0
    scene bg panorama:
        xpos int(rX)
    jump wtimer
Last edited by lacticacid on Wed Mar 20, 2019 7:07 am, edited 1 time in total.
~There is almost always a better, easier way to approach a problem.~

User avatar
Per K Grok
Miko-Class Veteran
Posts: 628
Joined: Fri May 18, 2018 1:02 am
Completed: the Ghost Pilot, Sea of Lost Ships, Bubbles and the Pterodactyls, Defenders of Adacan Part 1
Projects: Defenders of Adacan Part 2
Deviantart: pekj
itch: per-k-grok
Location: Sverige
Contact:

Re: Walking cycle animation glitch

#2 Post by Per K Grok » Wed Mar 20, 2019 2:29 am

lacticacid wrote:
Tue Mar 19, 2019 9:26 pm
Hi! I'm planning my game to be a mix of a visual novel and a point-and-click adventure style game, so I'm trying to figure out methods to put in the player controlled walk segments. I'm using a slightly modified version of Per K Grok's code (Method 3) - I disliked the fact that the character would continuously walk after the player pressed the arrow key and the player would have to press the key a second time in order to make the character stop, as I felt it would be a bit confusing for the player, so I changed it in order to be more similar to the walking mechanics of a regular game (player holds down the key and the character walks, and stops when the player isn't holding down the key anymore). However, that made me run into a small problem: when a cycle is completed, the character disappears off the screen for a brief moment. I'd sincerely appreciate it if someone was willing to help me solve this issue!
----

I do have one more method to add to my cock book thread that I've not yet come around to do a video on, that is addressing checking if the key is pressed down using the pygame library.
https://www.pygame.org

Below a piece of code using that. That is probably a better path to go down to get what you are looking for.

Code: Select all

image bg sky = "sky.png"

image sem1 = "sem1.png"
image sem2 = "sem2.png"
image sem3 = "sem3.png"
image sem4 = "sem4.png"
image sem5 = "sem5.png"
image sem6 = "sem6.png"

image sem7 = "sem1b.png"
image sem8 = "sem2b.png"
image sem9 = "sem3b.png"
image sem10 = "sem4b.png"
image sem11 = "sem5b.png"
image sem12 = "sem6b.png"


image walk_left:
    "sem1"
    0.2
    "sem2"
    0.2
    "sem3"
    0.2
    "sem4"
    0.2
    "sem5"
    0.2
    "sem6"
    0.2
    repeat

image walk_right:
    "sem7"
    0.2
    "sem8"
    0.2
    "sem9"
    0.2
    "sem10"
    0.2
    "sem11"
    0.2
    "sem12"
    0.2
    repeat

default semX = 200
default dirt = 0
default dir2 = 1
default mx=0
default my=0

# The game starts here.

init python:
    import math
    import pygame, os
    from pygame.locals import *

    def fUpDate(sx):
        sx +=1
        return sx

    def keys():

        kdir=0
        pressed_key=pygame.key.get_pressed()

        if pressed_key[K_RIGHT]:
            kdir=1
        if pressed_key[K_LEFT]:
            kdir=-1

        return kdir




label start:


    scene bg sky
    show screen keyCheck
    jump walk



label walk:
    $ renpy.pause(delay=0.02, hard=True)

label upDate:

    $ dirt = keys()

    if dirt==-1:
        $ semX -= 2.3
    elif dirt==1:
        $ semX += 2.3

    if semX<20:
        $semX=20
    elif semX>560:
        $semX=560

    $ mx = pygame.mouse.get_pos()[0]
    $ my = pygame.mouse.get_pos()[1]

    jump walk



screen keyCheck:
    if dirt==-1:
        $ dir2=-1
    elif dirt==1:
        $ dir2=1
    text str(dirt) + ":" + str(dir2)
    text str(semX) ypos 20
    text str(mx) + ":" + str(my) ypos 10
    if dirt==-1:
        add "walk_left" xpos int(round(semX)) ypos 200
    elif dirt==1:
        add "walk_right" xpos int(round(semX)) ypos 200
    else:
        if dir2==1:
            add "sem12" xpos int(round(semX)) ypos 200
        elif dir2==-1:
            add "sem6" xpos int(round(semX)) ypos 200

[code]
Image Visual Story Telling, DeviantArt Group for animations, comics, games and illustrations https://www.deviantart.com/acgi

User avatar
Imperf3kt
Lemma-Class Veteran
Posts: 2836
Joined: Mon Dec 14, 2015 5:05 am
Location: Your monitor
Contact:

Re: Walking cycle animation glitch

#3 Post by Imperf3kt » Wed Mar 20, 2019 3:10 am

While looking through the documentation last week, I needed to browse a section regarding the keymap and in it there was a section about the mouse buttons.
https://www.renpy.org/doc/html/keymap.html
According to it, mousedown_1 is a variable set True while the left mouse button is held down, and mouseup_1 is True when it is released.
Similarly, it has key down and keyup for keyboard presses.
keydown
Matches when the key is being pressed down (the default).
keyup
Matches when the key is being released.
Maybe that could be used?
Warning: May contain trace amounts of gratuitous plot.
pro·gram·mer (noun) An organism capable of converting caffeine into code.

Twitter

lacticacid
Regular
Posts: 36
Joined: Fri Nov 23, 2018 6:44 pm
Contact:

Re: Walking cycle animation glitch

#4 Post by lacticacid » Wed Mar 20, 2019 7:06 am

Per K Grok wrote:
Wed Mar 20, 2019 2:29 am

I do have one more method to add to my cock book thread that I've not yet come around to do a video on, that is addressing checking if the key is pressed down using the pygame library.
https://www.pygame.org

Below a piece of code using that. That is probably a better path to go down to get what you are looking for.

Code: Select all

image bg sky = "sky.png"

image sem1 = "sem1.png"
image sem2 = "sem2.png"
image sem3 = "sem3.png"
image sem4 = "sem4.png"
image sem5 = "sem5.png"
image sem6 = "sem6.png"

image sem7 = "sem1b.png"
image sem8 = "sem2b.png"
image sem9 = "sem3b.png"
image sem10 = "sem4b.png"
image sem11 = "sem5b.png"
image sem12 = "sem6b.png"


image walk_left:
    "sem1"
    0.2
    "sem2"
    0.2
    "sem3"
    0.2
    "sem4"
    0.2
    "sem5"
    0.2
    "sem6"
    0.2
    repeat

image walk_right:
    "sem7"
    0.2
    "sem8"
    0.2
    "sem9"
    0.2
    "sem10"
    0.2
    "sem11"
    0.2
    "sem12"
    0.2
    repeat

default semX = 200
default dirt = 0
default dir2 = 1
default mx=0
default my=0

# The game starts here.

init python:
    import math
    import pygame, os
    from pygame.locals import *

    def fUpDate(sx):
        sx +=1
        return sx

    def keys():

        kdir=0
        pressed_key=pygame.key.get_pressed()

        if pressed_key[K_RIGHT]:
            kdir=1
        if pressed_key[K_LEFT]:
            kdir=-1

        return kdir




label start:


    scene bg sky
    show screen keyCheck
    jump walk



label walk:
    $ renpy.pause(delay=0.02, hard=True)

label upDate:

    $ dirt = keys()

    if dirt==-1:
        $ semX -= 2.3
    elif dirt==1:
        $ semX += 2.3

    if semX<20:
        $semX=20
    elif semX>560:
        $semX=560

    $ mx = pygame.mouse.get_pos()[0]
    $ my = pygame.mouse.get_pos()[1]

    jump walk



screen keyCheck:
    if dirt==-1:
        $ dir2=-1
    elif dirt==1:
        $ dir2=1
    text str(dirt) + ":" + str(dir2)
    text str(semX) ypos 20
    text str(mx) + ":" + str(my) ypos 10
    if dirt==-1:
        add "walk_left" xpos int(round(semX)) ypos 200
    elif dirt==1:
        add "walk_right" xpos int(round(semX)) ypos 200
    else:
        if dir2==1:
            add "sem12" xpos int(round(semX)) ypos 200
        elif dir2==-1:
            add "sem6" xpos int(round(semX)) ypos 200

Thank you! I combined this code with the other one so that the background moves instead of the character, so what I ended up with was:

Code: Select all

image bg panorama = "images/panorama.jpg"

image j right = "images/jright1.png"
image j left = "images/jleft1.png"

image j walkr:
    "images/jright1.png"
    0.25
    "images/jright2.png"
    0.25
    repeat
image j walkl:
    "images/jleft1.png"
    0.25
    "images/jleft2.png"
    0.25
    repeat
default dirt = 0
default dir2 = 1
default mx=0
default my=0
define jX= 440
define jY=130
default rX= -1000.0

init python:
    import math
    import pygame, os
    from pygame.locals import *

    def fUpDate(sx):
        sx +=1
        return sx

    def keys():

        kdir=0
        pressed_key=pygame.key.get_pressed()

        if pressed_key[K_RIGHT]:
            kdir=1
        if pressed_key[K_LEFT]:
            kdir=-1

        return kdir




label walklabel:

    scene bg panorama
    show screen keyCheck
    jump walk


label walk:
    $ renpy.pause(delay=0.02, hard=True)
    scene bg panorama:
        xpos int(rX)

label upDate:

    $ dirt = keys()

    if dirt==-1:
        $ rX += 3.3
    elif dirt==1:
        $ rX -= 3.3

    if rX>-351:
        $ rX=-351
        $ dirt=0
        $ dir2=1

    if rX<-4067:
        $ rX=-4067
        $ dirt=0
        $ dir2=-1

    $ mx = pygame.mouse.get_pos()[0]
    $ my = pygame.mouse.get_pos()[1]

    jump walk

screen keyCheck:
    if dirt==-1:
        $ dir2=-1
    elif dirt==1:
        $ dir2=1

    if dirt==-1:
        add "j walkl" xpos jX ypos jY

    elif dirt==1:
        add "j walkr" xpos jX ypos jY
    else:
        if dir2==1:
            add "j right" xpos jX ypos jY
        elif dir2==-1:
            add "j left" xpos jX ypos jY
It works perfectly now! Thank you!
~There is almost always a better, easier way to approach a problem.~

Post Reply

Who is online

Users browsing this forum: Google [Bot], Volta