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
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.
Erstellen Sie zunächst ein Element. Ich implementiere das zu verwendende Teil über den Menübildschirm.
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.
Dies ist Ren'Pys Original. Das Ergebnis dieser Implementierung ist zuerst in der Abbildung dargestellt. Die wichtigsten verwendeten Funktionen und Variablen sind wie folgt.
usable_flag
)use_item ()
)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.
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.
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]
Das Ergebnis der Implementierung wird ebenfalls hier veröffentlicht. 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!
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.
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/)