Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/J-Puls/domain-destroyer
A modern spin-off of the timeless Desktop Destroyer game developed by Miroslav Němeček
https://github.com/J-Puls/domain-destroyer
90s browser-game desktop-destroyer game html-game ing mini-game miroslav-nemecek react reactjs retro typescript vintage
Last synced: 3 months ago
JSON representation
A modern spin-off of the timeless Desktop Destroyer game developed by Miroslav Němeček
- Host: GitHub
- URL: https://github.com/J-Puls/domain-destroyer
- Owner: J-Puls
- License: mit
- Created: 2020-09-08T15:51:17.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2020-12-29T19:24:05.000Z (about 4 years ago)
- Last Synced: 2024-10-03T00:27:18.518Z (4 months ago)
- Topics: 90s, browser-game, desktop-destroyer, game, html-game, ing, mini-game, miroslav-nemecek, react, reactjs, retro, typescript, vintage
- Language: TypeScript
- Homepage:
- Size: 448 KB
- Stars: 7
- Watchers: 3
- Forks: 3
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# domain-destroyer
A modern recreation of the timeless Desktop Destroyer game developed by Miroslav Němeček, written in TypeScript for the web.
## Controls
| key | function |
| ------- | ------------------- |
| `mouse` | **fire weapon** |
| `1 key` | **hammer** |
| `2 key` | **machine gun** |
| `3 key` | **stamp** |
| `c key` | **clear screen** |
| `- key` | **previous weapon** |
| `= key` | **next weapon** |
| `; key` | **volume down** |
| `' key` | **volume up** |
## Installation```bash
npm i domain-destroyer
```or
[clone the repository](https://github.com/J-Puls/domain-destroyer.git) and compile the TypeScript yourself with
```bash
npm run build
```
## Setup- Import the `Destroyer` constructor
```javascript
import Destroyer from "domain-destroyer";
```- Import the included CSS file
```javascript
import "domain-destroyer/dist/css/destroyer.min.css";
```
## APIThe **`Destroyer`** constructor takes two arguments:
- **`parent`**: `HTMLDivElement` - the element to act as the bounding container for the game contents
- **`options`**: `object` - optional parameters for controlling different aspects of the game upon instantiation
- **`defaultVolume`**: `number (0 - 1)` - the initial volume
- **`onDamage`**: `(pageHealth) => {}` - a callback function that will be called when a weapon _"inflicts damage"_ to the page
- **`pageHealth`**: `number` - the total amount of _"health"_ the page has (this is decremented every time a weapon fires)
- **`particleLimit`**: `number` - the maximum number of particles allowed to exist at one time (only effects the animation phase of rendering, not how many particles are persisted on screen)
- **`volumeChangeDelta`**: `number (0 - 1)` - how much the volume is incremented / decremented when calling `volumeUp()` or `volumeDown()`
- **`zIndexStart`**: `number` - the z-index at which game elements should begin layering
Once instantiated, you will have access to the following noteworthy properties and methods:
| property | description |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`clear()`** | clears all currently rendered particles |
| **`currentWeaponID`** | the numeric ID for the current weapon in use |
| **`fire()`** | triggers the weapon to fire a single shot |
| **`inject()`** | injects the visible contents of the game into the parent element |
| **`isFiring`** | boolean relating to the current state of the weapon |
| **`mousePos`** | tracks the x / y coordinates of the mouse within the viewport |
| **`particleLimit`** | the number of particle animators allowed to exist at one time (for animation performance only, does not limit how many particles are persisted on the screen) |
| **`setVolume()`** | explicitly sets a certain volume level (from 0 to 1) |
| **`setWeapon()`** | explicitly sets the weapon by its numeric ID |
| **`updateCSS()`** | updates the CSS variables pertaining to the current weapon |
| **`volume`** | the volume level (from 0 to 1) |
| **`volumeDown()`** | lowers the volume by .1 until min volume is reached |
| **`volumeUp()`** | raises the volume by .1 until max volume is reached |
| **`weaponDown()`** | sets the current weapon to the previous in the list |
| **`weaponUp()`** | sets the current weapon to the next in the list |
## Usage1. Save your desired parent container to a variable
```javascript
const myParent = document.querySelector("#myParent");
```2. Create an instance of the `Destroyer` object, passing it the `parent` and `options` arguments
3. Inject the `Destroyer` game components into your selected parent container using the `inject()` method
```javascript
const options = { particleLimit: 20, zIndexStart: 5 };const myDestroyer = new Destroyer(myParent, options);
myDestroyer.inject();
```### Example
Below is an example of how to use domain-destroyer in a **`React`** component.
```javascript
import React, { useEffect, useState } from "react";
import Destroyer from "domain-destroyer";
import "domain-destroyer/dist/css/destroyer.min.css";const App = () => {
let myParent;
const [destroyer, setDestroyer] = useState(null);const options = {
defaultVolume: 0.5,
particleLimit: 20,
zIndexStart: 5,
onDamage: (pageHealth) => console.log(pageHealth),
pageHealth: 200,
volumeChangeDelta: 0.5,
};useEffect(() => {
myParent && setDestroyer(new Destroyer(myParent, options));
}, [myParent]);useEffect(() => {
destroyer && destroyer.inject();
}, [destroyer]);return
(myParent = el)} />;
};export default App;
```