0.5.5 • Published 10 months ago

@loolzaaa/vue-gaming-room v0.5.5

Weekly downloads
-
License
MIT
Repository
-
Last release
10 months ago

Vue Gaming Room

A basic platform for creating web-based games with a room concept based on Vue.

When entering the game page, the user must specify his nickname, and then create his own or join someone else’s room, specifying its code. Further behavior of the application depends on the game implementation.

Usage

npm install axios @loolzaaa/vue-gaming-room
  • Replace some predefined variable in Vite config:
// vite.config.js

// ... some imports ...
export default defineConfig({
    // ... some properties ...
    // Vue Gaming Room constant replacement
    define: {
        'env.VGR_BASE': 'import.meta.env.BASE_URL'
    }
})
  • Import Vue Gaming Room styles to your project
// main.js
import '@loolzaaa/vue-gaming-room/style'
  • Import GamingRoom component to you App.vue and use it in conjunction with your room implementation
<script setup>
import { GamingRoom } from '@loolzaaa/vue-gaming-room'

// REQUIRED: This is your room implementation component
import RoomMain from '@/components/RoomMain.vue'

// REQUIRED: This is your room background
import bgImg from '@/assets/bg.jpeg'

// OPTIONAL: This is your settings component implementation
import SettingsMain from '@/components/SettingsMain.vue'

// OPTIONAL: Fine-tune background styles
const bgStyles = {
  position: '52% 0', // CSS: background-position
  opacity: 0.75, // Background overlay opacity
  color: '#000', // Background overlay color
}

// OPTIONAL: You can provide link (precedence) or component with game rules
</script>

<template>
  <GamingRoom
    :bgImg="bgImg"
    :bgStyles="bgStyles"
    :roomComp="RoomMain"
    :settingsComp="SettingsMain"
    rulesLink="/rules.pdf"
  >
    <!-- <div class="logo">Some logo for game</div> -->
  </GamingRoom>
</template>
  • Place some favicon to public folder

Room implementation props

Prop nameTypeRequiredDescription
membersArraytruelist of room members (players with one admin and spectators)
gameStartedBooleantruegame started flag
currentMemberObjectfalsecurrent player/member who has the game running
changeReadyStatusFunctiontruefunction for changing ready/not ready to game status
changePlayerStatusFunctiontruefunction for changing player/spectator status
startGameFunctiontruefunction for start game routine
newGameDataObjectfalsesome data from game server for new game after starting

Using State Manager

Import Pinia to your component and use it as usual:

import { useRoomStore } from '@loolzaaa/vue-gaming-room'

console.log(store.roomCode) // Example: AFRG

Pinia Room store properties

Prop nameDescription
gameNameCurrent game name
nicknameCurrent player nickname
userIdCurrent player user id (used for game state receiving from game server)
roomCodeCurrent game room code
gameSettingsCurrent game settings
webSocketWebSocket instance for sending some events
addWsEventHandlerFunction for registering event handlers from game server via WebSocket

IMPORTANT! If you provide settings component, you must set initial value of game settings in state manager.

Change theme colors

You need to install SASS to changing main colors of Vue Gaming Library:

npm i sass -D

After that, you can create some style.scss in assets folder and change color variables:

// Use all component styles from library
@use '@loolzaaa/vue-gaming-room/style';

// Change some variables
@use '@loolzaaa/vue-gaming-room/sass/variables' with (
    $main-color: #b577b5,
    $dark-color: #352233,
);
@use '@loolzaaa/vue-gaming-room/sass';

Finally, import created style.scss in app entry point:

// main.js
- import '@loolzaaa/vue-gaming-room/style'
+ import './assets/main.scss'

Using library utils

Change member nickname

import { useRoomStore } from '@loolzaaa/vue-gaming-room'
import { changeMemberNickname } from '@loolzaaa/vue-gaming-room/utils'

const store = useRoomStore()

function changeNickname(member) {
  if (member.nickname !== store.nickname) {
    return
  }
  changeMemberNickname()
}

Change member color

<script setup>
import { useRoomStore } from '@loolzaaa/vue-gaming-room'
import { changeMemberColor } from '@loolzaaa/vue-gaming-room/utils'

const store = useRoomStore()

function changeColor(event) {
  changeMemberColor(event.target.value) // function accepts #123456 RGB format
}
</script setup>

<template>
  <!-- currentMember from library props -->
  <input
    type="color"
    :value="currentMember.color"
    @change="changeColor"
  />
</template>

Hold to action button

Below an example start button that need to hold for game start if not all members ready

import { ref, computed } from 'vue'
import { holdToAction } from '@loolzaaa/vue-gaming-room/utils'

const startFn = () => props.startGame(false)
const forceStartFn = () => props.startGame(true)

const startGameBtn = ref(null) // Start button ref from template

const allMembersReady = computed(() => {
  let allReady = props.members.every((el) => el.ready)
  if (startGameBtn.value) {
    startGameBtn.value.removeEventListener('click', startFn)
    holdToAction('disable', startGameBtn.value)
    if (allReady) {
      startGameBtn.value.addEventListener('click', startFn)
    } else {
      holdToAction('enable', startGameBtn.value, forceStartFn, 2000)
    }
  }
  return allReady
})

holdToAction function signature:
function holdToAction(mode, button, callback, timeout = 1000)

Game server

You can find Java implementation of Vue Gaming Room Server here.

0.5.4

10 months ago

0.5.3

10 months ago

0.5.5

10 months ago

0.5.2

10 months ago

0.5.1

1 year ago

0.5.0

1 year ago

0.4.8-3

1 year ago

0.4.8-2

1 year ago

0.4.8-1

1 year ago

0.4.8-0

1 year ago

0.4.7

1 year ago

0.4.6

1 year ago

0.4.5

1 year ago

0.4.4

1 year ago

0.4.3

1 year ago

0.4.1

1 year ago

0.4.0

1 year ago

0.3.2

1 year ago

0.3.1

1 year ago

0.3.0

1 year ago

0.2.0

1 year ago

0.1.0

1 year ago