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

2020/3/22

Cycle Character Animations based on Distance traveled?

LewisEro LewisEro

2020/3/22

#
I'm trying to animate a character model in my game through various movement sprites (4 directional) as the players moves in one particular direction. To do this I intended on having the game check how far the player has traveled and cycle based on discrete distance traveled (the initial distance is reset to 0 the moment the character moves). after doing some research and trying various different approaches I'm willing to admit I've hit a rock-solid wall... Here's my code (for the sake of simplicity and readability I have reduced the code to upward movement. Also have limited the cycle down to 2 images, "up1.png" and "upX.png") PC, the class name stands for Playable Character.
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Write a description of class PC here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class PC extends Actor
{
    public static int spd = 1;
    public int dstnX = 0;
    public int dstnY = 0;
    public static String up = "up1.png";
    private boolean isMoving = true;

    public void act(){
        movePC();
        animateMovement();
    }  
    public void movePC(){
        if(isMoving){
            dstnY = getY();
            dstnX = getX();           
        }     
        if(Greenfoot.isKeyDown("w")){ 
            setLocation(getX(), getY() -spd);
        }
    }
    public void animateMovement(){
        setImage("idle1.png");
        if(Greenfoot.isKeyDown("w")){
            setImage("up1.png"); 
            if(Math.sqrt(Math.pow(getX() - dstnX, 2) + Math.pow(getY() - dstnY, 2)) >= 50){
                setImage("upX.png");
            }
        }
    }
}
danpost danpost

2020/3/22

#
As your code stands, isMoving will always be true; so, distance traveled will always be less than 2. What code in the class changes the value of isMoving?
LewisEro LewisEro

2020/3/23

#
worked it out, thanks!
    public void act(){
        movePC();
        changeScreen();
    }  
    private void movePC(){
        if(!isMoving){
            dstnY = getY();
            dstnX = getX();           
        }     
        isMoving = false;
        setImage("idle1.png");
        if(Greenfoot.isKeyDown("w")){            
            setLocation(getX(), getY() -spd);
            if(direction == "w"){
            isMoving = true;
            }            
            setSprite(new GreenfootImage("up1.png"), new GreenfootImage("up2.png"), new GreenfootImage("up3.png"), new GreenfootImage("up4.png"), new GreenfootImage("up5.png"));
            direction = "w";
        }
        if(Greenfoot.isKeyDown("s")){
            setLocation(getX(), getY() +spd);
            if(direction == "s"){
            isMoving = true;
            }
            setSprite(new GreenfootImage("dn1.png"), new GreenfootImage("dn2.png"), new GreenfootImage("dn3.png"), new GreenfootImage("dn4.png"), new GreenfootImage("dn5.png"));
            direction = "s";            
        }
        if(Greenfoot.isKeyDown("a")){
            setLocation(getX() -spd, getY());
            if(direction == "a"){
            isMoving = true;
            }
            setSprite(new GreenfootImage("lt1.png"), new GreenfootImage("lt2.png"), new GreenfootImage("lt3.png"), new GreenfootImage("lt4.png"), new GreenfootImage("lt5.png"));            
            direction = "a";            
        }
        if(Greenfoot.isKeyDown("d")){
            setLocation(getX() +spd, getY()); 
            if(direction == "d"){
            isMoving = true;
            }
            setSprite(new GreenfootImage("rt1.png"), new GreenfootImage("rt2.png"), new GreenfootImage("rt3.png"), new GreenfootImage("rt4.png"), new GreenfootImage("rt5.png"));            
            direction = "d";           
        }    
    }
    private void setSprite(GreenfootImage sprite1, GreenfootImage sprite2, GreenfootImage sprite3, GreenfootImage sprite4, GreenfootImage sprite5){
        setImage("idle1.png");
        double movement = (Math.sqrt(Math.pow(getX() - dstnX, 2) + Math.pow(getY() - dstnY, 2)));        
        if(movement <= 10){
                setImage(sprite1);      
        }
        if(movement >= 10){
                setImage(sprite2);      
        }
        if(movement >= 20){
                setImage(sprite3);      
        }
        if(movement >= 30){
                setImage(sprite4);      
        }
        if(movement >= 40){
                setImage(sprite5);      
        }
        if(movement >= 50){
                setImage(sprite4);      
        }
        if(movement >= 60){
                setImage(sprite3);      
        }        
        if(movement >= 70){
                dstnY = getY();
                dstnX = getX();             
        }        
    }
You need to login to post a reply.