Portieren Sie ein altes Shoot'em-Up-Spiel auf unseren Knien auf JavaScript

Es gibt ein altes Spielzeug LaserAge, das in Flash (auf einem sehr alten Macromedia Flash 4) geschrieben ist und nur unter Windows funktioniert. Als Kind hat es mir sehr gut gefallen, deshalb habe ich beschlossen, es fΓΌr die Seele zu portieren, damit ich von allen GerΓ€ten aus ΓΌber den Browser spielen kann.



Das Ziel des Spiels ist es, Gegner mit Ihrem Raumschiff auf verschiedenen Ebenen zu zerstΓΆren und Boni zu erhalten. Wenn Sie einen Bonus erhalten, wird die Waffe verbessert. Wenn ein feindlicher Torpedo trifft, wird die Waffe des Spielers herabgestuft.



Wenn alle Gegner in einem Level zerstΓΆrt sind, wechseln Sie zum nΓ€chsten Level. Insgesamt gibt es 100 Level.



In Bezug auf das Spiel ist das Level eine Welle (Wave) und mehrere Wellen werden zu einem großen Level (Level) kombiniert, was einfach eine Γ„nderung des Hintergrunds ist, d. H. Nur 4 große Ebenen in jeweils 25 Wellen. In der letzten Welle eines hohen Levels gibt es normalerweise einen Boss - einen Feind mit einem enormen Lebenswert und mΓ€chtigen Waffen.



https://github.com/EntityFX/laseroid/blob/master/doc/LaserAgeNext.png?raw=true



GeschΓ€ftslogikspiel



Spielraum



Es ist ein gewΓΆhnlicher rechteckiger Bereich, im oberen Teil befinden sich feindliche Schiffe und unterhalb des Spielers.



, , .



https://github.com/EntityFX/laseroid/blob/master/doc/Stage.png?raw=true





.

( ) ( ).



, : ( ), .

1 (), 0 .





  • β€”

    • β€” 1
    • β€” 2
    • β€” 3


    • β€” 4
    • β€” 5
  • β€” 6 7 ( )
  • β€” 8 ( )
  • β€” 9 ( , , )


:



  • β€” 15-19 ( , , )
  • β€” 20-24
  • β€” 25-29
  • β€” 30-34
  • β€” 30-34
  • β€” 35 β€” 39
  • β€” 40+




Hit Points
1 5 25 , ,
1 5 50
3 7 30
2 8 30 3
2 4 30
4 4.5 30
2 3.8 40
4 - 15/55 5




1
2 +
3 + +
4 + + +
5 + + + +
6 + +
7 + +
8 + +
9 + +
15 β€” 19 + + +
20 β€” 24 + + +
25 β€” 29 + + +
30 β€” 34 + + +
35 β€” 39 + + +
40+ + + +






2.5
3.5
4.5
5
3
3.2 β€” 3.8
4 β€” 6
-


, .



, . ().



:



"torpedo": {
    "sprite": "Bullet1_1.png", // 
    "isRandomIntensity": false, //     - true    - false
    "intensity": [
        // 0
        {
            "min": 50, //  
            "max": 200, //  
            "type": "pause" //pause -  , shoot -  ()
        },
        // 1
        {
            "min": 100,
            "max": 200,
            "type": "shoot"
        },
        {
            "min": 50,
            "max": 80,
            "type": "pause"
        },
        {
            "min": 30,
            "max": 100,
            "repeat": 2
        }
    ],
    "speed": 2.5, //
    "type": "bullet", // 
    "sound": "alienTorpedo"
}






, .



← β†’. .



( ).





, , , . .



1 2
2 4
10 ()
10 -
10 ( )
30 ( ) ( )
30 ( )
30
1 2
30 ( )
30
35 +
35 + + +
100 ( ) + ( )
250 ( )
500 + + + + + + +
1000 () + + + + + + + + ( )


JSON- :



"alien10": {
    "life": 35,
    "weapons": [
        {
            "weapon": "blueTorpedo",
            "position": {
                "x": -6,
                "y": 0
            }
        },
        {
            "weapon": "blueTorpedo",
            "position": {
                "x": 6,
                "y": 0
            }
        }
    ],
    "sprite": "AlienShip10_1.png",
    "movement": "horizontalFast",
    "killPoints": 2100
}


JSON- :



"horizontalFast": {
    "movements": [
        {
            "type": "freeMovement", //freeMovement - , followPlayer -    (  )
            "speedDelta": {
                "vx": -6,
                "vy": 0
            },
            "intensity": [ //    
                {
                    "min": 20,
                    "max": 150
                },
                {
                    "min": 150,
                    "max": 350
                }
            ]
        }
    ]
}






https://raw.githubusercontent.com/EntityFX/laseroid/master/resources/laser-age/graphics/PowerUps_1.png,



https://raw.githubusercontent.com/EntityFX/laseroid/master/resources/laser-age/graphics/Upgrade.png, . , ().





, . .



JSON- :



        "2": {
            "level": 1, 
            "enemies": [ //  
                {
                    "id": "alien1",
                    "position": {
                        "x": 200,
                        "y": 35
                    }
                },
                //...
                {
                    "id": "alien1",
                    "position": {
                        "x": 525,
                        "y": 40
                    }
                }
            ],
            "bonuses": [ //  
                {
                    "id": "bonus1",
                    "position": {
                        "x": 350,
                        "y": 10
                    }
                }
            ]
        },


JavaScript



JavaScript, Hexi JS: https://github.com/kittykatattack/hexi .



:



  • (, )
  • , ,


    • -. JSON (, )
  • (), -.


- TexturePacker



https://github.com/EntityFX/laseroid/blob/master/doc/ships-atlas-texture.png?raw=true



: https://github.com/kittykatattack/sound.js



:







:



https://github.com/EntityFX/laseroid/blob/master/doc/diagrams/game.png?raw=true





https://github.com/EntityFX/laseroid/blob/master/doc/diagrams/core.png?raw=true



Main



.



:



  • resources β€” (, , json)
  • sounds β€” : β€” , β€”
  • gameScene β€” HexiJS
  • game β€” Game
  • hexi β€” HexiJS
  • gameStorage β€” localStorage


:



  • init() β€” HexiJS
  • load() β€” (, , json)
  • setup() β€” , ,
  • playLoop() β€” ( , , , ).
  • saveGame() β€”
  • loadGame() β€”


:



Main.resources = [
        "images/environment1.png",
        "images/environment2.png",
        "images/environment3.png",
        "images/environment4.png",
        "images/interface.png",
        "images/life-icon.png",

        "images/ships-texture.json",
        "images/bullet-texture.json",

        "sounds/alien-torpedo-shoot.wav",
        "sounds/alien-red-plasma-shoot.wav",
        "sounds/hero-torpedo-shoot.wav",
        "sounds/explode.wav",
        "sounds/hero-green-plasma-shoot.wav",
        "sounds/alien-green-plasma-shoot.wav",
        "sounds/alien-blue-torpedo-shoot.wav",
        "sounds/alien-yellow-laser.wav",
        "sounds/pulse-plasma.wav",
        "sounds/laser.wav",

        "sounds/track0.ogg",
        "sounds/track1.ogg",
        "sounds/track2.ogg",
        "sounds/track3.ogg",
        "sounds/track4.ogg",

        "data/hero-configuration.json",
        "data/levels-configuration.json",
        "data/enemy-configuration.json",
        "data/ui-configuration.json",
    ];


Game



.



:



  • level β€” . : { "wave": 1 // , "type": 1 }
  • score β€” . : {"points": 0 }
  • bulletsController β€” BulletsController.
  • enemyController β€” EnemyController. ( .. )
  • player β€” Player
  • hexi β€” Hexi ()
  • game β€” Game
  • gameStorage β€” GameStorage


:



  • clearShips() β€” ,
  • setupLevel() β€” ( , , )
  • nextLevel() β€”
  • previousLevel() β€”
  • forwardLevel() β€” ( 5)
  • rewindLevel() β€” ( 5)
  • restoreState(gameState: JSON) β€” gameState
  • resetGame() β€” ( )
  • update() β€”
  • enemyDestroyed() β€”


GameStorage



.



:



  • game β€” Game


:



  • save() β€”
  • load() β€”


InputDevice



: click touch , .



:



  • game β€” Game


:



  • init() β€” callback'
  • loadTapped() β€” "Load"
  • storeTapped() β€” "Store"
  • resetTapped() β€” "Reset"
  • pauseTapped() β€” "Pause"




https://github.com/EntityFX/laseroid/blob/master/doc/diagrams/actors.png?raw=true



Actor



.



:



  • hexi β€” Hexi ()
  • game β€” Game
  • life β€”
  • initialLife β€”
  • sprite β€” Hexi.Sprite
  • shipConfiguration β€”


:



  • move() β€”
  • update() β€”
  • setPosition(position: {x, y}) β€”


WeaponedActor



( ) .



:



  • automatedWeapons β€”
  • canShoot β€”
  • isWeaponShooting β€”


:



  • startShoot() β€”
  • stopShoot() β€”
  • onShootStarted() β€” ,
  • onShootStopped() β€” ,
  • updateShooting() β€”


Enemy



.



:



  • type β€”
  • syncWeapons β€”
  • movementEngine β€” MovementEngine


:



  • setWeapon() β€”
  • shootWithWeapon() β€”
  • setLifeLine() β€”
  • hit() β€” ()


MovementEngine



.



, . vx, vy . ( ).



:



  • movementsConfiguration β€”
  • firstMovementConfiguration β€”
  • movementItensity β€”
  • movementItensityCounter β€”
  • movementItensitySlot β€”
  • isBounceBottom β€” . false,


:



  • setMovement() β€”
  • updateMovement() β€”


Player



.



:



  • weapons β€”
  • collisionSprite β€” ( , )
  • weaponLifeLevels β€”
  • invisibilityCounter β€” ( , )


:



  • upgrade() β€” (+1 )
  • downgrade() β€” (+1 )
  • shootWithLaser(currentWeapon, weapon) β€”
  • shootWithBullets(currentWeapon, weapon) β€”
  • setWeapon() β€”
  • setLife(life: number) β€” ( )
  • hitUpgrade(upgradeItem) β€”


Bonus



. .



:



  • type β€”
  • movementEngine β€” MovementEngine
  • upgradeBonus β€”


:



  • shootWithUpgrade(upgradeBonus: JSON) β€”


EnemyController



, , .



:



  • enemies β€”
  • bonuses β€”
  • player β€”
  • upgrades β€”


:



  • isLevelCompleted() β€” ( , )
  • update() β€”
  • clear() β€” ,


BulletsController



(), .



:



  • playerBullets β€”
  • enemyBullets β€”
  • explosionSplashes β€”
  • playerLaser β€” ( ).


:



  • update() β€” ,
  • clear() β€” ,
  • updatePlayerBullets() β€”
  • updatePlayerLaser() β€”
  • updateEnemyBullets() β€”
  • updateExplosions() β€”




JavaScript.



, , .



, , ..



, !



!





http://laseroid.azurewebsites.net/ β€”

https://github.com/EntityFX/laseroid β€”




All Articles