
pyxelã²ãŒã å¶äœTIPS_èŠäžãã圢RPG颚
ã¯ããã«
ãã®noteã¯pythonã®ã¬ããã²ãŒã ãšã³ãžã³ãpyxelãã§ã®ã²ãŒã å¶äœã«åœ¹ç«ã€ãããããªãå°ããªãµã³ãã«ããã°ã©ã ã®TIPSã§ãã
以äžã®ç°å¢ã§äœæã»åäœãããŠããŸãã
ã»OSïŒWindows11
ã»éçºç°å¢ïŒVisual Studio Code(Ver.1.88.1)
ã»pyxelã®ããŒãžã§ã³ïŒ2.0.12
èšäºå
ã®ã³ãŒãã¯ãèªç±ã«ã䜿ããã ãããã€ã¡ãŒãžçããã¡ã€ã«ã¯æ·»ä»ããŠããŸããããæš¡å(?)ããŠäœ¿ã£ãŠããã ããŠæ§ããŸããã
ãŸããpyxelã®åäœç°å¢ãå颿°ã®è©³çްãªèª¬æã¯pyxelå
¬åŒGitHubããåç
§ãã ããã
èŠäžãã圢RPGã£ãŠïŒ
ææãããèŠäžãã圢RPGããŒã«ãã®äŒèª¬ã®åæãæºåž¯æ©ã§ã¯ãã®åœ¢æ
ã®äœåãå€ãã£ãæ°ãããŸããã¡ãã£ãšæ¯è²ã¯éããã©ã颚æ¥ã®ã·ã¬ã³ãšãããã©ãŽã³ã¯ãšã¹ãã»ãã¡ã€ãã«ãã¡ã³ã¿ãžãŒãªãããããã«ã·ãŒã³ä»¥å€ã¯ãèŠäžãã圢ããšèšã£ãŠããããããªãã§ããããã
ããããæç»ãããã£ã©ã¯ã¿ãŒãåãããä»åã®èšäºã§ã¯ãããŸã§ãç®æšãšããŸãããããã§ãéææã¯ãªããªãã®ãã®ããã®éªšçµã¿ããã§ããã°ãããšã¯æŠéã ã£ããã€ãã³ãã ã£ãããæãããŸãŸã«ä»ãè¶³ããŠããã°ããã®ã§ãã
äœã£ãŠãããŸããã
ããã§ã¯å§ããŸãããã
ãŸãã¯pyxelã¢ããªã±ãŒã·ã§ã³ã®åºæ¬çãªåãæžããŠããŸããŸããããã ãæžãã°ãšããããç»é¢ã¯è¡šç€ºãããŸããããããããè¶³ããŠãããŸãããã
import pyxel
class App:
def __init__(self):
#ããã§èµ·åæã®åŠçãããŸã
pyxel.init(128, 128)
pyxel.run(self.update, self.draw)
def update(self):
#ããã§æ¯ãã¬ãŒã ã®æŽæ°äœæ¥ãããŸã
pass
def draw(self):
#ããã§æ¯ãã¬ãŒã ã®æç»äœæ¥ãããŸã
pyxel.cls(0)
pyxel.text(40, 60, "Hello, Pyxel!", pyxel.frame_count % 16)
App()ä»åã¯128*128ã®ç»é¢ãµã€ãºã§äœããŸããå®è¡ãããšãã«ãã«å ãæåã衚瀺ãããã¯ãã§ããåŠçã®é çªãšããŠã¯æ¯ãã¬ãŒã ãupdateâdrawãã®é¢æ°ãå®è¡ãããŸãã
ããŠããããŸã§åºæ¥ããæ©éèŠçŽ ã远å ããŠãããŸãã
ãŸãã¯ããããã®è¡šç€ºãã§ãã
Pyxel Editorãèµ·åããŠã¿ã€ã«ããããäœæããŸãããã

ç°¡åãªæãã§åãšèã岩ã§ãã

åšãã¯å²©ã§å²ã£ãŠããªãã建ç©ã£ãœãã®ãé 眮ãèã¯æ°åã§ã
ãããããããã§ããŸãããpyxelã®ã¿ã€ã«ãããã¯1ãã¹ã8*8ã§ã§ããŠããŸãããããäžã®ç»é¢ã ãš16*16ãã¹ãããŸãããšããäºã¯ãã®ãããã衚瀺ããã®ã«ã¯16*8=128ã瞊暪128ãããå¿ èŠã«ãªããŸãããªã®ã§ä»åã¯128*128ã®ç»é¢ãµã€ãºã«ããããã§ããã
ãã®ãããã衚瀺ãããããã«ã³ãŒãã«ä»¥äžã®èšè¿°ãä»ãè¶³ããŸãã
def __init__(self):
#ããã§èµ·åæã®åŠçãããŸã
pyxel.init(128, 128)
pyxel.load('./sample01.pyxres')
pyxel.run(self.update, self.draw)ãŸãã¯pyxel.loadã§äœæããpyxresãèªã¿èŸŒã¿ãŸãããã¡ã€ã«ãã¹ããã¡ã€ã«åã¯é©å®å€æŽããŠãã ããã
def draw(self):
#ããã§æ¯ãã¬ãŒã ã®æç»äœæ¥ãããŸã
pyxel.cls(0)
pyxel.bltm(0, 0, 0, 0, 0, 128, 128) draw颿°ã«pyxel.bltmã远å ããŠã¿ã€ã«ããããæç»ãããŸããå®è¡ããŠã¿ãŸãããã

è¯ãæãã§ãããæ¬¡ã¯ããã«ãã£ã©ã¯ã¿ãŒãé
眮ããŠã¿ãŸãããããŸãã¯Pyxel Editorã§ç»åãäœããŸãã1ãã¹8*8ãªã®ã§åããµã€ãºã§äœããŸãããã
ãµã€ãºããã£ãŠããã°ã©ããªãã£ã©ã¯ã¿ãŒã§ã倧äžå€«ã§ãã

ã§ã¯ç»é¢äžã«è¡šç€ºãããŠã¿ãŸããä»åã®ãããã¯1ãã¹ã8*8ãã€ãŸã8ãããåºåãã«ãªã£ãŠããŸãããã£ã©ã¯ã¿ãŒãé 眮ããéã¯åº§æšã8ã®åæ°ã«ãªãããã«ãããšãããã«åãŸãã¯ãã§ãã
def draw(self):
#ããã§æ¯ãã¬ãŒã ã®æç»äœæ¥ãããŸã
pyxel.cls(0)
pyxel.bltm(0, 0, 0, 0, 0, 128, 128)
pyxel.blt(16, 16, 0, 0, 0, 8, 8, 14)draw颿°ã«pyxel.bltã远å ããŸããä»åæåŸã®åŒæ°ã«ã14ããæå®ããŸããããããã¯ééãããè²ã®æå®ã§ããäžã®ç»åã§èæ¯è²ã«ããŠãããã³ã¯?ã£ãœãè²ãééãããŠããŸãã
ãŸããæžãããåœä»€ã¯äžããå®è¡ãããŠããã®ã§ããããã®æç»ã®åã«ãã£ã©ã¯ã¿ãŒã®æç»åœä»€ãæžããŠããŸããšãäžãããããã§å¡ãã€ã¶ãããŠããŸããŸããé çªã«ã¯æ³šæããŸãããã
ã§ã¯å®è¡ããŠã¿ãŸãããã

ã²ãŒã ã£ãœããã§ãŠããŸãããã€ãã§ã ããããŒããŒãã§åãããããã«ãã¡ãããŸãããã
åãããããã«ãããšããäºã¯ããã£ã©ã¯ã¿ãŒã®åº§æšãå¯å€ã«ãããšããäºããŸãã¯ãã®ããã®å€æ°ãçšæããŸãã
def __init__(self):
#ããã§èµ·åæã®åŠçãããŸã
pyxel.init(128, 128)
pyxel.load('./sample01.pyxres')
self.player_pos = [16, 16]
pyxel.run(self.update, self.draw)self.player_posãšãã倿°ãäœæããŸããããªã¹ãåã§ãã£ã©ã¯ã¿ãŒã®x座æšã»y座æšãæ ŒçŽããŸãã
ã§ã¯æ¬¡ã«ããŒããŒããæŒããéã«ãã®å€ãå€ããããã«ããŸãããã
def update(self):
#ããã§æ¯ãã¬ãŒã ã®æŽæ°äœæ¥ãããŸã
#ã³ã³ãããŒã«éšå###################
if pyxel.btnp(pyxel.KEY_RIGHT):
self.player_pos[0] += 8
elif pyxel.btnp(pyxel.KEY_LEFT):
self.player_pos[0] -= 8
elif pyxel.btnp(pyxel.KEY_UP):
self.player_pos[1] -= 8
elif pyxel.btnp(pyxel.KEY_DOWN):
self.player_pos[1] += 8if pyxel.btnp(pyxel.ããŒå):ã§ããŒããŒãã®æŒäžå€å®ãã§ããŸããä»åã¯äžäžå·Šå³ã®ããŒã§å€å®ããŸãããããããå³ãã¿ã³ãæŒããããx座æšã+8ããå·Šãã¿ã³ãæŒããããx座æšã-8ããšãã颚ã«äœã£ãŠãããŸãã
äžäžã®y座æšã¯æ³šæãå¿
èŠã§ãpyxelã§ã¯äžãã«è¡ãã»ã©y座æšã倧ãããªããŸãããã®ãããäžãã¿ã³ãæŒããããy座æšã-8ããäžãã¿ã³ãæŒããããy座æšã+8ããšããããã«ããŒæäœãšéã«ãªããŸãã
æåŸã«çŸåšã¯æ±ºãæã¡ã«ãªã£ãŠãããã£ã©ã¯ã¿ãŒã®æç»äœçœ®ã倿°ã䜿ãåœ¢ã«æ¹è¯ããŸãããã
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)pyxel.bltã§æå®ããŠãã座æšãself.player_posããååŸããããã«ããŸãããããã§update颿°ã§ã®å€æŽãæç»æã«åæ ãããããšãã§ããŸãã

ãã ãçŸç¶ã§ã¯é害ç©ã®åœããå€å®ããªãã®ã§å²©ã®ãã¹ãééããŠããŸããŸããããã§ã¯ããããšãããããã ã®ç»åãªã®ã§ãåœããå€å®ã远å ããŠãããŸãããã
åããŒã®ã³ã³ãããŒã«éšåã«åœããå€å®ã®ãã§ãã¯ããžãã¯ãä»ããŠãããã®ã§ããããããã£ããããããªãšããã§äœ¿ããããªãã®ã¯é¢æ°åãããšäŸ¿å©ã§ãã
def move_check(self, x, y):
if pyxel.tilemaps[0].pget(x//8, y//8) == (0, 1):
return False
else:
return True
move_check颿°ãäœããŸãããåŒã³åºãéã®åŒæ°ãšããŠxãšyãããããã®åº§æšã岩ã§ããã°Falseããã以å€ã¯Trueãè¿ããŸããã¿ã€ã«ãããã®çš®é¡ã®ååŸã«ã¯pyxel.tilemaps[t].pgetã®åœä»€ã䜿ããŸãããã¿ã€ã«ãããã¯8ãããã§1ãã¹ãªã®ã§å®éã®åº§æšã8ã§å²ãããšã§ã¿ã€ã«ãããã®ã©ã®ãã¹ããç¹å®ã§ããŸããå ã»ã©ã®äŸã ãšåº§æšã¯[16, 16]ãªã®ã§8ã§å²ã£ãŠ[2, 2]ã®ãã¹ãšããäºã«ãªããŸãã
ããã§ã¯ãã®é¢æ°ãããŒã³ã³ãããŒã«ã®éšåã§åŒã³åºããŠã¿ãŸãããã
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] += 8if self.move_check(self.player_pos[0]+8, self.player_pos[1]):ã®ãããªåœ¢ã§åŒã³åºããŸããããã§move_check颿°ãTrueãè¿ãããšãã®ã¿ãç§»è¡ã®åŠçãæµããŸãããã§ãã¯ãããã¹ã¯ããã£ã©ã¯ã¿ãŒãä»ãããã¹ãã§ã¯ãªããããããç§»åããããšããŠãããã¹ãã§ããç¹ã泚æããŠãã ããã

ããããã§ããããã®æç»ãããã£ã©ã¯ã¿ãŒã®æç»ãããã£ã©ã¯ã¿ãŒã®ç§»åããã§ããŸããããããããŒã¹ã«äœãäœããŸããããïŒ
ã»ãã£ã©ã¯ã¿ãŒã1ã€ãšããã®ã¯å¯ããã®ã§NPCãå¢ããã
âç§»åã®å€å®ãšãã¯ä»åäœã£ããã®ãåèã«ãªãããã§ãã
ã»ãã£ãšå€§ããªããããäœã£ãŠã¿ãã
âãããã倧ãããããšã¹ã¯ããŒã«ã®åé¡ãåºãŠããŸããpyxel.cameraã®åœä»€ã圹ã«ç«ã€ãããããŸããã
ã»ç§»åå
ã®ãã¹ã«ãã£ãŠæåãå€ããŠã¿ãã
âpyxel.tilemaps[t].pgetã§ãã¹ã®çš®é¡ãåããã®ã¯äžèšã®éãã§ãããã¹ã«ãã£ãŠã€ãã³ããèšå®ãããããã®ãè¯ãã§ããã
ãã²è²ã ãšè©ŠããŠããã ããã°ãšæããŸããå人çã«ã¯åºãããããšããã®ã¯ãã¯ãããã³ã§ããã
æåŸã«ãã¹ãŠã€ãªãããœãŒã¹ãèŒããŠçµããã«ããããšæããŸãã
import pyxel
class App:
def __init__(self):
#ããã§èµ·åæã®åŠçãããŸã
pyxel.init(128, 128)
pyxel.load('./sample01.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()ãããŸã§èªãã§ããã ãããããšãããããŸããã
â»ææãšãªã¢ã§ãããç¹ã«äœããããŸãããèšå®ããŠããã ãã§ãã®ã§ããæ°ã«å¬ããŸãããè³Œå ¥ããã ãããšå¬ããã§ãã