[PYTHON] Erstelle ein 2D-Rollenspiel mit Ren'Py (3) -Items and Tool Shop

Überblick

Hallo, das ist erotischer Gamer Kanimaru, du bist in letzter Zeit nicht Eroge, negativ, die Spielproduktion. Dies ist die dritte 2D-RPG-Produktion mit Ren'Py. Dieses Mal werden wir Artikel und Werkzeuggeschäfte herstellen.

Letztes Mal: 2D-Rollenspiel mit Ren'Py (2) -Party und Status erstellen

** Umfang dieses Artikels ** Implementieren Sie Elemente und ermöglichen Sie deren Verwendung über den Menübildschirm sowie den Kauf und Verkauf im Werkzeugladen

Hintergrund

Warum brauchst du Gegenstände für das Rollenspiel? Ich glaube nicht, dass jemand dieses Gefühl hat. Wenn Sie einen Gegenstand herstellen, bevor Sie einen Kampf führen, können Sie sich während des Kampfes erholen, sodass Sie den Gegenstand zuerst herstellen.

1. Machen Sie einen Artikel

Erstellen Sie zunächst ein Element. Ich implementiere das zu verwendende Teil über den Menübildschirm.

Systemimplementierung

Wie beim letzten Mal ist dies nur Python, nicht Ren'Py. Wenn Sie also Python verstehen, können Sie tun, was Sie wollen.

Erstellen Sie zunächst ein Inventar mit dem Diktattyp. Verwenden Sie den Schlüssel als Elementinstanz und den Wert als Anzahl der besessenen Elemente. Benutzerdefinierte Typinstanzen sind hashbar, sodass sie als Diktatschlüssel verwendet werden können. Praktisch. Ich möchte beim normalen Schreiben von Python-Code nicht so oft globale Variablen verwenden, aber Ren'Py verwendet globale Variablen gnadenlos, weil es einige Macken gibt.

inventory = {}

Erstellen Sie als Nächstes die Klasse "Item", die die Basis des Elements bildet. Definieren Sie den Preis, das Verfügbarkeitsflag usw. als Instanzvariablen. Die Methode definiert einen Getter, der zum Zeitpunkt der Verwendung eine Nachricht zurückgibt, zum Zeitpunkt des Erwerbs / Verkaufs verarbeitet usw.

class Item():
    def __init__(self, name, desc, price):
        self.name = name
        self.desc = desc
        self.price = price
        self.sell_price = int(price / 2.0)
        self.marketable_flag = True #Wenn False, kann es nicht verkauft werden
        self.usable_flag = True #Wenn False, kann es nicht normal verwendet werden
        self.battle_flag = True #Wenn False, kann es nicht während des Kampfes verwendet werden
        self.icon_image = "images/icons/medical_item.png "

    ###Auslassung: Basic Getter###

    def get_confirm_msg(self):
        return self.name + "Benutzt du?"

    def get_result_msg(self):
        return self.name + "ich benutzte"

    #Kauf im Laden
    def buy_item(self, buy_amount = 1):
        party_money.add_value(-self.price * buy_amount)
        inventory[self] += buy_amount

    #Verkauf im Laden
    def sell_item(self, sell_amount = 1):
        party_money.add_value(self.sell_price * sell_amount)
        inventory[self] -= sell_amount

    #Bei Abholung oder Empfang
    def find_item(self, find_amount = 1):
        inventory[self] += find_amount 

Erstellen Sie eine Klasse, die die Elementklasse für jeden Elementtyp erbt. Wiederherstellungsgegenstände, Statusgegenstände, Materialgegenstände, Rezeptgegenstände usw. Implementiere, was du für dein Spiel brauchst. Unten finden Sie als Beispiel den Code für die Wiederherstellungselementklasse.

Ist neu definiert. Rufen Sie bei Verwendung eines Elements die Methode "add_current_value (diff)" der Instanz des Zielstatus auf, die wiederhergestellt werden soll, und verringern Sie den Wert dieses Elements aus dem zuvor definierten "Inventar".

#Wiederherstellungsgegenstand
class MedicalItem(Item):
    def __init__(self, name, desc, price, target_stat, amount):
        super(MedicalItem, self).__init__(name, desc, price)
        self.target_stat = target_stat
        self.amount = amount

    def get_target_stat(self):
        return self.target_stat

    def get_amount(self):
        return self.amount

    def get_usable_flag(self):
        if self.target_stat.get_current_value() == self.target_stat.get_max_value():
            return False
        else:
            return True

    #Erhöhen Sie den aktuellen Preis
    def use_item(self):
        self.target_stat.add_current_value(self.amount)
        inventory[self] -= 1

Sobald Sie dies getan haben, fügen Sie Ihre Artikel wie folgt zum "Inventar" hinzu:

medical_hp_small = MedicalItem(name = "Ein bisschen bittere Medizin", desc = "Stellt eine kleine Menge körperlicher Kraft wieder her.", price = 50, target_stat = stat_hp, amount = 40)
inventory[medical_hp_small] = 3

Sie können jetzt Ihre Artikel verwalten.

UI-Implementierung

Dies ist Ren'Pys Original. Das Ergebnis dieser Implementierung ist zuerst in der Abbildung dargestellt. SnapCrab_griseo_2020-8-1_18-12-17_No-00.png Die wichtigsten verwendeten Funktionen und Variablen sind wie folgt.

Dann werde ich den Code setzen.

screens.rpy


#Elementbildschirmeinstellungen
screen inventory():

    tag menu

    use game_menu(_("Artikel"), scroll="None"):

        style_prefix "inventory"

        hbox: #Nebeneinander Status, Artikel, Artikelliste
            spacing 40
            vbox: 
                ###Ausgelassen: Statusbildschirm (siehe letztes Mal)###
            
            viewport: #Verwenden Sie das Ansichtsfenster, um zu scrollen, wenn viele Elemente vorhanden sind
                scrollbars "vertical"
                mousewheel True
                draggable True
                pagekeys True
                xsize 350
                ysize 500
                vbox:
                    label _("Artikel")
                    null height (2 * gui.pref_spacing)
                    for item, amount in inventory.items():
                        if amount > 0:
                            hbox:
                                $item_name = item.get_name()
                                $usable_flag = item.get_usable_flag()
                                $confirm_msg = item.get_confirm_msg()
                                $desc = item.get_desc()
                                $icon_image = item.get_icon_image()
                                add icon_image
                                if usable_flag and amount > 0: #Wenn der Artikel verfügbar ist
                                    textbutton _(item_name + " " + str(amount)):
                                        tooltip desc 
                                        action Confirm(confirm_msg, UseItem(item))
                                else: #Wenn es nicht verwendet werden kann. Beachten Sie, dass QuickInfos nicht verwendet werden können, wenn sie unempfindlich sind
                                    textbutton _(item_name + " " + str(amount)):
                                        tooltip desc 
                                        action NullAction()
                                        text_style "unusable_text" #Farbe ändern
                                null height (gui.pref_spacing)

            vbox:
                xsize 350

                label _("Artikeldetails")
                $ tooltip = GetTooltip()
                if tooltip:
                    null height (4 * gui.pref_spacing)
                    text "[tooltip]"

###Stil weggelassen###

style unusable_text:
    color gui.insensitive_color

Dieser Code zeigt einen Bestätigungsbildschirm an, der beim Klicken auf ein verfügbares Element eine Bestätigungsmeldung ausgibt, und ruft die Aktion "UseItem" auf, wenn "Ja" ausgewählt ist. UseItem ist eine einzigartig implementierte Aktion.

screens.rpy


init:
    python:
        class UseItem(Action):
            def __init__(self, item):
                self.item = item

            def predict(self):
                renpy.predict_screen("notify")

            def __call__(self):
                renpy.notify(self.item.get_result_msg())
                self.item.use_item()

In Ren'Py kann eine Klasse, die die Klasse "Action" erbt, als Aktion aufgerufen werden, und wenn sie aufgerufen wird, wird die Verarbeitung in "call ()" ausgeführt. Wenn hier "UseItem (item)" aufgerufen wird, wird das "result_msg" von "item" erfasst, in notify angezeigt und dann die "use_item ()" Methode von "item" aufgerufen.

Zeigen Sie abschließend den hier im Spielmenü erstellten Bildschirm "Inventar ()" an. Es ist das gleiche wie der Status.

screens.rpy


screen navigation():

    ###Unterlassung###

        if main_menu:

            ###Unterlassung###

        else:

            textbutton _("Status") action ShowMenu("stats")

            textbutton _("Artikel") action ShowMenu("inventory") #Fügen Sie diese Zeile hinzu

Sie können den Gegenstand jetzt aus dem Spielmenü verwenden.

2. Kauf und Verkauf in einem Werkzeugladen

Jetzt, da Sie den Artikel verwenden können, kaufen wir ihn im Werkzeugladen. Hier kommen die in der Klasse "Item" definierten Methoden "price" und "buy_item ()" ins Spiel.

Systemimplementierung

Ich habe hier nicht viel zu tun, ich definiere nur einen Artikel in einem Werkzeugladen. Dieses Mal habe ich eine Liste erstellt, aber wenn Sie das Konzept des Inventars haben, können Sie damit umgehen, indem Sie es mit Diktat erstellen.

store.rpy


#Registrieren Sie einen Artikel im Werkzeugladen
init python:
    store = [medical_hp_small, medical_hp_medium, enhancing_hp]

UI-Implementierung

Das Ergebnis der Implementierung wird ebenfalls hier veröffentlicht. SnapCrab_griseo_2020-8-1_18-50-15_No-00.png Es ist ein wenig unnatürlich, weil es aus vorhandenen Bildern (insbesondere Bildlaufleisten) besteht, aber funktional vollständig ein Werkzeugladen ist. Darüber hinaus macht es beim Kauf oder Verkauf ein Geräusch, obwohl es nicht im Bild übertragen wird. Es ist wie ein Spiel!

Unten ist der Code. Die Klassendefinition wird ebenfalls sofort veröffentlicht.

store.rpy


init 1 python:
    #Wenn die Textschaltfläche auf der Kauf-Imagemap gedrückt wird
    class BuyItem(Action):
        def __init__(self, item):
            self.item = item

        def __call__(self):
            self.item.buy_item()
            renpy.restart_interaction()
            renpy.play("audio/sounds/coins.mp3")

    #Wenn die Textschaltfläche auf der Verkaufs-Imagemap gedrückt wird
    class SellItem(Action):
        def __init__(self, item):
            self.item = item

        def __call__(self):
            self.item.sell_item()
            renpy.restart_interaction()
            renpy.play("audio/sounds/coins.mp3")

screen store_screen(store_instance):

    style_prefix "store"
    $current_money = party_money.get_value() #Globale variable Partei_money(Rufen Sie den aktuellen Wert von einer entsprechend erstellten Instanz der Geldklasse ab)

    frame:
        background "gui/store/blank.png "
        style_group "mm"
        xalign 0
        yalign 0
    hbox:
        xalign 0.05 yalign 0.03
        add "images/icons/money.png "
        text str(current_money)

    null height (4 * gui.pref_spacing)
    hbox: #Seite an Seite Imagemap kaufen und Imagemap verkaufen
        xalign 0.05
        yalign 0.4
        imagemap:
            ground "gui/store/background.png "
            label _("Kauf")   
            viewport:
                #yinitial yinitial
                scrollbars "vertical"
                mousewheel True
                draggable True
                pagekeys True

                side_yfill True
                vbox:
                    for item in store_instance: #Zeigen Sie den Bestand des Werkzeugladens zusammen mit dem Betrag an
                        $item_name = item.get_name()
                        $item_price = item.get_price()
                        hbox:
                            if item_price > current_money: #Gegenstände höher als dein Geld
                                textbutton item_name sensitive False
                                add "images/icons/money.png " yalign 1.0
                                text str(item_price)
                            else: #Artikel, die Sie kaufen können
                                textbutton item_name action BuyItem(item)
                                add "images/icons/money.png " yalign 1.0
                                text str(item_price)

        null width (2 * gui.pref_spacing)
        imagemap:
            ground "gui/store/background.png "
            label _("Verkauf")
            viewport:
                #yinitial yinitial
                scrollbars "vertical"
                mousewheel True
                draggable True
                pagekeys True

                side_yfill True

                vbox:
                    for item, amount in inventory.items(): #Zeigen Sie Inventargegenstände zusammen mit Verkaufspreis und Menge an
                        if amount > 0:
                            $item_name = item.get_name()
                            $item_sell_price = item.get_sell_price()
                            $marketable_flag = item.get_marketable_flag()
                            hbox:
                                if marketable_flag: #Artikel, die verkaufen
                                    textbutton item_name action SellItem(item)
                                    add "images/icons/money.png " yalign 1.0
                                    text str(item_sell_price)
                                    text "×" + str(amount)
                                else: #Artikel, die nicht verkauft werden können
                                    textbutton item_name sensitive False

    button: #Zurück-Button
        xalign 0.9
        yalign 1.0
        xsize 145
        ysize 100
        text "Rückkehr" yalign 0.35
        background "gui/store/blank.png "
        
        action Return(True) #Kehren Sie zum Etikett des Anrufers zurück

###Stil weggelassen###

Ich bin sehr froh, mit so viel Code einen Werkzeugladen erstellen zu können!

Fazit und Zukunft

Dieses Mal haben wir den Artikel so implementiert, dass er über den Menübildschirm verwendet und im Werkzeugladen gekauft / verkauft werden kann. Es ist fast Zeit für eine Schlacht, also werde ich das nächste Mal ein Kampfsystem bauen.

Referenzierte Codes und Materialien (Titel weggelassen)

Code-Referenz & GUI ausleihen: Dragonaqua on Lemmasoft(https://lemmasoft.renai.us/forums/viewtopic.php?f=51&t=57105) Hintergrund: Nao Naruse Stehendes Bild: Wataokiba (https://wataokiba.net/) Symbol: Materialgeschäft Rosa (http://sozairosa.blog.fc2.com/)

Recommended Posts

Erstelle ein 2D-Rollenspiel mit Ren'Py (3) -Items and Tool Shop
(Memorandum) Erstellen Sie mit matplodlib ein 3D-Streudiagramm
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
Versuchen Sie, ein einfaches Spiel mit Python 3 und iPhone zu erstellen
Erstellen Sie mit Python Pandas Py Installer ein CSV-Formatierungswerkzeug
Lassen Sie uns eine Mac-App mit Tkinter und py2app erstellen
Erstellen Sie mit PyQt5 und PyQtGraph einen 3D-Modell-Viewer
Verknüpfen Sie Python Enum mit einer Funktion, um es aufrufbar zu machen
Machen Sie eine Lotterie mit Python
Machen Sie ein BLE-Thermometer und ermitteln Sie die Temperatur mit Pythonista3
Machen Sie ein Feuer mit kdeplot
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Erstellen Sie mit Python und OpenCV ein einfaches OMR (Mark Sheet Reader)
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Erstellen Sie einen Kanji-Kompass mit Raspberry Pi und Sense Hat
Generieren Sie mit GAN physisch stabile Formen und drucken Sie mit einem 3D-Drucker
Erstellen Sie mit Python + Django + AWS eine Scraping-App und wechseln Sie Jobs
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[1.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Lassen Sie uns eine GUI mit Python erstellen.
Löse ABC166 A ~ D mit Python
Erstellen Sie ein Empfehlungssystem mit Python
Machen Sie einen Filter mit einer Django-Vorlage
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Machen wir mit xCAT einen Spacon
Erstellen Sie mit PySide einen Modelliterator
Machen Sie eine schöne Grafik mit Plotly
2. Erstellen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (2. Grundlagen des Python-Programms)
Ich habe mir eine Möglichkeit ausgedacht, aus einem Foto ein 3D-Modell zu erstellen.
Erstellen Sie mit Raspberry Pi einen WLAN-Ethernet-Konverter und einen einfachen Router
Erstellen Sie DNN-CRF mit Chainer und erkennen Sie den Akkordfortschritt der Musik
Machen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (4. Datenstruktur)
Lassen Sie uns mit Python ein Shiritori-Spiel machen
Erstellen Sie einen Videoplayer mit PySimpleGUI + OpenCV
Machen Sie einen seltenen Gacha-Simulator mit Flask
Erstellen Sie eine Notebook-Pipeline mit Kedro + Papermill
Fraktal zum Erstellen und Spielen mit Python
Machen Sie mit matplotlib eine teilweise gezoomte Figur
Erstellen Sie einen Kaskadenklassifizierer mit Google Colaboratory
Lassen Sie uns mit PLY 1 eine einfache Sprache erstellen
Machen Sie eine Logikschaltung mit Perceptron (Multilayer Perceptron)
Löse AtCoder ABC168 mit Python (A ~ D)
Machen Sie Ja Nein Popup mit Kivy
Machen Sie einen Waschtrocknungs-Timer mit Raspberry Pi
Erstellen Sie eine GIF-Animation mit Ordnerüberwachung
Erstellen Sie ein Webframework mit Python! (1)
Machen wir mit Pylearn 2 eine dreiäugige KI
Erstellen Sie eine Desktop-App mit Python mit Electron
Machen wir einen Twitter-Bot mit Python!
Implementieren Sie ein Modell mit Status und Verhalten
Erstellen Sie ein Webframework mit Python! (2)
2D-Physiksimulation mit Box2d und wxPython
Ich habe versucht, einen periodischen Prozess mit CentOS7, Selenium, Python und Chrome durchzuführen
Machen Sie ein Thermometer mit Raspberry Pi und machen Sie es im Browser Teil 3 sichtbar
Machen wir eine nervenschwächende App mit Vue.js und Django-Rest-Framework [Teil 3] ~ Implementierung von Nervenschwäche ~
Lassen Sie uns mit Vue.js und Django-Rest-Framework [Teil 2] ~ Vue setup ~ eine nervenschwächende App erstellen
Lassen Sie uns mit Vue.js und Django-Rest-Framework [Teil 1] ~ Django-Setup ~ eine nervenschwächende App erstellen
Machen wir eine nervenschwächende Anwendung mit Vue.js und Django-Rest-Framework [Teil 6] ~ Benutzerauthentifizierung 2 ~
WEB Scraping mit Python und versuchen, aus Bewertungen eine Wortwolke zu machen