続:pyxelでRPG風のものを作る(2)
前回作ったお店に商品を追加し、さらにアイテムに使い道を持たせます。さらにステータスウィンドウに現在所持しているアイテムを表示させます。さらにさらにアイテムの詳細ウィンドウ(インベントリっていうんですかね?)を作成します。また、モジュール化を進めて各種テキストを外部ファイルに記述するようにします。前回までの進行具合は以下のリンクから見てみてください。
まずはテキストのモジュール化です。以下のようなモジュールファイル「Text_list.py」を作成しました。
# -*- coding: utf-8 -*-
def text_get():
txt = {
"0":["HA","JI","ME","RU"],
"1":["YA","ME","RU"],
"2":["A","NA","TA","HA","O","U","KO","KU","NO",
"KA","KI","yu","U","KI","SI"],
"3":["MI","YA","KO","NO","HA","ZU","RE","NI",
"SU","NN","DE","I","MA","SU"],
"4":["KO","NO","SE","KA","I","WO","KI","MA","MA",
"NI"],
"5":["BO","U","KE","NN","SI","TE","MI","MA","SI",
"yo","U"],
"100":["KA","GI","GA","A","I","TA",],
"101":["KA","GI","GA","KA","KA","tu","TE","I","RU"],
"102":["SI","KA","KE","GA","SA","DO","U","SI","TA"],
"200":["MI","YA","KO","NO","E","I","HE","I","DA"],
"201":["MI","YA","KO","NO","JI","yu","U","NI","NN","DA"],
}
return txt
def text_get_s():
txt = {
"51":["I","RA","tu", "SI", "ya", "I", "MA", "SE"],
"52":["SI","yo","U", "HI", "NN", "NO", "BA", "NN"],
"53":["GO","U","WO", "E", "RA", "NN", "DE", "KU"],
"54":["DA","SA","I"],
"55":["E","I","HE", "I", "NO", "ME", "MO", "GA"],
"56":["KI"],
"57":["KA","I","MA","SU","KA"],
"58":["O","U","KI", "yu", "U", "KA", "RA", "NO"],
"59":["TE","GA","MI",],
"60":["KA","I","MA","SU","KA"],
"61":["DA","I","SI", "yo", "KO", "NO", "KA", "GI"],
"62":["KA","I","MA","SU","KA"],
"63":["SA","BI","TA", "O", "O", "KI", "NA", "KA"],
"64":["GI"],
"65":["KA","I","MA","SU","KA"],
"66":["U","RI","KI", "RE", "DE", "SU",],
"67":["O","KA","NE", "GA", "TA", "RI", "MA", "SE"],
"68":["NN"],
"69":["MA","I","DO", "A", "RI",],
}
return txt
def item_get():
txt = {
"0":["U","RI","KI","RE"],
"1":["JI","yo","U","HO","U","I","TI"],
"2":["JI","yo","U","HO","U","NI"],
"3":["KA","GI","I","TI"],
"4":["KA","GI","NI"],
}
return txt
def item_get_t():
txt = {
"1":[["E","I","HE","I","NO","ME","MO","GA","KI"],
["O","U","KI","yu","U","NO","HI","JI","yo","U","TU"],
["U","RO","NO","TE","NN","KE","NN","GA","A","tu","TA"],
["DA","I","SI","yo","KO","NO","SO","U","TI","HA","SA"],
["I","TE","NN","KE","NN","GA","HI","TU","YO","U"],],
"2":[["O","U","KI","yu","U","KA","RA","NO","TE","GA","MI"],
["MI","NA","TO","HA","SI","BA","RA","KU","HE","I","SA"],
["SU","RU",],
["KI","NN","KI","yu","U","JI","NI","HA","KI","yu","U"],
["SI","GA","I","NO","DA","I","NI","TI","KU","WO","TU"],
["KA","U","KO","TO",]],
"3":[["DA","I","SI", "yo", "KO", "NO", "KA", "GI"],
["MI","YA","KO","NO","HA","ZU","RE","NI","A","RU","DA"],
["I","SI","yo","KO","NO","KA","GI",]],
"4":[["SA","BI","TA", "O", "O", "KI", "NA", "KA","GI"],
["TO","KU","SI","yu","NA","TU","KU","RI","NO","O","O"],
["KI","NA","KA","GI"]],
}
return txt
アイテムの説明やイベントに使うテキストなどを関数の戻り値として辞書型で持たせています。本体の方で各関数を呼び出すことでテキストを取得させます。
self.text_list_s = Text_list.text_get_s()
こんな感じで呼び出します。
次は本体ファイルの修正です。コードは以下のようになりました。
# -*- coding: utf-8 -*-
import pyxel
from random import randint
from module import Fontlist, Text_list, Npc_pos, Enemy_pos
class App:
def __init__(self):
#Font set
self.font_list = Fontlist.text_j()
#Text list set
self.text_list = Text_list.text_get()
#Player status
self.Player = Player(8, 56)
self.player_move = 0
self.atc_flug = False
self.atc_count = 0
self.p_atc_x = 0
self.p_atc_y = 0
#Map status
self.stage_flug = 1
self.map_count_x = 1
self.map_count_y = 1
self.map_x = 0
self.map_y = 0
self.map_move = 0
#NPC status
self.npcs = []
self.npc_move = 0
self.npc_pos_x = Npc_pos.npc_posx()
self.npc_pos_y = Npc_pos.npc_posy()
#Enemy status
self.enemys = []
self.enemy_pos_x = Enemy_pos.enemy_posx()
self.enemy_pos_y = Enemy_pos.enemy_posy()
#System status
self.game_start = False
self.game_over = False
self.movie_flug = False
self.movie_count = 0
self.music_flug = True
self.shop1 = Shop(1)
self.items = [0,0,0,0,]
self.items_t = Text_list.item_get_t()
pyxel.init(128,128, caption="pyxel_knights", scale=5)
#Image read
pyxel.load('assets/pknights.pyxres')
pyxel.run(self.update, self.draw)
def update(self):
if pyxel.btnp(pyxel.KEY_S) and self.game_start == False:
self.game_start = True
self.movie_flug = True
self.movie_count = 1
self.music_flug = False
if pyxel.btnp(pyxel.KEY_R) and self.game_over == True:
self.Retry()
if pyxel.btnp(pyxel.KEY_Q):
pyxel.quit()
if self.movie_flug == False:
#Player controll
self.Player_ctr()
#NPC controll
self.NPC_ctr()
#Enemy controll
self.Enemy_ctr()
#Enemy Hit-check
self.Hit_chk()
#Player Damage-check
self.Dmg_chk()
#Enemy & NPC creation
if self.map_move == 1:
self.npcs.clear()
self.enemys.clear()
tgt_map_x = int(self.map_x / 16)
tgt_map_y = int(self.map_y / 16)
xy_key = str(tgt_map_x) + "-" + str(tgt_map_y)
#Enemy creation
enemy_x_1 = self.enemy_pos_x[xy_key]
enemy_y_1 = self.enemy_pos_y[xy_key]
enemy_kazu = len(enemy_x_1)
for i in range(enemy_kazu):
if enemy_x_1[i] < 101:
new_enemy_v = 32
new_enemy_x = enemy_x_1[i]
elif enemy_x_1[i] < 201:
new_enemy_v = 48
new_enemy_x = enemy_x_1[i] - 100
else:
new_enemy_v = 64
new_enemy_x = enemy_x_1[i] - 200
new_enemy_v2 = randint(1,3)
new_enemy = Enemy1(new_enemy_x*8, enemy_y_1[i]*8,
new_enemy_v, new_enemy_v2)
self.enemys.append(new_enemy)
#NPC creation
npc_x_1 = self.npc_pos_x[xy_key]
npc_y_1 = self.npc_pos_y[xy_key]
npc_kazu = len(npc_x_1)
for i in range(npc_kazu):
if npc_x_1[i] < 101:
new_npc_b = 16
new_npc_x = npc_x_1[i]
elif npc_x_1[i] < 201:
new_npc_b = 8
new_npc_x = npc_x_1[i] - 100
elif npc_x_1[i] < 301:
new_npc_b = 8
new_npc_x = npc_x_1[i] - 200
else:
new_npc_b = 16
new_npc_x = npc_x_1[i] - 300
if npc_y_1[i] < 101:
new_npc_v = 0
new_npc_y = npc_y_1[i]
elif npc_y_1[i] < 201:
new_npc_v = 16
new_npc_y = npc_y_1[i] - 100
elif npc_y_1[i] < 301:
new_npc_v = 32
new_npc_y = npc_y_1[i] - 200
else:
new_npc_v = 48
new_npc_y = npc_y_1[i] - 300
new_npc = NPC(new_npc_x*8, new_npc_y*8, new_npc_b, new_npc_v)
self.npcs.append(new_npc)
self.map_move = 0
def draw(self):
pyxel.cls(0)
#Debug
#print(self.map_x)
#print(self.map_y)
#Draw tilemap
pyxel.bltm(0,0,0,0 + self.map_x,0 + self.map_y,16,16)
#Draw player
if self.atc_flug == True:
if self.Player.player_m == 0:
pyxel.blt(self.Player.player_x,self.Player.player_y,
0,0,16,8,8,14)
pyxel.blt(self.Player.player_x+8,self.Player.player_y,
0,0,24,8,8,14)
elif self.Player.player_m == 1:
pyxel.blt(self.Player.player_x,self.Player.player_y,
0,8,16,8,8,14)
pyxel.blt(self.Player.player_x-8,self.Player.player_y,
0,8,24,8,8,14)
elif self.Player.player_m == 2:
pyxel.blt(self.Player.player_x,self.Player.player_y,
0,16,16,8,8,14)
pyxel.blt(self.Player.player_x,self.Player.player_y-8,
0,16,24,8,8,14)
elif self.Player.player_m == 3:
pyxel.blt(self.Player.player_x,self.Player.player_y,
0,24,16,8,8,14)
pyxel.blt(self.Player.player_x,self.Player.player_y+8,
0,24,24,8,8,14)
else:
if self.Player.player_m == 0:
pyxel.blt(self.Player.player_x,self.Player.player_y,
0,0,0+self.Player.player_m2*8,8,8,14)
elif self.Player.player_m == 1:
pyxel.blt(self.Player.player_x,self.Player.player_y,
0,8,0+self.Player.player_m2*8,8,8,14)
elif self.Player.player_m == 2:
pyxel.blt(self.Player.player_x,self.Player.player_y,
0,16,0+self.Player.player_m2*8,8,8,14)
elif self.Player.player_m == 3:
pyxel.blt(self.Player.player_x,self.Player.player_y,
0,24,0+self.Player.player_m2*8,8,8,14)
#Draw NPCs
npc_count = len(self.npcs)
for e in range(npc_count):
if self.npc_move < 50:
pyxel.blt(self.npcs[e].npc_x,self.npcs[e].npc_y,
0,
0 + self.npcs[e].npc_v, 224,
self.npcs[e].npc_b,self.npcs[e].npc_b,14)
else:
pyxel.blt(self.npcs[e].npc_x,self.npcs[e].npc_y,
0,
0 + self.npcs[e].npc_v,240,
self.npcs[e].npc_b,self.npcs[e].npc_b,14)
#Draw Enemys
enemy_count = len(self.enemys)
for e in range(enemy_count):
if self.enemys[e].enemy_m == 0:
pyxel.blt(self.enemys[e].enemy_x,self.enemys[e].enemy_y,
1,
8*self.enemys[e].enemy_v2,self.enemys[e].enemy_v,
8,8,14)
else:
pyxel.blt(self.enemys[e].enemy_x,self.enemys[e].enemy_y,
1,
8*self.enemys[e].enemy_v2,self.enemys[e].enemy_v+8,
8,8,14)
if self.enemys[e].enemy_d == 1:
pyxel.blt(self.enemys[e].enemy_x,self.enemys[e].enemy_y,
0,40,16,8,8,14)
#Draw damage
if self.Player.player_d == 1:
pyxel.blt(self.Player.player_x,self.Player.player_y,0,32,16,8,8,14)
#Draw title text
if self.game_start == False:
pyxel.cls(0)
pyxel.text(35, 40, "PYXEL KNIGHTS", 7)
pyxel.text(45, 70, "S = ", 7)
self.Draw_fonts(self.text_list["0"], 60, 70)
pyxel.text(45, 85, "Q = ", 7)
self.Draw_fonts(self.text_list["1"], 60, 85)
else: #Draw player hp
pyxel.rect(0, 120, 32, 18, 0)
pyxel.text(2, 122, "HP="+ str(self.Player.player_h),7)
#Draw movie
if self.movie_flug == True:
self.Movie_ctr(self.movie_count)
#Draw gameover text
if self.game_over == True:
pyxel.cls(0)
pyxel.text(20, 30, "GAME OVER!", 7)
pyxel.text(80, 70, "R = RETRY ", 7)
pyxel.text(80, 80, "Q = QUIT ", 7)
def Player_ctr(self):
#Get map coordinate
x = 16*(self.map_count_x-1)
y = 16*(self.map_count_y-1)
#Get player coordinate
move_map_x = int(self.Player.player_x / 8 + x)
move_map_y = int(self.Player.player_y / 8 + y)
#Tilemap action
#HP recovery
if pyxel.tilemap(0).get(move_map_x, move_map_y) == 31:
self.Player.player_h = 100
#Status view and pause
if pyxel.btnp(pyxel.KEY_I):
self.movie_flug = True
self.movie_count = 2
#Debug shop window
if pyxel.btnp(pyxel.KEY_A):
self.movie_flug = True
self.movie_count = 226
#Plyer move
self.player_move = self.player_move + 1
if (self.player_move > 6) and (self.atc_flug == False):
if pyxel.tilemap(0).get(move_map_x, move_map_y-1) < 32:
#Up
if pyxel.btnp(pyxel.KEY_UP):
self.Player.player_y = self.Player.player_y - 8
self.player_move = 0
self.Player.player_m = 2
if self.Player.player_m2 == 0: #Move animation
self.Player.player_m2 = 1
else:
self.Player.player_m2 = 0
if (self.Player.player_y - 8) < -8: #When map change
self.map_y = self.map_y - 16
self.Player.update(56, 120)
self.map_count_y = self.map_count_y - 1
self.map_move = 1
elif pyxel.tilemap(0).get(move_map_x, move_map_y-1) >= 224:
if pyxel.btnp(pyxel.KEY_UP):
self.movie_flug = True
self.movie_count = pyxel.tilemap(0).get(move_map_x,
move_map_y-1)
if pyxel.tilemap(0).get(move_map_x, move_map_y+1) < 32:
#Down
if pyxel.btnp(pyxel.KEY_DOWN):
self.Player.player_y = self.Player.player_y + 8
self.player_move = 0
self.Player.player_m = 3
if self.Player.player_m2 == 0: #Move animation
self.Player.player_m2 = 1
else:
self.Player.player_m2 = 0
if (self.Player.player_y + 8) > 128: #When map change
self.map_y = self.map_y + 16
self.Player.update(56, 0)
self.map_count_y = self.map_count_y + 1
self.map_move = 1
elif pyxel.tilemap(0).get(move_map_x, move_map_y+1) >= 224:
if pyxel.btnp(pyxel.KEY_DOWN):
self.movie_flug = True
self.movie_count = pyxel.tilemap(0).get(move_map_x,
move_map_y+1)
if pyxel.tilemap(0).get(move_map_x+1, move_map_y) < 32:
#Right
if pyxel.btnp(pyxel.KEY_RIGHT):
self.Player.player_x = self.Player.player_x + 8
self.player_move = 0
self.Player.player_m = 0
if self.Player.player_m2 == 0: #Move animation
self.Player.player_m2 = 1
else:
self.Player.player_m2 = 0
if (self.Player.player_x + 8) > 128: #When map change
self.map_x = self.map_x + 16
self.Player.update(0, 56)
self.map_count_x = self.map_count_x + 1
self.map_move = 1
elif pyxel.tilemap(0).get(move_map_x+1, move_map_y) >= 224:
if pyxel.btnp(pyxel.KEY_RIGHT):
self.movie_flug = True
self.movie_count = pyxel.tilemap(0).get(move_map_x+1,
move_map_y)
if pyxel.tilemap(0).get(move_map_x-1, move_map_y) < 32:
#Left
if pyxel.btnp(pyxel.KEY_LEFT):
self.Player.player_x = self.Player.player_x - 8
self.player_move = 0
if self.Player.player_m2 == 0: #Move animation
self.Player.player_m2 = 1
else:
self.Player.player_m2 = 0
self.Player.player_m = 1
if (self.Player.player_x - 8) < -8: #When map change
self.map_x = self.map_x - 16
self.Player.update(120, 56)
self.map_count_x = self.map_count_x - 1
self.map_move = 1
elif pyxel.tilemap(0).get(move_map_x-1, move_map_y) >= 224:
if pyxel.btnp(pyxel.KEY_LEFT):
self.movie_flug = True
self.movie_count = pyxel.tilemap(0).get(move_map_x-1,
move_map_y)
#Attack action
if pyxel.btnp(pyxel.KEY_SPACE):
self.atc_flug = True
pyxel.play(0,3,loop=False)
if self.atc_flug == True:
self.atc_count = self.atc_count + 1
if self.atc_count > 8:
self.atc_count = 0
self.p_atc_x = 0
self.p_atc_y = 0
self.atc_flug = False
else:
if self.Player.player_m == 0:
self.p_atc_x = self.Player.player_x + 8
self.p_atc_y = self.Player.player_y
elif self.Player.player_m == 1:
self.p_atc_x = self.Player.player_x - 8
self.p_atc_y = self.Player.player_y
elif self.Player.player_m == 2:
self.p_atc_x = self.Player.player_x
self.p_atc_y = self.Player.player_y - 8
elif self.Player.player_m == 3:
self.p_atc_x = self.Player.player_x
self.p_atc_y = self.Player.player_y + 8
def Retry(self):
#Player status
self.Player = Player(8, 56)
self.player_move = 0
self.atc_flug = False
self.atc_count = 0
self.p_atc_x = 0
self.p_atc_y = 0
#Map status
self.stage_flug = 1
self.map_count_x = 1
self.map_count_y = 1
self.map_x = 0
self.map_y = 0
self.map_move = 0
#Enemy status
self.enemys = []
#System status
self.game_start = False
self.game_over = False
self.movie_flug = False
def Hit_chk(self):
enemy_count = len(self.enemys)
for e in range(enemy_count):
self.enemys[e].enemy_d = 0
enemy_pos_x = self.enemys[e].enemy_x
enemy_pos_y = self.enemys[e].enemy_y
if ((enemy_pos_x <= self.p_atc_x < enemy_pos_x + 8) and
(enemy_pos_y <= self.p_atc_y < enemy_pos_y + 8)):
self.enemys[e].enemy_d = 1
#Music_ctr
pyxel.play(1,0,loop=False)
self.enemys[e].enemy_h = self.enemys[e].enemy_h -1
#Enemy delete
if self.enemys[e].enemy_h < 0:
self.Player.money += 10 * self.enemys[e].enemy_v2
del self.enemys[e]
#Music_ctr
pyxel.play(2,2,loop=False)
if len(self.enemys) == 0:
x = int(self.map_x / 16)
y = int(self.map_y / 16)
self.MapEvents_ctr(x, y)
break
def Dmg_chk(self):
self.Player.player_d = 0
enemy_count = len(self.enemys)
player_pos_x = self.Player.player_x
player_pos_y = self.Player.player_y
for e in range(enemy_count):
enemy_pos_x = self.enemys[e].enemy_x
enemy_pos_y = self.enemys[e].enemy_y
if ((enemy_pos_x <= player_pos_x < enemy_pos_x + 8) and
(enemy_pos_y <= player_pos_y < enemy_pos_y + 8)):
#Music_ctr
pyxel.play(3,1,loop=False)
self.Player.player_h = self.Player.player_h - 1
self.Player.player_d = 1
if self.Player.player_h <= 0:
self.game_over = True
def Enemy_ctr(self):
enemy_count = len(self.enemys)
for e in range(enemy_count):
self.enemys[e].enemy_m2 = self.enemys[e].enemy_m2 + 1
if self.enemys[e].enemy_m2 > 47 - self.enemys[e].enemy_v2 * 7:
self.enemys[e].enemy_m2 = 0
enemy_pos_x = int(self.enemys[e].enemy_x / 8 + self.map_x)
enemy_pos_y = int(self.enemys[e].enemy_y / 8 + self.map_y)
enemy_pos_x2 = self.Player.player_x - self.enemys[e].enemy_x
enemy_pos_y2 = self.Player.player_y - self.enemys[e].enemy_y
#Check tilemap
if (abs(enemy_pos_x2) < 35 and abs(enemy_pos_y2) < 35):
if abs(enemy_pos_x2) > abs(enemy_pos_y2):
#Move right
if enemy_pos_x2 > 0:
if (40> (pyxel.tilemap(0).get(enemy_pos_x+1,
enemy_pos_y)) < 32):
self.enemys[e].enemy_x=self.enemys[e].enemy_x+8
self.enemys[e].enemy_m = 1
#Move left
else:
if (40> (pyxel.tilemap(0).get(enemy_pos_x-1,
enemy_pos_y)) < 32):
self.enemys[e].enemy_x=self.enemys[e].enemy_x-8
self.enemys[e].enemy_m = 0
else:
#Move down
if enemy_pos_y2 > 0:
if (40> (pyxel.tilemap(0).get(enemy_pos_x,
enemy_pos_y+1)) < 32):
self.enemys[e].enemy_y=self.enemys[e].enemy_y+8
#Move up
else:
if (40> (pyxel.tilemap(0).get(enemy_pos_x,
enemy_pos_y-1)) < 32):
self.enemys[e].enemy_y=self.enemys[e].enemy_y-8
def NPC_ctr(self):
self.npc_move = self.npc_move + 1
if self.npc_move > 100:
self.npc_move = 0
def MapEvents_ctr(self,x,y):
xy_key = str(x) + "-" + str(y)
if xy_key == "1-2":
pyxel.tilemap(0).set(7+self.map_x, 10+self.map_y, ["006006"])
elif xy_key == "0-1":
pyxel.tilemap(0).set(7+self.map_x, 12+self.map_y, ["006006"])
elif xy_key == "2-2":
pyxel.tilemap(0).set(1+self.map_x, 7+self.map_y, ["006"])
pyxel.tilemap(0).set(1+self.map_x, 8+self.map_y, ["006"])
elif xy_key == "6-2":
pyxel.tilemap(0).set(3+self.map_x, 7+self.map_y, ["011"])
pyxel.tilemap(0).set(3+self.map_x, 8+self.map_y, ["011"])
elif xy_key == "10-0":
pyxel.tilemap(0).set(13+160, 12, ["005005"])
pyxel.tilemap(0).set(13+160, 11, ["005005"])
pyxel.tilemap(0).set(13+160, 10, ["005005"])
pyxel.tilemap(0).set(5+self.map_x, 11+self.map_y, ["0ED"])
def Movie_ctr(self,n):
#Game start information//////////////////////////////////////////////////
if n == 1:
pyxel.rect(0, 65, 128, 63, 0)
self.Draw_fonts(self.text_list["2"], 5, 70)
self.Draw_fonts(self.text_list["3"], 5, 80)
self.Draw_fonts(self.text_list["4"], 5, 95)
self.Draw_fonts(self.text_list["5"], 5, 105)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
#////////////////////////////////////////////////////////////////////////
#Status view/////////////////////////////////////////////////////////////
elif n == 2:
pyxel.rect(0, 0, 128, 128, 0)
pyxel.rectb(0, 0, 128, 128, 7)
pyxel.text(5, 5, "Status", 7)
pyxel.text(5, 15, "Items", 7)
pyxel.text(5, 110, "Money="+ str(self.Player.money)+" G", 7)
item_name = self.shop1.item_list
l = len(item_name)
for i in range(l):
if i == 0:
pass
else:
if self.items[i-1] == 1:
key = str(i)
pyxel.text(3, 15+(10*i), key+".", 7)
self.Draw_fonts(item_name[key], 10, 15+(10*i))
if pyxel.btn(pyxel.KEY_1):
key1 = 1
key2 = str(key1)
if self.items[0] == 1:
pyxel.rect(0, 0, 120, 100, 0)
pyxel.rectb(0, 0, 120, 100, 7)
l2 = len(self.items_t[key2])
for i2 in range(l2):
self.Draw_fonts(self.items_t[key2][i2], 10, 15+(10*i2))
pyxel.blt(100 ,47 ,0 ,48 ,16*key1 ,16 ,16 ,15)
elif pyxel.btn(pyxel.KEY_2):
if self.items[1] == 1:
key1 = 2
key2 = str(key1)
pyxel.rect(0, 0, 120, 100, 0)
pyxel.rectb(0, 0, 120, 100, 7)
l2 = len(self.items_t[key2])
for i2 in range(l2):
self.Draw_fonts(self.items_t[key2][i2], 10, 15+(10*i2))
pyxel.blt(100 ,47 ,0 ,48 ,16*key1 ,16 ,16 ,15)
elif pyxel.btn(pyxel.KEY_3):
if self.items[2] == 1:
key1 = 3
key2 = str(key1)
pyxel.rect(0, 0, 120, 100, 0)
pyxel.rectb(0, 0, 120, 100, 7)
l2 = len(self.items_t[key2])
for i2 in range(l2):
self.Draw_fonts(self.items_t[key2][i2], 10, 15+(10*i2))
pyxel.blt(100 ,47 ,0 ,48 ,16*key1 ,16 ,16 ,15)
elif pyxel.btn(pyxel.KEY_4):
if self.items[3] == 1:
key1 = 4
key2 = str(key1)
pyxel.rect(0, 0, 120, 100, 0)
pyxel.rectb(0, 0, 120, 100, 7)
l2 = len(self.items_t[key2])
for i2 in range(l2):
self.Draw_fonts(self.items_t[key2][i2], 10, 15+(10*i2))
pyxel.blt(100 ,47 ,0 ,48 ,16*key1 ,16 ,16 ,15)
pyxel.text(5, 120, "Press SPACE-KEY to return",
pyxel.frame_count % 16)
#/////////////////////////////////////////////////////////////////////////
#Shop/////////////////////////////////////////////////////////////////////
elif n == 226 or n == 227:
pyxel.bltm(0,0,0,240,0,16,16)
pyxel.blt(100 ,15 ,0 ,48 ,0 ,16 ,16 ,2)
#Shop select
s = self.shop1
if pyxel.btnp(pyxel.KEY_1):
if s.urikire[0] == 1:
s.text_n = 98
else:
s.text_n = 1
elif pyxel.btnp(pyxel.KEY_2):
if s.urikire[1] == 1:
s.text_n = 98
else:
s.text_n = 2
elif pyxel.btnp(pyxel.KEY_3):
if s.urikire[2] == 1:
s.text_n = 98
else:
s.text_n = 3
elif pyxel.btnp(pyxel.KEY_4):
if s.urikire[3] == 1:
s.text_n = 98
else:
s.text_n = 4
for i in range(4):
item_name = []
if s.urikire[i] == 1:
item_name = s.item[4]
else:
item_name = s.item[i]
pyxel.text(10, 73 + (i * 10), str(i+1) + ".", 7)
self.Draw_fonts(item_name, 20, 73 + (i * 10))
pyxel.text(85, 73 + (i * 10), str(s.price[i])+" G", 7)
shop_text = s.Show_text()
text_len = len(shop_text)
if s.text_n > 0 and s.text_n < 90:
pyxel.text(12, 55, "( Y = Yes, N = No )", 7)
if pyxel.btnp(pyxel.KEY_Y):
p = s.text_n - 1
if self.Player.money - s.price[p] >= 0:
#Buy item
self.Player.money = self.Player.money - s.price[p]
s.urikire[p] = 1
s.text_n = 100
self.items[p] = 1
pyxel.blt(100 ,30 ,0 ,48 ,80 ,16 ,16 ,2)
else:
s.text_n = 99
pyxel.blt(100 ,30 ,0 ,80 ,16 ,16 ,16 ,2)
elif pyxel.btnp(pyxel.KEY_N):
s.text_n = 0
#Item Window
if s.text_n > 5 or s.text_n == 0:
pyxel.blt(100 ,45 ,0 ,48 ,80 ,16 ,16 ,15)
else:
pyxel.blt(100 ,45 ,0 ,48 ,16*s.text_n ,16 ,16 ,15)
for t in range(text_len):
self.Draw_fonts(shop_text[t],15, 15 + (t * 10))
pyxel.text(10, 113, "SPACE-KEY=Exit" + " Money=" +
str(self.Player.money) + " G", 7)
#////////////////////////////////////////////////////////////////////////
#Map event///////////////////////////////////////////////////////////////
elif n == 228 or n == 229:
pyxel.rect(0, 100, 128, 63, 0)
if self.items[2] == 1:
self.Draw_fonts(self.text_list["100"],5, 105)
self.MapEvents_ctr(6, 2)
else:
self.Draw_fonts(self.text_list["101"], 5, 105)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 232 or n == 233 or n == 234 or n == 235:
pyxel.rect(0, 100, 128, 63, 0)
if self.items[3] == 1:
self.Draw_fonts(self.text_list["100"],5, 105)
x = int(self.map_x / 16)
y = int(self.map_y / 16)
self.MapEvents_ctr(x, y)
else:
self.Draw_fonts(self.text_list["101"], 5, 105)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 236:
pyxel.rect(0, 100, 128, 63, 0)
self.Draw_fonts(self.text_list["102"],5, 105)
self.MapEvents_ctr(10, 0)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
#////////////////////////////////////////////////////////////////////////
#NPC text////////////////////////////////////////////////////////////////
elif n == 224:
pyxel.rect(0, 100, 128, 63, 0)
self.Draw_fonts(self.text_list["200"],5, 105)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 225:
pyxel.rect(0, 100, 128, 63, 0)
self.Draw_fonts(self.text_list["201"],5, 105)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
#////////////////////////////////////////////////////////////////////////
#Other///////////////////////////////////////////////////////////////////
else:
self.movie_flug = False
#////////////////////////////////////////////////////////////0////////////
#Return game
if pyxel.btnp(pyxel.KEY_SPACE):
self.movie_flug = False
#Shop text reset.
if n == 226 or n == 227:
s.text_n = 0
def Draw_fonts(self,txt,x,y):
txt_count = len(txt)
for i in range(txt_count):
#Key check
font_xy = self.font_list[txt[i]]
fontx = font_xy[0]
fonty = font_xy[1]
pyxel.blt(x + 8 * i,y,1,fontx,fonty,8,8,14)
class Player:
def __init__(self, x, y):
self.player_x = x
self.player_y = y
self.player_h = 100
self.player_d = 0
self.player_m = 0
self.player_m2 = 0
self.money = 1000
def update(self, x, y):
self.player_x = x
self.player_y = y
class NPC:
def __init__(self, x, y, b, v):
self.npc_x = x
self.npc_y = y
self.npc_b = b
self.npc_v = v
self.npc_m = 0
def update(self, x, y):
self.npc_x = x
self.npc_y = y
class Enemy1:
def __init__(self, x, y, v, v2):
self.enemy_x = x
self.enemy_y = y
self.enemy_h = 10 + v2*5
self.enemy_d = 0
self.enemy_m = 0
self.enemy_m2 = 0
self.enemy_v = v
self.enemy_v2 = v2
def update(self, x, y):
self.enemy_x = x
self.enemy_y = y
class Shop:
def __init__(self, n):
#Text list set
self.text_list_s = Text_list.text_get_s()
self.item_list = Text_list.item_get()
self.shop_v = n
self.item = [self.item_list["1"],
self.item_list["2"],
self.item_list["3"],
self.item_list["4"],
self.item_list["0"]]
self.price = [100,200,300,400]
self.text_n = 0
self.urikire = [0, 0, 0, 0]
def Show_text(self):
t = self.text_n
if t == 0:
return [self.text_list_s["51"],
self.text_list_s["52"],
self.text_list_s["53"],
self.text_list_s["54"],]
elif t == 1:
return [self.text_list_s["55"],
self.text_list_s["56"],
self.text_list_s["57"]]
elif t == 2:
return [self.text_list_s["58"],
self.text_list_s["59"],
self.text_list_s["60"]]
elif t == 3:
return [self.text_list_s["61"],
self.text_list_s["62"]]
elif t == 4:
return [self.text_list_s["63"],
self.text_list_s["64"],
self.text_list_s["65"]]
elif t == 98:
return [self.text_list_s["66"]]
elif t == 99:
return [self.text_list_s["67"],self.text_list_s["68"]]
elif t == 100:
return [self.text_list_s["69"]]
App()
いろいろと細かな修正もしていますが、大まかな要素に分けて書いていきます。
まず、お店についてですがアイテムのプレビューウィンドウを追加しました。
こんな感じで店の親父の下にアイテムのアイコンを表示させました。なんかそれっぽくなってきた気がします。また、文字配置も少しいじってみました。
ステータスウィンドウには所持アイテムの表示と、インベントリウィンドウを追加しました。
項番は固定ですが購入したアイテムが分かります。「じょうほういち」はどう頑張っても1番にしか入りません。さらに、購入済みアイテムの項番に対応した数字キーを押すことでインベントリウィンドウが開きます。上記画像で「かぎいち」の詳細が見たい場合はキーボードの「3」を押します。
フレーバーテキストのセンスは置いといて、中々いいんじゃないでしょうか。RPGらしくなってきたと思います。
実際に購入したアイテムを使う場面も作りました。
特定の場面では、アイテムの有無をフラグとしてイベントを発生させます。上の画像は「かぎいち」を使った場面です。
コードはGitHubにも載せていますが、ちょくちょく手を入れているので内容がnoteと異なっているかもしれません。その時はごめんなさい。
また、タイルマップ等が入っているpyxresファイルやモジュールファイルもGitHubに置いてあります。
ここまで読んでいただきありがとうございました。
ここまで読んでいただきありがとうございます!