前提・実現したいこと
他人の作ったファイルが実行できなくて困っています。pyxelのバージョンはともに1.4.3で揃っています。アドバイスを頂きたいです。
発生している問題・エラーメッセージ
Traceback (most recent call last): File "/Users/higashirinako/Downloads/invader/invader.py", line 1, in <module> import pyxel File "/usr/local/lib/python3.9/site-packages/pyxel/__init__.py", line 10, in <module> from . import core # type: ignore File "/usr/local/lib/python3.9/site-packages/pyxel/core/__init__.py", line 42, in <module> _lib = _load_library() File "/usr/local/lib/python3.9/site-packages/pyxel/core/__init__.py", line 39, in _load_library return cdll.LoadLibrary(lib_path) File "/usr/local/Cellar/python@3.9/3.9.5/Frameworks/Python.framework/Versions/3.9/lib/python3.9/ctypes/__init__.py", line 452, in LoadLibrary return self._dlltype(name) File "/usr/local/Cellar/python@3.9/3.9.5/Frameworks/Python.framework/Versions/3.9/lib/python3.9/ctypes/__init__.py", line 374, in __init__ self._handle = _dlopen(self._name, mode) OSError: dlopen(/usr/local/lib/python3.9/site-packages/pyxel/core/bin/macos/libpyxelcore.dylib, 6): Symbol not found: __ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE16find_last_not_ofEPKcmm Referenced from: /usr/local/lib/python3.9/site-packages/pyxel/core/bin/macos/libpyxelcore.dylib (which was built for Mac OS X 10.15) Expected in: /usr/lib/libstdc++.6.dylib in /usr/local/lib/python3.9/site-packages/pyxel/core/bin/macos/libpyxelcore.dylib
該当のソースコード
Python
1import pyxel 2import random 3from math import sqrt 4 5WIDTH = 128 6HEIGHT = 128 7 8SCENE_PLAY = 0 9SCENE_GAMEOVER = 1 10 11PLAYER_WIDTH = 8 12PLAYER_HEIGHT = 8 13PLAYER_SPEED = 2 14 15ENEMY_WIDTH = 8 16ENEMY_HEIGHT = 8 17ENEMY_SPEED = 2 18 19BULLET_WIDTH = 2 20BULLET_HEIGHT = 6 21BULLET_SPEED = 2 22 23enemy_list = [] 24bullet_list = [] 25 26def update_list(list): 27 for elem in list: 28 elem.update() 29 30def draw_list(list): 31 for elem in list: 32 elem.draw() 33 34def is_collision(obj_a, obj_b): 35 return obj_a.x + obj_a.w > obj_b.x and obj_a.x < obj_b.x + obj_b.w and obj_a.y + obj_a.h > obj_b.y and obj_a.y < obj_b.y + obj_b.h 36 37class Player(): 38 def __init__(self): 39 self.x = (WIDTH - PLAYER_WIDTH) / 2 40 self.y = HEIGHT - 15 41 self.w = PLAYER_WIDTH 42 self.h = PLAYER_HEIGHT 43 44 def update(self): 45 if pyxel.btn(pyxel.KEY_LEFT): 46 self.x -= PLAYER_SPEED 47 48 if pyxel.btn(pyxel.KEY_RIGHT): 49 self.x += PLAYER_SPEED 50 51 if pyxel.btnp(pyxel.KEY_SPACE): 52 if Bullet.bullet_state: 53 Bullet(self.x + (PLAYER_WIDTH - BULLET_WIDTH) / 2, self.y, 1) 54 Bullet.bullet_state = False 55 56 if self.x < 0: 57 self.x = 0 58 if self.x > WIDTH - PLAYER_WIDTH: 59 self.x = WIDTH - PLAYER_WIDTH 60 61 def draw(self): 62 pyxel.blt(self.x, self.y, 0, 0, 0, PLAYER_WIDTH, PLAYER_HEIGHT, 15) 63 64class Enemy(): 65 def __init__(self): 66 self.x = 0 67 self.y = 10 68 self.w = ENEMY_WIDTH 69 self.h = ENEMY_HEIGHT 70 self.v = ENEMY_SPEED 71 72 enemy_list.append(self) 73 74 def update(self): 75 if self.x + self.v < 0 or self.x + self.v > WIDTH - ENEMY_WIDTH: 76 self.v *= -1 77 self.y += ENEMY_HEIGHT 78 self.x += self.v 79 80 if pyxel.frame_count % (15 * random.randint(3, 5)) == 0: 81 Bullet(self.x + (ENEMY_WIDTH - BULLET_WIDTH) / 2, self.y, -1) 82 83 def draw(self): 84 pyxel.blt(self.x, self.y, 0, 0, 8, ENEMY_WIDTH, ENEMY_HEIGHT, 15) 85 86class Report(Enemy): 87 def __init__(self): 88 super().__init__() 89 self.life = 1 90 91class Test(Enemy): 92 def __init__(self): 93 super().__init__() 94 self.life = 3 95 96 def draw(self): 97 pyxel.blt(self.x, self.y, 0, 0, 8 * self.life, ENEMY_WIDTH, ENEMY_HEIGHT, 15) 98 99class Bullet(): 100 bullet_state = True 101 n = 3 102 def __init__(self, x, y, way): 103 self.x = x 104 self.y = y 105 self.w = BULLET_WIDTH 106 self.h = BULLET_HEIGHT 107 self.v = BULLET_SPEED * way 108 109 bullet_list.append(self) 110 111 def update(self): 112 self.y -= self.v 113 114 def draw(self): 115 if self.v > 0: 116 pyxel.blt(self.x, self.y, 0, 8, 0, BULLET_WIDTH, BULLET_HEIGHT, 15) 117 else: 118 pyxel.blt(self.x, self.y, 0, 10, 0, BULLET_WIDTH, BULLET_HEIGHT, 15) 119 120class App(): 121 def __init__(self): 122 pyxel.init(WIDTH, HEIGHT, caption='INVADER') 123 pyxel.load('game.pyxres') 124 125 self.scene = SCENE_PLAY 126 self.player = Player() 127 self.score = 0 128 129 pyxel.run(self.update, self.draw) 130 131 132 def update(self): 133 if pyxel.btnp(pyxel.KEY_Q): 134 pyxel.quit() 135 136 if self.scene == SCENE_PLAY: 137 self.update_play() 138 elif self.scene == SCENE_GAMEOVER: 139 self.update_gameover() 140 141 def update_play(self): 142 if pyxel.frame_count % 200 == 0: 143 Test() 144 elif pyxel.frame_count % 50 == 0: 145 Report() 146 147 self.player.update() 148 update_list(enemy_list) 149 update_list(bullet_list) 150 151 Bullet.bullet_state = all([bullet.y <= self.player.y - self.player.y / Bullet.n for bullet in bullet_list if bullet.v > 0]) 152 153 for enemy in enemy_list: 154 for bullet in bullet_list: 155 if bullet.v > 0 and is_collision(enemy, bullet): 156 enemy.life -= 1 157 if enemy.life == 0: 158 enemy_list.remove(enemy) 159 self.score += 1 160 bullet_list.remove(bullet) 161 Bullet.bullet_state = True 162 163 if bullet.v < 0 and is_collision(self.player, bullet): 164 self.scene = SCENE_GAMEOVER 165 if is_collision(self.player, enemy): 166 self.scene = SCENE_GAMEOVER 167 168 def update_gameover(self): 169 enemy_list.clear() 170 bullet_list.clear() 171 if pyxel.btnp(pyxel.KEY_ENTER): 172 self.scene = SCENE_PLAY 173 self.score = 0 174 Bullet.n = 3 175 Bullet.bullet_state = True 176 177 178 def draw(self): 179 pyxel.cls(0) 180 181 if self.scene == SCENE_PLAY: 182 self.draw_play() 183 elif self.scene == SCENE_GAMEOVER: 184 self.draw_gameover() 185 186 def draw_play(self): 187 draw_list(enemy_list) 188 draw_list(bullet_list) 189 self.player.draw() 190 pyxel.text(2, 2, "SCORE: " + str(self.score), pyxel.COLOR_WHITE) 191 192 def draw_gameover(self): 193 pyxel.text(48, 40, "GAMEOVER", pyxel.COLOR_WHITE) 194 pyxel.text(42, 55, "RESULT: {}pt".format(self.score), pyxel.COLOR_WHITE) 195 pyxel.text(34, 80, "- PRESS ENTER -", pyxel.COLOR_GRAY) 196 197App()
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
これかな。
https://github.com/kitao/pyxel/issues/302
また、振り出しに戻ってる
https://teratail.com/questions/341644
直したいエラーは、この質問に書いてるのじゃなくて、
https://teratail.com/questions/342412
に書いてる
unsupported resource file version '1.4.3' in 'LoadAsset'
ではないの?
> pyxelのバージョンはともに1.4.3で揃っています。
Pythonのバージョンも同じですか?
「他人の作ったファイルが実行できなくて困っています。」とは、
pyxel.load('game.pyxres')
でエラー出る、ということですよね?
Pyxelのサンプルコードの内の一つ
https://github.com/kitao/pyxel/blob/master/pyxel/examples/02_jump_game.py
には、
pyxel.load("assets/jump_game.pyxres")
がありますけど、このサンプルコードの実行でもエラー出るのですか?
上記が大丈夫なら、読めるファイルと読めないファイルがあるのですよね
読めない「game.pyxres」を、質問者さんのMacのpyxel 1.4.3に付属するPyxel Editorで読んで保存し直して、それを読んでもエラー出ますか?
【追記】 https://teratail.com/questions/342412
の「質問への追記・修正の依頼」に、
「pyxelの公式サンプルや、自分が今まで作ったファイルは正常に動きました!」
と書いてるところから、Pyxelのサンプルコードはエラー出ずに実行できるみたいですね