Scrolling Platformer Tutorial

Материал из Поле цифровой дидактики
Описание Руководство по скроллингу
Область знаний Математика
Область использования (ISTE) Computational Thinker
Возрастная категория 12


Поясняющее видео
Близкие рецепту понятия
Среды и средства для приготовления рецепта:

Coding the Player Sprite

To code the movement of the player, the following scripts need to be made. All scripts in this section are to go in the 'Player' sprite.


When green flag clicked
broadcast (Green Flag v) and wait//A way to only need 1 flag block. Flag blocks create lag, so the fewer the better.{{cn}}
broadcast (Play Game v) and wait//Broadcasts to the other sprites that the game has started.

When I receive [Play game v]
forever
broadcast (Reset v) and wait
    broadcast (Set Up v) and wait
    Game On::custom//Sets up the variables.
    repeat until <(EXIT)>()>//This means the player has either died or won.
        broadcast (Tick v)
    end
    if <(EXIT)=(win)> then
        Win::custom
    else
        Die::custom//If the player did not win, they would have died.
    end

define Position
go to x:((x)-(SCROLL X)) y: ((y) - (SCROLL Y)

define Game On//Run without screen refresh.
point in direction (90)
set size to (100)%
clear graphic effects
set [in air v] to (0)
set rotation style [left-right v]
set [sy v] to (0)
set [x v] to (0)
set [y v] to (0)
set [EXIT v] to () //This should be blank.
set [SCROLLL X v] to (0)
set [SCROLLL Y v] to (0)
show

When I receive [Tick v]
broadcast (Ready v)
Tick <key (Right arrow v) pressed?> <key (Up arrow v) pressed?> <key (Left arrow v) pressed?>::custom//Checks if a key has been pressed.

define Tick <right> <up> <left>
if <left> then//If the left key was pressed, it moves the player left.
    Change player X by [-8]::custom
end
if <right> then//If the right key was pressed, it moves the player right.
    Change player X by [8]::custom
end
if <<up> and <(in air)< (4)>> then//If the up key was pressed, it checks if they are still in the air. If they are not, it makes the player jump.
    set [sy v] to (16)
end
change [sy v] by (-1)//Set sy to any negative number.
Change player Y by (sy)::custom//Actually moves the player's Y position.
Test dying::custom//Checks if the player has hit a danger sprite.
if <(SCROLL X)<(0)> then
    set [SCROLL X v] to (0)
end
if <(SCROLL Y)<(0)> then
    set [SCROLL Y v] to (0)
end
change [SCROLL Y v] by (round(((y)-(SCROLL Y))/(10)))
change [SCROLL X v] by (round(((x)-(SCROLL X))/(5)))
Position::custom//Positions the player's location correctly.
if <(y position) < (-180)> then//Checks if the player has fallen into the abyss.
    set [EXIT v] to [die]
end

define Change player X by (sx)//Moves the player's X axis.
if <(sx::custom)<(0)> then//If the player is moving left.
    point in direction (-90)//They point left.
else
    point in direction (90)//They point right.
end
change [x v] by (sx::custom)//Changes the X variable by the amount of movement needed (sx).
Position::custom//Positions the player.
if <touching (platforms v) ?> then//Will check if the player has hit a wall or a slope.
    repeat (12)//Will check if the wall/slope is 12 pixels steep or not.
        change [y v] by (1)//Moves the player up 1 pixel.
        Position::custom//Positions the player.
        if <not<touching (platforms v) ?>> then//That means it was a slope, so the player can stop trying.
            stop [this script v]
        end
    end
    change [y v] by (-12)//Corrects for the 12 that was used above.
    repeat until <not<touching (platforms v)?>> //Repeatedly checks is the player has ran into a wall.
        if <(sx)>(0)> then //To see if the player is moving left of right.
            change [x v] by (-1) //The player is trying to move right, so we need to move left to not go into the wall.
        else
            change [x v] by (1) //The player is trying to move left, so we need to move right to stay out of the wall.
        end
        Position::custom //Reposistions the player on the scrolling plane.
    end
end

define Change player Y by (sy)
change [y v] by (sy::custom) //Changes the y variable by (sy).
change [in air v] by (1) //This is so that we know if we are in the air or on the ground. Without this, the player would be able to hold jump and just fly.
Position::custom //Reposistions the player.
repeat until <not<touching (platforms v)?>>
    if <(sy::custom)>(0)> then
        change [y v] by (-1)
    else
        change [y v] by (1)
        set [in air v] to (0)
    end
    set [sy v] to (0)
    Position::custom
end

define Test dying
if <touching (Danger v)?> then
    set [EXIT v] to [die]
end

define Die
set [EXIT v] to ()//This is empty.
repeat (4)
    hide
    wait (0.1) seconds
    show
end
wait (0.5) seconds

define Win
set rotation style [don't rotate v]
repeat (50)
    point towards (Portal v)
    turn cw (65) degrees
    move ((distance to (Portal v))/(2)) steps
    change size by (-1)
    change [ghost v] effect by (2)
end
hide
change [LEVEL v] by (1)
wait (1) seconds
clear graphic effects
set rotation style [left-right v]

Coding the Platforms Sprite

Once the player's code has been completed, the ground sprite (called 'platforms' here) needs to be added in order to create a scrolling effect. The following scripts go in the 'platforms' sprite.

when I receive [Tick v]
Position ((x)-(SCROLL X)) ((y) - (SCROLL Y)
when I receive [Green flag v]
show

define Position (x) (y)
go to x: (x::custom) y: (y::custom)
if <<(x::custom)= (x position)> and <(y::custom) = (y position)>> then
    show
else
    hide
end

When I receive [Setup v]
set [x v] to (0)
set [y v] to (0)
if <(LEVEL)=(1)> then
    switch costume to (Level 1 1)
    Clone (450) (0) // This clones a new level. This needs to be done as many times as the number of levels. In this case, 3 is used as an example.
    Clone (450) (0)
    Clone (450) (0)
else
    ...::grey // If there is another scene, it should be cloned here using another if else block.
end

define Clone (x) (y)
create clone of (myself v)
change [x v] by (x::custom)
change [y v] by (y::custom)
next costume

Coding the Danger Sprite

To code the danger sprite, simply duplicate the "platforms" sprite and replace all the levels only with the dangerous elements that would hurt the player. Шаблон:Note

when I receive [Tick v]
position ((x)-(SCROLL X))((y)-(SCROLL Y))::custom

when I receive [Green flag v]
show

when I receive [Reset v]
delete this clone

define Position (x) (y)
go to x: (x::custom) y: (y::custom)
if <<(x::custom)= (x position)> and <(y::custom) = (y position)>> then
    show
else
    hide
end

when I receive [Setup v]
set [x v] to (0)
set [y v] to (0)
if <(LEVEL)=(1)> then
    switch costume to (Level 1 1)
    Clone (450) (0) // This clones a new level. Do this as many times as the number of levels, in this case 3 is used as an example.
    Clone (450) (0)
    Clone (450) (0)
else
    ...::grey // If there is another scene, then it should be cloned here using another if else block.
end

define Clone (x) (y)
create clone of (myself v)
change [x v] by (x::custom)
change [y v] by (y::custom)
next costume

Coding the Portal

Now that everything is made, a way to go to the next level needs to be made.

When I receive [Tick v]
Position ((x)-(SCROLL X)) (((y) - (SCROLL Y)) + ((([sin v] of (timer)) *(100))*(20)))::custom
if <<(costume [number v]) = (2)> and <touching (player v)?>> then
    set [EXIT v] to [win]
end

When I receive [Setup v]
set [x v] to (0)
set [y v] to (0)
if <(LEVEL)=(1)> then
    switch costume to (Level 1 1)
    Position Portal at (450) (180)::custom
else
    ...::grey // If there is another scene, then the portal needs to be positioned here using another if else block.
end

define Position Portal at (x) (y)
set [x v] to (x::custom)
set [y v] to (y::custom)

define Position (x) (y)
go to x: (x::custom) y: (y::custom)
if <<(x::custom)= (x position)> and <(y::custom) = (y position)>> then
    show
else
    hide
end

Adding Collectibles

Collectibles can be added to the game to make it more interesting. They are objects that need to be collected in order to achieve a certain goal. The code to make them is shown below:

When I receive [Tick v]
Position ((x)-(SCROLL X)) (((y) - (SCROLL Y)) + ((([sin v] of (timer)) *(300))*(5)))::custom
if <touching (player v)?> then
    change [COLLECTED v] by (1)
    if <(COLLECTED)=(COLLECTED MAX)> then
        broadcast (Open portal v)
        start sound (All coins collected v)
    else
        start sound (Collect v)
    end
    delete this clone
end

When I receive [Green flag v]
show

when [m v] key pressed
set [MOUSE v] to (join ((mouse x) + (SCROLL X))(join [,]((mouse y) + (SCROLL Y))))

When I receive [Reset v]
delete this clone

define Position (x) (y)
go to x: (x::custom) y: (y::custom)
if <<(x::custom)= (x position)> and <(y::custom) = (y position)>> then
    show
else
    hide
end

When I receive [Setup v]
set [x v] to (0)
set [y v] to (0)
if <(LEVEL)=(1)> then
    Clone (450) (180)::custom
else
    ...::grey // If there is another scene than coins need to be cloned here using another if else block.
end

define Clone (x) (y)
set [x v] to (x::custom)
set [y v] to (y::custom)
create clone of (myself v)
change [COLLECTED MAX v] by (1)

Transforming a Basic Platformer

Often, Scratchers make basic platformers before they make a scrolling platformer, and they may want to use their old script to make a scrolling platformer. To do this, the "ground" sprite would move with the player. Making a script to do this is simple:

when green flag clicked//This goes in the player sprite.
forever
Scroll (((0) - (x position)) * (0.8)) (((-40) - (y position)) * (0.8))//0 and -40 are the desired x and y positions of the player.
...//The basic platformer script goes here.
end

define Scroll (x) (y)//This goes in the player sprite.
change [level x v] by (round (x))//Round the variables so the level moves correctly.
change [level y v] by (round (y))
change x by (round (x))//When the level moves, the player must move with it.
change y by (round (y))

when green flag clicked//This goes in the ground sprite.
forever
go to x:(level x) y:(level y)
end

See Also