
pyxelã²ãŒã å¶äœTIPS_RPGã®æé¢š
ã¯ããã«
ãã®noteã¯pythonã®ã¬ããã²ãŒã ãšã³ãžã³ãpyxelãã§ã®ã²ãŒã å¶äœã«åœ¹ç«ã€ãããããªãå°ããªãµã³ãã«ããã°ã©ã ã®TIPSã§ãã
以äžã®ç°å¢ã§äœæã»åäœãããŠããŸãã
ã»OSïŒWindows11
ã»éçºç°å¢ïŒVisual Studio Code(Ver.1.88.1)
ã»pyxelã®ããŒãžã§ã³ïŒ2.0.12
èšäºå
ã®ã³ãŒãã¯ãèªç±ã«ã䜿ããã ãããã€ã¡ãŒãžçããã¡ã€ã«ã¯æ·»ä»ããŠããŸããããæš¡å(?)ããŠäœ¿ã£ãŠããã ããŠæ§ããŸããã
ãŸããpyxelã®åäœç°å¢ãå颿°ã®è©³çްãªèª¬æã¯pyxelå
¬åŒGitHubããåç
§ãã ããã
RPGã®æãšããã°
ã·ãŒã ã¬ã¹ã«ç§»ååºæ¥ãããã¯ãŒã«ããããããã¢ã€ã³ã³ã«å
¥ã£ãããšããããã§ããããŸããããããåºããããã宿å±ãããããæ
å ±ãéããŠãããªããã€ãã³ããèµ·ãã£ããããšãã£ãå
·åã§ãããããåºæ¬çã«ã¯æŠéãèµ·ããªãåºåãªã®ã§ãããããããããŠäŸµãããšã§ã€ãã³ãã®è¡æåºŠãé«ããŠããäœåããããŸããã
ä»åã¯ä»¥äžã®noteã§äœã£ãèŠäžãã圢RPGã®åºæ¬æ§é ãæµçšããŠããããããžã®ã€ãã³ãã®é
眮ãã建ç©ã«å
¥ã(å Žé¢è»¢æããã)ãã®2ç¹ãäœã£ãŠã¿ãããšæããŸãã
äœã£ãŠãããŸããã
ããã§ã¯å§ããŸãããã
ãŸãã¯ç»é¢ã®è¡šç€ºããã£ã©ã¯ã¿ãŒã®ç§»åãŸã§ã®ã³ãŒãããã¿ããšã
import pyxel
class App:
def __init__(self):
#ããã§èµ·åæã®åŠçãããŸã
pyxel.init(128, 128)
pyxel.load('./sample02.pyxres')
self.player_pos = [16, 16]
pyxel.run(self.update, self.draw)
def update(self):
#ããã§æ¯ãã¬ãŒã ã®æŽæ°äœæ¥ãããŸã
#ã³ã³ãããŒã«éšå###################
if pyxel.btnp(pyxel.KEY_RIGHT):
if self.move_check(self.player_pos[0]+8, self.player_pos[1]):
self.player_pos[0] += 8
elif pyxel.btnp(pyxel.KEY_LEFT):
if self.move_check(self.player_pos[0]-8, self.player_pos[1]):
self.player_pos[0] -= 8
elif pyxel.btnp(pyxel.KEY_UP):
if self.move_check(self.player_pos[0], self.player_pos[1]-8):
self.player_pos[1] -= 8
elif pyxel.btnp(pyxel.KEY_DOWN):
if self.move_check(self.player_pos[0], self.player_pos[1]+8):
self.player_pos[1] += 8
def move_check(self, x, y):
if pyxel.tilemaps[0].pget(x//8, y//8) == (0, 1):
return False
else:
return True
def draw(self):
#ããã§æ¯ãã¬ãŒã ã®æç»äœæ¥ãããŸã
pyxel.cls(0)
pyxel.bltm(0, 0, 0, 0, 0, 128, 128)
pyxel.blt(self.player_pos[0], self.player_pos[1], 0, 0, 0, 8, 8, 14)
App()
ã§ã¯ãšãããããçµµæããããŸããã¡ããã©çãäžã«éšå±ã®ãããªãã®ãããã®ã§ããããåºã«å»ºç©ãäœããŸãããã


å³äžã®ã¬ããŒãåãããå ¥ããããã«ããŸãããã
ããŠãã¿ã€ã«ããããå¢ãããããã§ç§»åæã®ãã§ãã¯ãèŠçŽãå¿ èŠãåºãŠããŸãããããã§ã¯ã1è¡ç®ã®ã¿ã€ã«ã¯ç§»åå¯èœããšããã«ãŒã«ã§äœã£ãŠã¿ãŸããmove_check颿°ãä¿®æ£ããŸãããã
def move_check(self, x, y):
if pyxel.tilemaps[0].pget(x//8, y//8)[1] > 0:
return False
else:
return Truepyxel.tilemaps[0].pget(x//8, y//8)[1]ãšããããšã§pgetã§ååŸããã¿ãã«ã®2ã€ç®ã®èŠçŽ ãéžæã§ããŸãã(a, b)ãšããæãã§è¿ã£ãŠããã®ã§bã®ã¿ã«ãªã圢ã§ããããã>0ãªãç§»åã§ããªãããšãšããã°ãäžèšã®ã1è¡ç®ã®ã¿ã€ã«ã¯ç§»åå¯èœããšããã«ãŒã«ã«åèŽããã¯ãã
â»pythonã§ã¯ïŒäŸå€ããããŸããïŒæ°åã¯0ããã¹ã¿ãŒãããã®ã§>0ãšããŠããŸãã

ããŠãã§ã¯å³äžã«ããã³ãšããã¬ããŒã«åœ¹å²ãäžããŠãããŸããããããããããšãšããŠã¯ããã¬ããŒãåŒããšæãéãããäœååŸã®ã¬ããŒã¯ã°ã©ãã£ãã¯ãå€ãããã§ãããšããäºã¯ã¿ã€ã«ããããæžãæããå¿ èŠããããšããããšããã£ãŠã¿ãŸãããã
def event_check(self, x, y):
t = pyxel.tilemaps[0].pget(x//8, y//8)
if t == (0, 4):
pyxel.tilemaps[0].pset(11, 12, (1, 4))
pyxel.tilemaps[0].pset(7, 9, (2, 0))
pyxel.tilemaps[0].pset(8, 9, (3, 0))
else:
passæ°ãã«event_check颿°ãäœæããŸãããmove_check颿°ãšåãããã«ç§»åå
ã®ã¿ã€ã«ãååŸããŠæ¡ä»¶ãåå²ãããŠããŸããã¬ããŒã®ã¿ã€ã«ã¯(0, 4)ãªã®ã§ãif t == (0, 4):ã®åå²ã«ã€ãã³ãåŠçãæžããŸãã
ã¿ã€ã«ããããæžãæããã«ã¯pyxel.tilemaps[t].psetã®åœä»€ã䜿çšããŸããåŒæ°ã¯(æžãæããããã¹xãæžãæããããã¹yãæžãæããã¿ã€ã«ã®çš®é¡)ã§ããä»åæžããã³ãŒãã§ã¯äžãããã¬ããŒã®èŠãç®ãèµ·ååŸã®ãã®ã«ããå·Šã®ãã¢ãéè·¯ã«ããå³ã®ãã¢ãéè·¯ã«ã倿ŽããŠããŸãã
ãã®event_check颿°ãã³ã³ãããŒã«éšåããåŒã³åºããŸãããã
def update(self):
#ããã§æ¯ãã¬ãŒã ã®æŽæ°äœæ¥ãããŸã
#ã³ã³ãããŒã«éšå###################
if pyxel.btnp(pyxel.KEY_RIGHT):
if self.move_check(self.player_pos[0]+8, self.player_pos[1]):
self.player_pos[0] += 8
else:
self.event_check(self.player_pos[0]+8, self.player_pos[1])
elif pyxel.btnp(pyxel.KEY_LEFT):
if self.move_check(self.player_pos[0]-8, self.player_pos[1]):
self.player_pos[0] -= 8
else:
self.event_check(self.player_pos[0]-8, self.player_pos[1])
elif pyxel.btnp(pyxel.KEY_UP):
if self.move_check(self.player_pos[0], self.player_pos[1]-8):
self.player_pos[1] -= 8
else:
self.event_check(self.player_pos[0], self.player_pos[1]-8)
elif pyxel.btnp(pyxel.KEY_DOWN):
if self.move_check(self.player_pos[0], self.player_pos[1]+8):
self.player_pos[1] += 8
else:
self.event_check(self.player_pos[0], self.player_pos[1]+8) ä»ãŸã§move_check颿°ã§Falseãè¿ã£ãå Žåã¯äœãããŠããŸããã§ãããããã®å Žåã«event_check颿°ãåŒã¶ããã«å€æŽãé害ç©ãç¹å®ã®ãã¹ãªãã€ãã³ããå®è¡ããŸãã

ããã§æµã®äžã«å ¥ãããšãã§ããããã«ãªããŸãããåãããã«æ¬¡ã¯å»ºç©ã«å ¥ãã€ãã³ããäœã£ãŠã¿ãŸããããä»åã¯ãããã®è»¢æãè¡ãã宀å ãããã衚瀺ãããŸãã

ã§ã¯event_check颿°ã«åå²ã远å ããŠã建ç©ã®å ¥ãå£ãã¹ã«è§Šããã建ç©å ã«ç§»åããããã«ããŸããããå ¥å£ã®ãã¹ã¯(2, 3)ãš(3, 3)ã§ãã
def event_check(self, x, y):
t = pyxel.tilemaps[0].pget(x//8, y//8)
if t == (0, 4):
pyxel.tilemaps[0].pset(11, 12, (1, 4))
pyxel.tilemaps[0].pset(7, 9, (2, 0))
pyxel.tilemaps[0].pset(8, 9, (3, 0))
elif t == (2, 3) or t == (3, 3):
self.player_pos = [7*8, 22*8]
else:
passt == (2, 3) or t == (3, 3):ã®å Žåã«ãã£ã©ã¯ã¿ãŒã(7, 22)ã®ãã¹ã«ç§»åãããŠããŸããã¿ã€ã«ãããã¯8ãããã§1ãã¹ãªã®ã§ãå®éã¯ããããã®åº§æšã«8ãæããå€ãèšå®ããŸãã

ããã§ãã£ã©ã¯ã¿ãŒåº§æšã¯ãã¡ããšç§»åããŠããã®ã§ãããç»é¢å€ã«è¡ã£ãŠããŸã£ãŠããã®ã§è¡šç€ºãããŸãããpyxel.cameraã䜿ã£ãŠç»é¢ã®æç»äœçœ®ãç§»åãããŸãããã
def event_check(self, x, y):
t = pyxel.tilemaps[0].pget(x//8, y//8)
if t == (0, 4):
pyxel.tilemaps[0].pset(11, 12, (1, 4))
pyxel.tilemaps[0].pset(7, 9, (2, 0))
pyxel.tilemaps[0].pset(8, 9, (3, 0))
elif t == (2, 3) or t == (3, 3):
self.player_pos = [7*8, 22*8]
pyxel.camera(0, 16*8)
else:
passpyxel.camera(0, 16*8)ã§ç»é¢ã®æç»äœçœ®ã16ãã¹äžã«ããããŸãã
def draw(self):
#ããã§æ¯ãã¬ãŒã ã®æç»äœæ¥ãããŸã
pyxel.cls(0)
pyxel.bltm(0, 0, 0, 0, 0, 128, 256)
pyxel.blt(self.player_pos[0], self.player_pos[1], 0, 0, 0, 8, 8, 14)
ããã«åãããŠã¿ã€ã«ãããã16ãã¹äžãŸã§èªã¿èŸŒãã§ããããã«å€æŽã
pyxel.bltm(0, 0, 0, 0, 0, 128, 256)ã®256éšåã倿ŽãããŠããŸãã

ãããæåŸã¯ããããå
ã®å®€å€ãããã«æ»ãåŠçãä»ããã°å®æã§ãã
ãã£ã©ã¯ã¿ãŒã®ç§»åã¯åãããã«ããŠãã«ã¡ã©ã¯åæäœçœ®ãªã®ã§(0, 0)ã«åãããŸãã
def event_check(self, x, y):
t = pyxel.tilemaps[0].pget(x//8, y//8)
if t == (0, 4):
pyxel.tilemaps[0].pset(11, 12, (1, 4))
pyxel.tilemaps[0].pset(7, 9, (2, 0))
pyxel.tilemaps[0].pset(8, 9, (3, 0))
elif t == (2, 3) or t == (3, 3):
self.player_pos = [7*8, 22*8]
pyxel.camera(0, 16*8)
elif t == (4, 3) or t == (5, 3):
self.player_pos = [7*8, 7*8]
pyxel.camera(0, 0)
else:
pass宀å€ãžåºãéã®åŠçãelif t == (4, 3) or t == (5, 3):以äžãäœæããŸãããå ã»ã©ãšåæ§ã«ãããã£ã©ã¯ã¿ãŒäœçœ®ãèšå®ãããŠãã«ã¡ã©äœçœ®ã調æŽãããŸãã

ããã§ãããã®è¡ãæ¥ãå¯èœã§ãã
ããã«ãŠå®æã§ããçŸç¶ã§ã¯ãã 建ç©å ã«å ¥ãããšãã§ããã ããªã®ã§ãã·ã§ããã®ãããªæ©èœãæããããšãã£ãšã²ãŒã ããããªãããã§ãã建ç©ãïŒã€ãšããã®ã¯å¯ããã®ã§ããã£ãšå¢ããã®ãè¯ããšæããŸãã
æåŸã«ãã¹ãŠã€ãªãããœãŒã¹ãèŒããŠçµããã«ããããšæããŸãã
import pyxel
class App:
def __init__(self):
#ããã§èµ·åæã®åŠçãããŸã
pyxel.init(128, 128)
pyxel.load('./sample02.pyxres')
self.player_pos = [16, 16]
pyxel.run(self.update, self.draw)
def update(self):
#ããã§æ¯ãã¬ãŒã ã®æŽæ°äœæ¥ãããŸã
#ã³ã³ãããŒã«éšå###################
if pyxel.btnp(pyxel.KEY_RIGHT):
if self.move_check(self.player_pos[0]+8, self.player_pos[1]):
self.player_pos[0] += 8
else:
self.event_check(self.player_pos[0]+8, self.player_pos[1])
elif pyxel.btnp(pyxel.KEY_LEFT):
if self.move_check(self.player_pos[0]-8, self.player_pos[1]):
self.player_pos[0] -= 8
else:
self.event_check(self.player_pos[0]-8, self.player_pos[1])
elif pyxel.btnp(pyxel.KEY_UP):
if self.move_check(self.player_pos[0], self.player_pos[1]-8):
self.player_pos[1] -= 8
else:
self.event_check(self.player_pos[0], self.player_pos[1]-8)
elif pyxel.btnp(pyxel.KEY_DOWN):
if self.move_check(self.player_pos[0], self.player_pos[1]+8):
self.player_pos[1] += 8
else:
self.event_check(self.player_pos[0], self.player_pos[1]+8)
def move_check(self, x, y):
if pyxel.tilemaps[0].pget(x//8, y//8)[1] > 0:
return False
else:
return True
def event_check(self, x, y):
t = pyxel.tilemaps[0].pget(x//8, y//8)
if t == (0, 4):
pyxel.tilemaps[0].pset(11, 12, (1, 4))
pyxel.tilemaps[0].pset(7, 9, (2, 0))
pyxel.tilemaps[0].pset(8, 9, (3, 0))
elif t == (2, 3) or t == (3, 3):
self.player_pos = [7*8, 22*8]
pyxel.camera(0, 16*8)
elif t == (4, 3) or t == (5, 3):
self.player_pos = [7*8, 7*8]
pyxel.camera(0, 0)
else:
pass
def draw(self):
#ããã§æ¯ãã¬ãŒã ã®æç»äœæ¥ãããŸã
pyxel.cls(0)
pyxel.bltm(0, 0, 0, 0, 0, 128, 256)
pyxel.blt(self.player_pos[0], self.player_pos[1], 0, 0, 0, 8, 8, 14)
App()ãããŸã§èªãã§ããã ãããããšãããããŸããã
â»ææãšãªã¢ã§ãããç¹ã«äœããããŸãããèšå®ããŠããã ãã§ãã®ã§ããæ°ã«å¬ããŸãããè³Œå ¥ããã ãããšå¬ããã§ãã