続:pyxelでRPG風のものを作る(4)
前回のnoteには「連続性のあるイベントを作る」とか書いてあったんですが、ちょっとそれはいったん置いておきます(今度作ります)。
別のゲームを作って遊んでいるときにセーブ・ロード機能を作ったので、今回はこのRPGもどきにもセーブとロードの機能を追加して、開始メニューに「つづきから」を追加したいと思います。内容は以下のnoteで作ったものを参考にしながら実装していきます。
前回までの進行具合は以下のnoteをご参照ください。
まずはセーブ機能から作っていきます。
def Save_data(self):
#Save data
try:
with open('DATA/data.csv', 'w', newline="") as f:
writer = csv.writer(f)
data = []
data2 = []
data3 = []
for i in self.items:
data.append(i)
data.append(self.gate_flug_1)
data.append(self.map_count_x)
data.append(self.map_count_y)
data.append(self.map_x)
data.append(self.map_y)
data.append(self.Player.money)
data.append(self.Player.player_x)
data.append(self.Player.player_y)
writer.writerow(data)
for i2 in self.End_event_x:
data2.append(i2)
writer.writerow(data2)
for i3 in self.End_event_y:
data3.append(i3)
writer.writerow(data3)
self.save_st = 1
except:
self.save_st = 2
本体の.pyファイルと同じ階層にDATAディレクトリを作成し、その中のdata.csvをセーブデータとします。with openで開いた後に、所持アイテムや、現在位置などを書き込んでいきます。最終的にはsave_stという変数に値を書き込み、セーブの成否が分かるようにしています。
▲黄色いキラキラに触れるとセーブします。
次にロードです。
def Load_data(self):
data = []
try:
with open('DATA/data.csv') as f:
reader = csv.reader(f)
for row in reader:
data.append(row)
i = len(self.items)
for i2 in range(i):
self.items[i2] = int(data[0][i2])
self.gate_flug1 = int(data[0][i])
self.map_count_x = int(data[0][i+1])
self.map_count_y = int(data[0][i+2])
self.map_x = int(data[0][i+3])
self.map_y = int(data[0][i+4])
self.Player.money = int(data[0][i+5])
self.Player.player_x = int(data[0][i+6])
self.Player.player_y = int(data[0][i+7])
for i4 in data[1]:
self.End_event_x.append(int(i4))
for i5 in data[2]:
self.End_event_y.append(int(i5))
self.load_st = 1
for i3 in range(4):
self.shop1.urikire[i3] = self.items[i3]
except:
self.load_st = 2
セーブ時に作成したcsvファイルを読み込んで、各種変数に当て込んでいきます。csvから読み込んだ際には文字として認識されているので、後々数値として使いたいものはint()でくくってやらないといけません。
この部分で少し詰まり、イベントの識別記号を変更しました。以前は同じミニマップに複数のイベントがある場合は1-2.3みたいな感じでミニマップx座標-ミニマップy座標.イベント番号という形でイベントを区別していました。ただ、今回csvにデータを吐き出す際に小数点があるとなんか面倒くさいことになりそう(というかなった)ので、小数点を消してしまいました。さっきの例で言うと1-2.3が1-23になった感じです。
その時々で思いついた機能を作っているので後から見ると「何でこうなってんの?」とか「そりゃ無理矢理だろ」ってのがいろいろとありますね...。
今回のメインはセーブ・ロード機能ですが、その他にNPC関連のビジュアルを少し変更しました。
▲NPCのセリフにバリエーションを持たせて、小窓に顔を表示させます。
▲数種類のセリフをランダムでしゃべります。
また、タイトル画面がいつまでたっても進化していなかったので、こちらも少し変更を加えています。
▲「はじめから」、「つづきから」が追加されてにぎやかになりました。
今回はここまでとなります。すべてつなげたメインのソースは以下のようになりました。
# -*- coding: utf-8 -*-
import pyxel
from random import randint
import csv
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,0,0,0,0,]
self.items_t = Text_list.item_get_t()
self.gate_flug_1 = 0
self.save_st = 0
self.load_st = 0
self.Event_save = False
self.End_event_x = []
self.End_event_y = []
self.txt_key = 0
self.text_key_flug = False
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_L) and self.game_start == False:
self.game_start = True
self.movie_flug = True
self.movie_count = 253
self.music_flug = False
self.Load_data()
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
if self.game_start == True:
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 = Enemy(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.rect(25, 30, 77, 17, 0)
pyxel.rectb(25, 30, 77, 17, 7)
pyxel.text(35, 35, "PYXEL KNIGHTS", 7)
pyxel.rect(25, 57, 90, 52, 0)
pyxel.rectb(25, 57, 90, 52, 7)
pyxel.text(45, 65, "S = ", 7)
self.Draw_fonts(self.text_list["0"], 60, 65)
pyxel.text(45, 80, "L = ", 7)
self.Draw_fonts(self.text_list["10"], 60, 80)
pyxel.text(45, 94, "Q = ", 7)
self.Draw_fonts(self.text_list["1"], 60, 95)
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)
if x == 1 and y == 2:
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)
#Event save
if self.Event_save == False and self.load_st == 0:
self.End_event_x.append(x)
self.End_event_y.append(y)
self.Event_save = True
if xy_key == "1-2":
pyxel.tilemap(0).set(7+16, 10+32, ["006006"])
elif xy_key == "0-1":
pyxel.tilemap(0).set(7+0, 12+16, ["006006"])
elif xy_key == "1-31":
pyxel.tilemap(0).set(12+16, 12+48, ["0F1"])
pyxel.tilemap(0).set(14+16, 7+48, ["006"])
pyxel.tilemap(0).set(14+16, 8+48, ["006"])
elif xy_key == "1-32":
pyxel.tilemap(0).set(3+16, 1+48, ["0F2"])
pyxel.tilemap(0).set(12+16, 7+48, ["006"])
pyxel.tilemap(0).set(12+16, 8+48, ["006"])
elif xy_key == "1-33":
pyxel.tilemap(0).set(13+16, 5+48, ["0F3"])
pyxel.tilemap(0).set(13+16, 7+48, ["006"])
pyxel.tilemap(0).set(13+16, 8+48, ["006"])
elif xy_key == "2-2":
pyxel.tilemap(0).set(2+32, 7+32, ["006"])
pyxel.tilemap(0).set(2+32, 8+32, ["006"])
elif xy_key == "2-22":
pyxel.tilemap(0).set(7+32, 14+32, ["00F00F"])
pyxel.tilemap(0).set(7+32, 15+32, ["00F00F"])
elif xy_key == "2-3":
pyxel.tilemap(0).set(14+32, 13+48, ["021"])
pyxel.tilemap(0).set(14+32, 12+48, ["021"])
pyxel.tilemap(0).set(8+32, 2+48, ["0F7"])
elif xy_key == "6-2":
pyxel.tilemap(0).set(3+96, 7+32, ["011"])
pyxel.tilemap(0).set(3+96, 8+32, ["011"])
elif xy_key == "8-11":
pyxel.tilemap(0).set(1+128, 0+0, ["022"])
elif xy_key == "8-12":
pyxel.tilemap(0).set(3+128, 3+0, ["063"])
elif xy_key == "9-11":
pyxel.tilemap(0).set(1+144, 14+0, ["044"])
elif xy_key == "9-12":
pyxel.tilemap(0).set(1+144, 0+0, ["022"])
elif xy_key == "9-13":
pyxel.tilemap(0).set(3+144, 3+0, ["063"])
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+96, 11+32, ["0ED"])
else:
pass
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)
elif pyxel.btn(pyxel.KEY_5):
if self.items[4] == 1:
key1 = 5
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_6):
if self.items[5] == 1:
key1 = 6
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_7):
if self.items[6] == 1:
key1 = 7
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_8):
if self.items[7] == 1:
key1 = 8
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
else:
s.text_n = 99
elif pyxel.btnp(pyxel.KEY_N):
s.text_n = 0
#Item Window
if s.text_n > 5 or s.text_n == 0:
pass
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)
#////////////////////////////////////////////////////////////////////////
#Save and Load///////////////////////////////////////////////////////////
elif n == 252:
pyxel.rect(0, 100, 128, 63, 0)
if self.save_st == 0:
self.Save_data()
if self.save_st == 1:
self.Draw_fonts(self.text_list["6"],5, 105)
else:
self.Draw_fonts(self.text_list["7"],5, 105)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 253:
pyxel.rect(0, 100, 128, 63, 0)
if self.load_st == 0:
self.Load_data()
if self.load_st == 1:
self.Draw_fonts(self.text_list["8"],5, 105)
e = len(self.End_event_x)
for e2 in range(e):
self.MapEvents_ctr(self.End_event_x[e2], self.End_event_y[e2])
else:
self.Draw_fonts(self.text_list["9"],5, 105)
self.map_move = 1
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
#/////////////////////////////////////////////////////////////////////////
#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)
elif n == 238:
pyxel.rect(0, 100, 128, 63, 0)
self.Draw_fonts(self.text_list["103"],5, 105)
self.MapEvents_ctr(1, 31)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 239:
pyxel.rect(0, 100, 128, 63, 0)
self.Draw_fonts(self.text_list["103"],5, 105)
self.MapEvents_ctr(1, 32)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 240:
pyxel.rect(0, 100, 128, 63, 0)
self.Draw_fonts(self.text_list["103"],5, 105)
self.MapEvents_ctr(1, 33)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 241:
pyxel.rect(0, 100, 128, 63, 0)
self.Draw_fonts(self.text_list["104"],5, 105)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 242:
pyxel.rect(0, 100, 128, 63, 0)
self.Draw_fonts(self.text_list["104"],5, 105)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 243:
pyxel.rect(0, 100, 128, 63, 0)
self.Draw_fonts(self.text_list["104"],5, 105)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 244:
pyxel.rect(0, 100, 128, 63, 0)
self.Draw_fonts(self.text_list["105"],5, 105)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 245:
pyxel.rect(0, 100, 128, 63, 0)
x = int(self.map_x / 16)
y = int(self.map_y / 16)
key = str(x) + "-" + str(y)
if key == "1-0":
self.Draw_fonts(self.text_list["106"],5, 105)
elif key == "4-0":
self.Draw_fonts(self.text_list["107"],5, 105)
elif key == "7-0":
self.Draw_fonts(self.text_list["108"],5, 105)
elif key == "0-1":
self.Draw_fonts(self.text_list["109"],5, 105)
elif key == "2-3":
self.Draw_fonts(self.text_list["110"],5, 105)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 246:
pyxel.rect(0, 100, 128, 63, 0)
self.Draw_fonts(self.text_list["102"],5, 105)
self.MapEvents_ctr(2, 3)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 248:
pyxel.rect(0, 100, 128, 63, 0)
if self.items[4] == 1:
self.Draw_fonts(self.text_list["112"],5, 105)
self.MapEvents_ctr(2, 22)
else:
self.Draw_fonts(self.text_list["111"],5, 105)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 249:
pyxel.rect(0, 100, 128, 63, 0)
if self.items[4] == 0:
self.Draw_fonts(self.text_list["113"],5, 105)
else:
self.Draw_fonts(self.text_list["114"],5, 105)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 250:
pyxel.rect(0, 100, 128, 63, 0)
if self.items[6] == 0:
self.Draw_fonts(self.text_list["115"],5, 105)
else:
self.Draw_fonts(self.text_list["114"],5, 105)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 251:
pyxel.rect(0, 100, 128, 63, 0)
if self.items[7] == 0:
self.Draw_fonts(self.text_list["116"],5, 105)
else:
self.Draw_fonts(self.text_list["114"],5, 105)
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)
pyxel.rect(0, 82, 18, 20, 0)
pyxel.rect(18, 90, 110, 10, 0)
self.Draw_fonts(self.text_list["200"],0, 105)
self.Draw_fonts(self.text_list["300"],20, 92)
pyxel.blt(2,84,0,0,208,16,16,14)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 256:
pyxel.rect(0, 100, 128, 63, 0)
pyxel.rect(0, 82, 18, 20, 0)
pyxel.rect(18, 90, 110, 10, 0)
if self.text_key_flug == False:
tn = randint(4, 6)
self.text_key = str(200 + tn)
self.text_key_flug = True
self.Draw_fonts(self.text_list[self.text_key],0, 105)
self.Draw_fonts(self.text_list["301"],20, 92)
pyxel.blt(2,84,0,16,208,16,16,14)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
elif n == 257:
pyxel.rect(0, 100, 128, 63, 0)
pyxel.rect(0, 82, 18, 20, 0)
pyxel.rect(18, 90, 110, 10, 0)
if self.text_key_flug == False:
tn = randint(1, 3)
self.text_key = str(200 + tn)
self.text_key_flug = True
self.Draw_fonts(self.text_list[self.text_key],0, 105)
self.Draw_fonts(self.text_list["301"],20, 92)
pyxel.blt(2,84,0,32,208,16,16,14)
pyxel.text(5, 120, "Press SPACE-KEY to continue...",
pyxel.frame_count % 16)
#////////////////////////////////////////////////////////////////////////
#Other///////////////////////////////////////////////////////////////////
else:
self.movie_flug = False
#////////////////////////////////////////////////////////////////////////
#Return game
if pyxel.btnp(pyxel.KEY_SPACE):
self.movie_flug = False
#Save Load status reset
self.save_st = 0
self.load_st = 0
#Shop text reset.
if n == 226 or n == 227:
s.text_n = 0
#Get item reset.
if n == 249:
if self.items[4] == 0:
self.items[4] = 1
self.MapEvents_ctr(9, 11)
elif n == 250:
if self.items[6] == 0:
self.items[6] = 1
self.MapEvents_ctr(9, 12)
elif n == 251:
if self.items[7] == 0:
self.items[7] = 1
self.MapEvents_ctr(9, 13)
#Event save reset.
if self.Event_save == True:
self.Event_save = False
#Text_key reset.
if self.text_key_flug == True:
self.text_key_flug = False
self.text_key = 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)
def Save_data(self):
#Save data
try:
with open('DATA/data.csv', 'w', newline="") as f:
writer = csv.writer(f)
data = []
data2 = []
data3 = []
for i in self.items:
data.append(i)
data.append(self.gate_flug_1)
data.append(self.map_count_x)
data.append(self.map_count_y)
data.append(self.map_x)
data.append(self.map_y)
data.append(self.Player.money)
data.append(self.Player.player_x)
data.append(self.Player.player_y)
writer.writerow(data)
for i2 in self.End_event_x:
data2.append(i2)
writer.writerow(data2)
for i3 in self.End_event_y:
data3.append(i3)
writer.writerow(data3)
self.save_st = 1
except:
self.save_st = 2
def Load_data(self):
data = []
try:
with open('DATA/data.csv') as f:
reader = csv.reader(f)
for row in reader:
data.append(row)
i = len(self.items)
for i2 in range(i):
self.items[i2] = int(data[0][i2])
self.gate_flug1 = int(data[0][i])
self.map_count_x = int(data[0][i+1])
self.map_count_y = int(data[0][i+2])
self.map_x = int(data[0][i+3])
self.map_y = int(data[0][i+4])
self.Player.money = int(data[0][i+5])
self.Player.player_x = int(data[0][i+6])
self.Player.player_y = int(data[0][i+7])
for i4 in data[1]:
self.End_event_x.append(int(i4))
for i5 in data[2]:
self.End_event_y.append(int(i5))
self.load_st = 1
for i3 in range(4):
self.shop1.urikire[i3] = self.items[i3]
except:
self.load_st = 2
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 Enemy:
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()
コードはGitHubにも載せていますが、ちょくちょく手を入れているので内容がnoteと異なっているかもしれません。その時はごめんなさい。
また、タイルマップ等が入っているpyxresファイルやモジュールファイルもGitHubに置いてあります。
ここまで読んでいただきありがとうございました。
ここまで読んでいただきありがとうございます!