前提
Python(Pyxel)でゲームを作っています。
実現したいこと
スペースキーを押すとロケットから発射される弾が画面左側に表示されるモンスターに触れた際にモンスターのHPが減るようにしたいのですが、HPが減ってくれません。
HPが減る変数はMonster class内のdef update内に書いています。Bullet class内で生成した弾丸がモンスターの座標内に入ると、hp が1ずつ減っていくように書いています。
該当のソースコード
import pyxel class App: def __init__(self): pyxel.init(200, 200) pyxel.load("mygame.pyxres") self.rocket = Rocket(50,100) self.bullet = [] self.monster = Monster() pyxel.run(self.update, self.draw) def update(self): self.rocket.move() self.rocket.update(self.bullet) for i in reversed(range(len(self.bullet))): if not self.bullet[i].move(): del self.bullet[i] self.monster.move() def draw(self): pyxel.cls(0) pyxel.blt(0, 0,0,0,0,200,200,0) self.rocket.draw() self.monster.draw() for b in self.bullet: b.draw() #カーソルで動かすロケットのアイコンを示すオブジェクト class Rocket: def __init__(self,x,y): #最初の位置は、インスタンス作成のときの引数x,yで決まる self.x = x self.y = y self.h = 6 self.w = 6 self.s = 1 #車の動く方向を示す変数。カーソルキーの値をそのまま使う #最初は右向き self.dir = pyxel.KEY_RIGHT #ロケットのHPを表示 def draw(self): if self.dir == pyxel.KEY_UP: pyxel.blt(self.x, self.y,2,0,0,7,9,7) elif self.dir == pyxel.KEY_LEFT: pyxel.blt(self.x, self.y,2,0,9,9,7,7) elif self.dir == pyxel.KEY_DOWN: pyxel.blt(self.x, self.y,2,0,16,7,8,7) elif self.dir == pyxel.KEY_RIGHT: pyxel.blt(self.x, self.y,2,0,24,9,7,7) pyxel.rect(self.x - 5, self.y + 10, 20, 4, 7) pyxel.rect(self.x - 4, self.y + 11, 18, 2, 8) def update(self,b): # self.x = x # self.y = y if pyxel.btnp(pyxel.KEY_SPACE): b.append(Bullet(self.x,self.y)) def move(self): #移動 if self.dir == pyxel.KEY_RIGHT: self.x += 2 elif self.dir == pyxel.KEY_LEFT: self.x -= 2 elif self.dir == pyxel.KEY_UP: self.y -= 2 elif self.dir == pyxel.KEY_DOWN: self.y += 2 #壁判定 if self.x > 200 - self.w: self.x = 200 - self.w elif self.x < 0: self.x = 0 if self.y > 200 - self.h: self.y = 200 - self.h elif self.y < 0: self.y = 0 #押されたキーの判定 if pyxel.btnp(pyxel.KEY_RIGHT): self.dir = pyxel.KEY_RIGHT elif pyxel.btnp(pyxel.KEY_LEFT): self.dir = pyxel.KEY_LEFT elif pyxel.btnp(pyxel.KEY_UP): self.dir = pyxel.KEY_UP elif pyxel.btnp(pyxel.KEY_DOWN): self.dir = pyxel.KEY_DOWN # 弾丸のクラス class Bullet: def __init__(self,x,y): self.x = x self.y = y self.s = 4 self.c = pyxel.COLOR_RED def draw(self): pyxel.rect(self.x, self.y + 3, 2, 1, self.c) def move(self): self.x += self.s #途中で消えたことがわかるように上のほうに到達したらFalseを返す #一番上まで到達させるなら、self.y < 0 と条件を変更する if self.x > 190: return False else: return True class Monster: # coordinatey = Bullet() def __init__(self): self.x = 180 self.ya = 50 self.yb = 150 self.d = pyxel.rndi(1, 50) self.hpa = 18 self.hpb = 36 def move(self): #移動 if self.ya > 200: self.ya = 0 if self.yb < 0: self.yb = 200 self.d = pyxel.rndi(1, 20) self.e = pyxel.rndi(1, 20) if 1 < self.d <= 9: self.ya += 1 if 1 < self.e <= 9: self.yb -= 1 def update(self): if (180 >= Bullet().self.x >= 170) and (self.ya + 7 > Bullet().self.y > self.ya): self.hpa -= 1 if (180 >= Bullet().self.x >= 170) and (self.yb + 8 > Bullet().self.y > self.yb): self.hpb -= 1 #モンスターのHPを表示 def draw(self): # pyxel.rect(self.x, self.y + 3, 2, 1, self.c) # pyxel.text(5, 5, "Stage : 1" , 3) pyxel.blt(self.x, self.ya,1,0,0,8,6,7) pyxel.blt(self.x, self.yb,1,0,7,11,8,7) pyxel.rect(self.x - 5, self.ya + 10, 20, 4, 7) pyxel.rect(self.x - 5, self.yb + 10, 20, 4, 7) pyxel.rect(self.x - 4, self.ya + 11, self.hpa , 2, 8) pyxel.rect(self.x - 4, self.yb + 11, self.hpb/2 , 2, 8) #アプリケーションの起動 App()
質問文読みましたが具体的な課題を記述出来れば具体的な回答が得られると思います。
ゲーム内容がわからないので、もう少しプログラム的に表現する方が
このサイトからよりたくさん回答がもらえるようになると思いました。
例えば、
・「モンスターのHPが減るように」というのは該当のソースコードの中のどの変数の値を指しているのか
・「どうしても実現できません」→減少してほしいのに、HPの値が減少しないのか、増加してしまうのか、意図したよりも減少幅が大きいのか。。。等
あなたの回答
tips
プレビュー