• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
0

Adding a moving platform that character can land on

Community Beginner ,
Jan 10, 2018 Jan 10, 2018

Copy link to clipboard

Copied

I am adding in a moving floor for a project and the player does not move with it, the character does collide, he just hovers over the initial starting position of the floor but does not move upward with it., any tips on how to fix this? Thank you!

11111111.png

package {

import flash.display.*;

import flash.events.*;

import flash.text.*;

import flash.utils.getTimer;

public class PlatformGame extends MovieClip {

// movement constants

static const gravity:Number = .004;

// screen constants

static const edgeDistance:Number = 100;

// object arrays

private var fixedObjects:Array;

private var otherObjects:Array;

// hero and enemies

private var hero:Object;

private var enemies:Array;

// game state

private var playerObjects:Array;

private var gameScore:int;

private var gameMode:String = "start";

private var playerLives:int;

private var lastTime:Number = 0;

// start game

public function startPlatformGame() {

playerObjects = new Array();

gameScore = 0;

gameMode = "play";

playerLives = 5;

}

// start level

public function startGameLevel() {

// create characters

createHero();

addEnemies();

// examine level and note all objects

examineLevel();

// add listeners

this.addEventListener(Event.ENTER_FRAME,gameLoop);

stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownFunction);

stage.addEventListener(KeyboardEvent.KEY_UP,keyUpFunction);

// set game state

gameMode = "play";

addScore(1);

showLives();

}

// creates the hero object and sets all properties

public function createHero() {

hero = new Object();

hero.mc = gamelevel.hero;

hero.dx = 0.0;

hero.dy = 0.0;

hero.inAir = false;

hero.direction = 1;

hero.animstate = "stand";

hero.walkAnimation = new Array(2,3,4,5,6,7,8);

hero.animstep = 0;

hero.jump = false;

hero.moveLeft = false;

hero.moveRight = false;

hero.jumpSpeed = .8;

hero.walkSpeed = .15;

hero.width = 20.0;

hero.height = 4.0;

hero.startx = hero.mc.x;

hero.starty = hero.mc.y;

}

// finds all enemies in the level and creates an object for each

public function addEnemies() {

enemies = new Array();

var i:int = 1;

while (true) {

if (gamelevel["enemy"+i] == null) break;

var enemy = new Object();

enemy.mc = gamelevel["enemy"+i];

enemy.dx = 0.0;

enemy.dy = 0.0;

enemy.inAir = false;

enemy.direction = 1;

enemy.animstate = "stand"

enemy.walkAnimation = new Array(2,3,4,5);

enemy.animstep = 0;

enemy.jump = false;

enemy.moveRight = true;

enemy.moveLeft = false;

enemy.jumpSpeed = 1.0;

enemy.walkSpeed = .08;

enemy.width = 30.0;

enemy.height = 30.0;

enemies.push(enemy);

i++;

}

}

// look at all level children and note walls, floors and items

public function examineLevel() {

fixedObjects = new Array();

otherObjects = new Array();

for(var i:int=0;i<this.gamelevel.numChildren;i++) {

var mc = this.gamelevel.getChildAt(i);

// add floors and walls to fixedObjects

if ((mc is Floor) || (mc is Wall) || (mc is MovingFloor)) {

var floorObject:Object = new Object();

floorObject.mc = mc;

floorObject.leftside = mc.x;

floorObject.rightside = mc.x+mc.width;

floorObject.topside = mc.y;

floorObject.bottomside = mc.y+mc.height;

fixedObjects.push(floorObject);

// add treasure, key and door to otherOjects

} else if ((mc is Treasure) || (mc is Key) || (mc is Door) || (mc is Chest)) {

otherObjects.push(mc);

}

}

}

// note key presses, set hero properties

public function keyDownFunction(event:KeyboardEvent) {

if (gameMode != "play") return; // don't move until in play mode

if (event.keyCode == 37) {

hero.moveLeft = true;

} else if (event.keyCode == 39) {

hero.moveRight = true;

} else if (event.keyCode == 32) {

if (!hero.inAir) {

hero.jump = true;

}

}

}

public function keyUpFunction(event:KeyboardEvent) {

if (event.keyCode == 37) {

hero.moveLeft = false;

} else if (event.keyCode == 39) {

hero.moveRight = false;

}

}

// perform all game tasks

public function gameLoop(event:Event) {

// get time differentce

if (lastTime == 0) lastTime = getTimer();

var timeDiff:int = getTimer()-lastTime;

lastTime += timeDiff;

// only perform tasks if in play mode

if (gameMode == "play") {

moveCharacter(hero,timeDiff);

moveEnemies(timeDiff);

checkCollisions();

scrollWithHero();

}

}

// loop through all enemies and move them

public function moveEnemies(timeDiff:int) {

for(var i:int=0;i<enemies.length;i++) {

// move

moveCharacter(enemies,timeDiff);

// if hit a wall, turn around

if (enemies.hitWallRight) {

enemies.moveLeft = true;

enemies.moveRight = false;

} else if (enemies.hitWallLeft) {

enemies.moveLeft = false;

enemies.moveRight = true;

}

}

}

// primary function for character movement

public function moveCharacter(char:Object,timeDiff:Number) {

if (timeDiff < 1) return;

// assume character pulled down by gravity

var verticalChange:Number = char.dy*timeDiff + timeDiff*gravity;

if (verticalChange > 15.0) verticalChange = 15.0;

char.dy += timeDiff*gravity;

// react to changes from key presses

var horizontalChange = 0;

var newAnimState:String = "stand";

var newDirection:int = char.direction;

if (char.moveLeft) {

// walk left

horizontalChange = -char.walkSpeed*timeDiff;

newAnimState = "walk";

newDirection = -1;

} else if (char.moveRight) {

// walk right

horizontalChange = char.walkSpeed*timeDiff;

newAnimState = "walk";

newDirection = 1;

}

if (char.jump) {

// start jump

char.jump = false;

char.dy = -char.jumpSpeed;

verticalChange = -char.jumpSpeed;

newAnimState = "jump";

}

// assume no wall hit, and hanging in air

char.hitWallRight = false;

char.hitWallLeft = false;

char.inAir = true;

// find new vertical position

var newY:Number = char.mc.y + verticalChange;

// loop through all fixed objects to see if character has landed

for(var i:int=0;i<fixedObjects.length;i++) {

if ((char.mc.x+char.width/2 > fixedObjects.leftside) && (char.mc.x-char.width/2 < fixedObjects.rightside)) {

if ((char.mc.y <= fixedObjects.topside) && (newY > fixedObjects.topside)) {

newY = fixedObjects.topside;

char.dy = 0;

char.inAir = false;

break;

}

}

}

// find new horizontal position

var newX:Number = char.mc.x + horizontalChange;

// loop through all objects to see if character has bumped into a wall

for(i=0;i<fixedObjects.length;i++) {

if ((newY > fixedObjects.topside) && (newY-char.height < fixedObjects.bottomside)) {

if ((char.mc.x-char.width/2 >= fixedObjects.rightside) && (newX-char.width/2 <= fixedObjects.rightside)) {

newX = fixedObjects.rightside+char.width/2;

char.hitWallLeft = true;

break;

}

if ((char.mc.x+char.width/2 <= fixedObjects.leftside) && (newX+char.width/2 >= fixedObjects.leftside)) {

newX = fixedObjects.leftside-char.width/2;

char.hitWallRight = true;

break;

}

}

}

// set position of character

char.mc.x = newX;

char.mc.y = newY;

// set animation state

if (char.inAir) {

newAnimState = "jump";

}

char.animstate = newAnimState;

// move along walk cycle

if (char.animstate == "walk") {

char.animstep += timeDiff/60;

if (char.animstep > char.walkAnimation.length) {

char.animstep = 0;

}

char.mc.gotoAndStop(char.walkAnimation[Math.floor(char.animstep)]);

// not walking, show stand or jump state

} else {

char.mc.gotoAndStop(char.animstate);

}

// changed directions

if (newDirection != char.direction) {

char.direction = newDirection;

char.mc.scaleX = char.direction;

}

}

// scroll to the right or left if needed

public function scrollWithHero() {

var stagePosition:Number = gamelevel.x+hero.mc.x;

var rightEdge:Number = stage.stageWidth-edgeDistance;

var leftEdge:Number = edgeDistance;

if (stagePosition > rightEdge) {

gamelevel.x -= (stagePosition-rightEdge);

if (gamelevel.x < -(gamelevel.width-stage.stageWidth)) gamelevel.x = -(gamelevel.width-stage.stageWidth);

}

if (stagePosition < leftEdge) {

gamelevel.x += (leftEdge-stagePosition);

if (gamelevel.x > 0) gamelevel.x = 0;

}

}

// check collisions with enemies, items

public function checkCollisions() {

// enemies

for(var i:int=enemies.length-1;i>=0;i--) {

if (hero.mc.hitTestObject(enemies.mc)) {

// is the hero jumping down onto the enemy?

if (hero.inAir && (hero.dy > 0)) {

enemyDie(i);

} else {

heroDie();

}

}

}

// items

for(i=otherObjects.length-1;i>=0;i--) {

if (hero.mc.hitTestObject(otherObjects)) {

getObject(i);

}

}

}

// remove enemy

public function enemyDie(enemyNum:int) {

var pb:PointBurst = new PointBurst(gamelevel,"Vanquished!",enemies[enemyNum].mc.x,enemies[enemyNum].mc.y-20);

gamelevel.removeChild(enemies[enemyNum].mc);

enemies.splice(enemyNum,1);

}

// enemy got player

public function heroDie() {

// show dialog box

var dialog:Dialog = new Dialog();

dialog.x = 175;

dialog.y = 100;

addChild(dialog);

if (playerLives == 0) {

gameMode = "gameover";

dialog.message.text = "Game Over!";

} else {

gameMode = "dead";

dialog.message.text = "You Died!";

playerLives--;

}

hero.mc.gotoAndPlay("die");

}

// player collides with objects

public function getObject(objectNum:int) {

// award points for treasure

if (otherObjects[objectNum] is Treasure) {

var pb:PointBurst = new PointBurst(gamelevel,100,otherObjects[objectNum].x,otherObjects[objectNum].y);

gamelevel.removeChild(otherObjects[objectNum]);

otherObjects.splice(objectNum,1);

addScore(100);

// got the key, add to inventory

} else if (otherObjects[objectNum] is Key) {

pb = new PointBurst(gamelevel,"Got Key!" ,otherObjects[objectNum].x,otherObjects[objectNum].y);

playerObjects.push("Key");

gamelevel.removeChild(otherObjects[objectNum]);

otherObjects.splice(objectNum,1);

// hit the door, end level if hero has the key

} else if (otherObjects[objectNum] is Door) {

if (playerObjects.indexOf("Key") == -1) return;

if (otherObjects[objectNum].currentFrame == 1) {

otherObjects[objectNum].gotoAndPlay("open");

levelComplete();

}

// got the chest, game won

} else if (otherObjects[objectNum] is Chest) {

otherObjects[objectNum].gotoAndStop("open");

gameComplete();

}

}

// add points to score

public function addScore(numPoints:int) {

gameScore += numPoints;

scoreDisplay.text = String(gameScore);

}

// update player lives

public function showLives() {

livesDisplay.text = String(playerLives);

}

// level over, bring up dialog

public function levelComplete() {

gameMode = "done";

var dialog:Dialog = new Dialog();

dialog.x = 175;

dialog.y = 100;

addChild(dialog);

dialog.message.text = "Level Complete!";

}

// game over, bring up dialog

public function gameComplete() {

gameMode = "gameover";

var dialog:Dialog = new Dialog();

dialog.x = 175;

dialog.y = 100;

addChild(dialog);

dialog.message.text = "You Got the Treasure!";

}

// dialog button clicked

public function clickDialogButton(event:MouseEvent) {

removeChild(MovieClip(event.currentTarget.parent));

// new life, restart, or go to next level

if (gameMode == "dead") {

// reset hero

showLives();

hero.mc.x = hero.startx;

hero.mc.y = hero.starty;

gameMode = "play";

} else if (gameMode == "gameover") {

cleanUp();

gotoAndStop("start");

} else if (gameMode == "done") {

cleanUp();

nextFrame();

}

// give stage back the keyboard focus

stage.focus = stage;

}

// clean up game

public function cleanUp() {

removeChild(gamelevel);

this.removeEventListener(Event.ENTER_FRAME,gameLoop);

stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyDownFunction);

stage.removeEventListener(KeyboardEvent.KEY_UP,keyUpFunction);

}

}

}

TOPICS
ActionScript

Views

399

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

Community Expert , Jan 10, 2018 Jan 10, 2018

in the loop where you update the player's x and y properties, update the y player's property based on the platform's y property.

Votes

Translate

Translate
Community Expert ,
Jan 10, 2018 Jan 10, 2018

Copy link to clipboard

Copied

in the loop where you update the player's x and y properties, update the y player's property based on the platform's y property.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
Jan 10, 2018 Jan 10, 2018

Copy link to clipboard

Copied

Well the platform is has a motion tween for its movement, does that effect it at all?

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Jan 10, 2018 Jan 10, 2018

Copy link to clipboard

Copied

LATEST

that doesn't change the answer to your question.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines