–1 vote

Hello!
I'm creating a script that stores stats for different playable characters in my game. Each playable character has the same structure (name, speed, weapon(s), abilities, etc.). I wondering, how do you use object-oriented programming (OOP) in GDScript?
If this was JavaScript, it would look something like:

var constructor = function(param1,param2) {
this.param1 = param1,
this.param2 = param2,
};
var instance = constructor('value', 'value');

How can this be recreated in GDScript so it has the same functionality?
Thanks!

in Engine by (23 points)

This does not belong in the "Engine" category

1 Answer

+1 vote
Best answer

Completely rewriting the answer since the question wasn't clear.

CharacterStats.gd:

class_name CharacterStats

var name: String = "N/A"
var health: int = -1
var mana: int = -1

func _init(name: String, health: int, mana: int):
    self.name = name
    self.health = health
    self.mana = mana

func get_stats() -> String:
    return name + " has " + str(health) + " health and " + str(mana) + " mana."

func print_stats() -> void:
    print(self.get_stats())

Node.gd:

extends Node


var characters_data: Dictionary = {
    "Cole": CharacterStats.new("Cole", 100, 30)
}


func _ready():
    print(characters_data["Cole"].get_stats())
    characters_data["Kaya"] = CharacterStats.new("Kaya", 40, 150)
    if characters_data["Kaya"].has_method("print_stats"):
        characters_data["Kaya"].print_stats()

CharacterStats.gd is not attached to any node (it also doesn't extend anything), but Node.gd is attached to a Node. In this design CharacterStats.gd is sort of a header-file, like in c++.

by (141 points)
selected by

Thanks for answering, but this wasn't exactly what I was going for. Sorry if I wasn't very clear.

I want to create a dictionary that stores all of the character stats. I could do something like this:

var character_data = {
character1={name='Name',speed=400...},
character2={name='name',speed=250...},
...
}

But that would be repetitive and take a very long time. I want to make a function that takes in the separate stats as parameters, compile them into a dictionary, and then return the dictionary, so its entries can be accessed. I originally tried this:

func character_new(name:String,speed:int,...)
   var character_data = {
   name=name,
   speed=speed,
   ...}
   return character_data
var character1 = character_new('Name',400...)

But it didn't work. How can I make something like this that works? Thanks, once again.

I edited the answer.

That makes a lot of sense! Thanks so much!!!!!!!

Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read How to use this Q&A? before posting your first questions.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to webmaster@godotengine.org with your username.