• Stars
    star
    248
  • Rank 158,307 (Top 4 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created almost 5 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A web component to use Phaser Framework with Angular, React, Vue, etc 🎮

Built With Stencil Maintenance NPM version Downloads TotalDownloads Twitter Follow

IonPhaser

Web Component built with Stencil.js to integrate Phaser with any other framework.

IonPhaser

Inspired by the old IonPhaser directive

Demo

Do you want to see this web component in action? Visit https://codepen.io/jdnichollsc/full/oRrwKM yay! 🎉

IonPhaser CE

Looking for Phaser Framework CE (Community Edition)? Check here!

Usage

Simply add this tag wherever you want in your project:

<ion-phaser [game]="game"></ion-phaser>

Getting Started

Packages

Project Package Version Links
Core @ion-phaser/core version README.md
React @ion-phaser/react version README.md

Script tag

  • Put a script tag similar to this <script src='https://cdn.jsdelivr.net/npm/@ion-phaser/[email protected]/dist/ionphaser/ionphaser.esm.js'></script> in the head of your index.html
  • Then you can use the element anywhere in your template, JSX, html etc

Node Modules

  • Run npm install @ion-phaser/core --save
  • Put a script tag similar to this <script src='node_modules/@ion-phaser/core/dist/ionphaser/ionphaser.esm.js'></script> in the head of your index.html
  • Then you can use the element anywhere in your template, JSX, html etc

In a stencil-starter app

  • Run npm install @ion-phaser/core --save
  • Add an import to the npm packages import @ion-phaser/core;
  • Then you can use the element anywhere in your template, JSX, html etc

Framework integrations

Angular

Using ion-phaser component within an Angular project:

Including the Custom Elements Schema

Including the CUSTOM_ELEMENTS_SCHEMA in the module allows the use of Web Components in the HTML files. Here is an example of adding it to AppModule:

import { BrowserModule } from '@angular/platform-browser';
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AppComponent } from './app.component';

@NgModule({
  declarations: [AppComponent],
  imports: [BrowserModule],
  bootstrap: [AppComponent],
  schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class AppModule {}

The CUSTOM_ELEMENTS_SCHEMA needs to be included in any module that uses IonPhaser.

Calling defineCustomElements

IonPhaser component includes a function used to load itself in the application window object. That function is called defineCustomElements() and needs to be executed once during the bootstrapping of your application. One convenient place to add it is in the main.ts file as follows:

import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { defineCustomElements as defineIonPhaser } from '@ion-phaser/core/loader';

import { AppModule } from './app/app.module';
import { environment } from './environments/environment';

if (environment.production) {
  enableProdMode();
}

platformBrowserDynamic().bootstrapModule(AppModule)
  .catch(err => console.log(err));
defineIonPhaser(window);

Using IonPhaser in an Angular component

<ion-phaser
  [game]="game"
  [initialize]="initialize"
></ion-phaser>
public game = {
  width?: integer | string;
  height?: integer | string;
  zoom?: number;
  resolution?: number;
  type?: number;
  parent: HTMLElement | string;
  canvas?: HTMLCanvasElement;
  canvasStyle?: string;
  context?: CanvasRenderingContext2D;
  scene?: object;
  seed?: string[];
  title?: string;
  url?: string;
  version?: string;
  autoFocus?: boolean;
  input?: boolean | InputConfig;
  disableContextMenu?: boolean;
  banner?: boolean | BannerConfig;
  dom?: DOMContainerConfig;
  fps?: FPSConfig;
  render?: RenderConfig;
  backgroundColor?: string | number;
  callbacks?: CallbacksConfig;
  loader?: LoaderConfig;
  images?: ImagesConfig;
  physics?: object;
  plugins?: PluginObject | PluginObjectItem[];
  scale?: ScaleConfig;,
  instance: Game // It's created internally when the game is initialized
};

public initialize: boolean;

constructor(private api : ApiService){}

initializeGame() {
  this.game = {
    width: "100%",
    height: "100%",
    type: Phaser.AUTO,
    scene: {}
  }
  this.initialize = true
}

getInstance(){
  return this.game.instance
}

from stencil documentation

React

Specific Wrapper

When using a wrapper component, It's not necessary to access the reference directly to configure the game. More details here.

import React, { Component } from 'react'
import Phaser from 'phaser'
import { IonPhaser } from '@ion-phaser/react'

class App extends Component {
  state = {
    initialize: false,
    game: {
      width: "100%",
      height: "100%",
      type: Phaser.AUTO,
      scene: {}
    }
  }
  render() {
    const { initialize, game } = this.state
    return (
      <IonPhaser game={game} initialize={initialize} />
    )
  }
}

Web Component

Other option is using the web component directly:

import React from 'react'
import ReactDOM from 'react-dom'
import { defineCustomElements as defineIonPhaser } from '@ion-phaser/core/loader'
import Phaser from 'phaser'

const game = {
  width: "100%",
  height: "100%",
  type: Phaser.AUTO,
  scene: {}
}

ReactDOM.render(<ion-phaser ref={el => el.game = game} />, document.getElementById('root'));

defineIonPhaser(window);

from stencil documentation

Vue

In order to use the ion-phaser Web Component inside of a Vue application, it should be modified to define the custom elements and to inform the Vue compiler which elements to ignore during compilation. This can all be done within the main.js file as follows:

import Vue from 'vue';
import { defineCustomElements as defineIonPhaser } from '@ion-phaser/core/loader'

import App from './App.vue';

Vue.config.productionTip = false;
Vue.config.ignoredElements = [/ion-\w*/];

// Bind the IonPhaser custom element to the window object
defineIonPhaser(window);

new Vue({
  render: h => h(App)
}).$mount('#app');

Using IonPhaser in a Vue component

<template>
  <ion-phaser 
    v-bind:game.prop="game"
    v-bind:initialize.prop="initialize"
  />
</template>

<script>
import Phaser from 'phaser'
export default {
  name: 'HelloWorld',
  data() {
    return {
      initialize: false,
      game: {
        width: "100%",
        height: "100%",
        type: Phaser.AUTO,
        scene: {
          init: function() {
            this.cameras.main.setBackgroundColor('#24252A')
          },
          create: function() {
            this.helloWorld = this.add.text(
              this.cameras.main.centerX, 
              this.cameras.main.centerY, 
              "Hello World", { 
                font: "40px Arial", 
                fill: "#ffffff" 
              }
            );
            this.helloWorld.setOrigin(0.5);
          },
          update: function() {
            this.helloWorld.angle += 1;
          }
        }
      }
    }
  }
}
</script>

from stencil documentation

Contributing

When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other method with the owners of this repository before making a change.
Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated ❤️.
You can learn more about how you can contribute to this project in the contribution guide.

Supporting 🍻

I believe in Unicorns 🦄 Support me, if you do too.

Donate Ethereum, ADA, BNB, SHIBA, USDT, DOGE:

Wallet address

Wallet address: 0x3F9fA8021B43ACe578C2352861Cf335449F33427

Please let us know your contributions! 🙏

Enterprise 💼

Available as part of the Tidelift Subscription.

The maintainers of IonPhaser and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. Learn more.

Security contact information 🚨

To report a security vulnerability, please use the Tidelift security contact. Tidelift will coordinate the fix and disclosure.

License ⚖️

This repository is available under the MIT License.

Happy coding 💯

Made with ❤️

More Repositories

1

react-native-inappbrowser

📱InAppBrowser for React Native (Android & iOS) 🤘
Java
1,266
star
2

RestClient

🦄 A Promise based REST and HTTP client for Unity 🎮
C#
1,214
star
3

awesome-unity

A curated list of awesome Unity games! 🎮
714
star
4

awesome-jsgames

A curated list of awesome JavaScript Games 🎮
445
star
5

TheJobInterviewGuide

A job guide to help developers get through interviews and get amazing jobs!
333
star
6

animatable-component

Animate once, use Everywhere! 💫
TypeScript
245
star
7

MyAPI

A template to create awesome APIs easily ⚡️
TypeScript
135
star
8

Phaser-Kinetic-Scrolling-Plugin

Kinetic Scrolling plugin for Canvas using Phaser Framework
JavaScript
130
star
9

MyApp

A template to create awesome Apps easily ⚡️
TypeScript
75
star
10

nativescript-inappbrowser

📱InAppBrowser for NativeScript (Android & iOS) 🤘
TypeScript
72
star
11

nativescript-ionic-template

📱 🖥 Create Mobile First apps, Web and Native sharing the code with Angular 🎉
TypeScript
69
star
12

cardano-developer

A Cardano Developer Guide
62
star
13

proyecto26.github.io

The Proyecto26 github homepage.
JavaScript
57
star
14

thecryptopurge

A crypto shooter-survival real-time NFT-based game inspired by The Purge 💸
JavaScript
57
star
15

MyBot

🧠 Create chatbots easily with Bot Framework! 🤖
JavaScript
31
star
16

Phaser-Workshop

A workshop to create awesome games with Phaser Framework 🎮
22
star
17

mercadopago-api

API for MercadoPago Checkout
TypeScript
20
star
18

Roxy-Fileman-for-Node.js

Roxy Fileman, upload and manage files with Node.js!
JavaScript
15
star
19

PokeDex-GO

The Best PokéDex for Pokémon Go, created by Pokémon masters! 😺
JavaScript
14
star
20

ion-phaser-ce

A web component to use Phaser Framework CE (Community Edition) with Angular, React, Vue, etc 🎮
TypeScript
11
star
21

react-native-mercado-pago-enterprise

Integrating Mobile Checkout of MercadoPago with React Native to create a payment experience in your applications.
11
star
22

use-dictionary

A React useReducer() hook to use dictionaries (keys and values) 🔑
TypeScript
9
star
23

dotnet-documentation

SOLID, DI, N-Tier, Logs, etc with dotnet
9
star
24

colombia

Departamentos y Municipios de Colombia 🇨🇴
6
star
25

BuyMeNear

Buy Me Near is a revolutionary, meaningful way to fund your creative work.
JavaScript
6
star
26

react-native-animations-demo

Animate with React Native ⏯
JavaScript
6
star
27

web-animations-workshop

Workshop of Web Animations API and Web Components
4
star
28

record-audio-button-enterprise

🔴 A Web Component for Recording Audio with a swipe gesture inspired by WhatsApp (Enterprise) 💼
4
star
29

Xamarin

A summary/template about Xamarin 📱
C#
3
star
30

social-change

Social change through technology, together we are more! 💪
3
star
31

Phaser-Market

Discover & share phaser plugins for your games
CSS
3
star
32

OpenSourceCoin

A cryptocurrency for Open Source Contributors & Developers
2
star
33

ionic-background-geolocation

Background Geolocation App using BackgroundLocation and Location ionic plugins
TypeScript
2
star
34

stencil-ionic-components

Create StencilJS Components reusing Ionic components
TypeScript
2
star
35

concertx-frontend

Empowering musical artists and fans with immersive concert experiences and trusted transactions. Start bringing your concert ideas to life today!
TypeScript
2
star
36

NodeBots

Nodebots (Tessel), IoT and Azure
JavaScript
1
star
37

flutter-inappbrowser

📱InAppBrowser for Flutter (Android & iOS) 🤘
1
star
38

ProjectX

NextJS template with TailwindCSS, etc
1
star