JeuWeb - Crée ton jeu par navigateur
[BDD] Gestion des objets et des effets des objets - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [BDD] Gestion des objets et des effets des objets (/showthread.php?tid=6045)



[BDD] Gestion des objets et des effets des objets - SorenS - 22-03-2012

'soir tout le monde,

je réfléchis à quelques concepts de jeux en ce moment. Et j'ai besoin de votre avis sur un point.

Voilà, dans le jeu les joueurs auront possibilité de récupérer des objets. Mais comment gérez vous (en bdd) le fait qu'un objet puisse servir à plusieurs choses ?

Exemple :
une cruche peut :
  • contenir un liquide
  • servir d'arme
  • servir à faire du bruit si on mets un trousseau de clés dedans par exemple

Comment voyez vous les choses ?


RE: [BDD] Gestion des objets et des effets des objets - Myrina - 22-03-2012

Pour ma part, j'utilise ce principe:

Concrètement, j'ai une table contenant tous les éléments de mon jeu (objets, personnages, ...); cette table contient peu d'informations (le nom, la description et le type de l'élément).
A coté, j'ai une table définissant toutes les caractéristiques pouvant être portées par mes éléments (nom de la caractéristique, code unique pour utilisation dans les sources, type de la valeur)
Puis une table joignant les deux en y rajoutant la valeur de la caractéristique pour l'élément concerné.

Ainsi, pour la cruche, j'aurai une occurrence de cette table pour la caractéristique "peut contenir du liquide" avec comme valeur un booléen à vrai, une autre "peut servir d'arme" avec comme valeur un booléen à vrai, une autre "dégâts infligés" avec un nombre comme valeur, une autre "cassable" avec comme valeur un booléen à vrai,...

En partant de l'élément, un select avec les bonnes jointures donnera d'un coup l'ensemble des caractéristiques de l'objet.
Dans l'autre sens, en partant de la caractéristique, un select permet d'obtenir l'ensemble des éléments caractérisés (utilisation du code unique de la caractéristique). Ex: Si le personnage chute, il suffit de rechercher l'ensemble des éléments présents dans son équipement qui possèdent la caractéristique "cassable" puis décider, pour chacun d'eux, si il est cassé ou non suite à la chute.


RE: [BDD] Gestion des objets et des effets des objets - Sephi-Chan - 22-03-2012

Je pense que j'utiliserais plein de colonnes pour décrire l'entité mais que la magie se ferait dans le code.
Pour cette affaire de cruche, voilà à quoi pourrait ressembler l'entrée dans la table items.

Elle aurait déjà une colonne name name, une colonne material (fer, bois, etc.), une colonne state (solide, liquide, gazeux), des colonnes booléennes liquid_container, weapon, noisy_container, cutting, blunt (contondant), des colonnes numériques volume (pour déterminer ce qu'elle pourra contenir), weight (pour déterminer les dégâts qu'il infligera), etc.

Ensuite dans le code, tu peux étendre dynamiquement ton objet selon ses attributs.


# A l'utilisation :
item = Item.find(42)
rich_item = RichItem.build(item)


class RichItem
def self.build(item)
rich_item = RichItem.new(item)
rich_item.include(LiquidContainer) if item.container?
rich_item.include(Weapon) if item.weapon?
rich_item.include(NoisyContainer) if item.weapon?
rich_item
end

def initialize(item)
@item = item
end
end


class NoisyContainer
def content=(content)
@content = content
end

def content
@content
end

def noise
return 0 if @content.gas?

if (@content.volume * 2) < @item.volume
case @content.material
when 'wood' 50
when 'metal' 100
else raise(UnknownMaterial)
end
else
case @content.material
when 'wood' 20
when 'metal' 40
else raise(UnknownMaterial)
end
end
end

class UnknownMaterial < StandardError; end
end


class Weapon
def damage
if @item.blunt?
@item.weight * 2
elsif @item.cutting?
@item.weight
else
@item.weight / 2
end
end
end


class LiquidContainer
def content=(content)
@content = content
end

def content
@content
end
end

Voilà, je pense qu'avec un code de ce genre, tu peux vraiment couvrir beaucoup de possibilité. Ça demande un peu de travail pour combiner les propriétés (genre un conteneur de liquide qui fait du bruit) mais ça se fait bien quand même.


RE: [BDD] Gestion des objets et des effets des objets - CaptainJS - 24-03-2012

Bonjour,

Niveau BdD le problème des colonnes fixes est que le jour où tu veux ajouter une action, t'es obligé de modifier ta BdD et ton script ... alors que les effets dans une table indépendante permettent d'ajouter des effets sans modifier les tables.