ど初心者です。読みにくい部分も多いと思いますがお願いします。
pythonのtkinterでシューティングゲームを作っています。
自機(player)が弾丸(playerbullet)を射出する機能を実装中に以下のエラーメッセージが発生しました。
実現したいこと
クリックしたときに自機の地点から弾丸を描画し、そのx座標を継続的に増加させたいです。
発生している問題・エラーメッセージ
Playerクラスのself.x,self.yをplayerbulletクラスに代入して実行し自機の位置に描画は成功しましたが、shoot関数でself.xを増加させることができません。
self.x,self.yが毎回上書きされているかもしれないです。
一部抜粋したコード↓
event_x = 200; event_y = 200;
class Player:
def __init__(self, x, y): self.x = x self.y = y self.draw() def draw(self): global event_x, event_y self.id = can.create_rectangle(self.x, self.y, self.x+20, self.y+70, fill="white") if keyPress_D==True and self.y<=900: event_y += 15 if keyPress_U==True and self.y>=50: event_y -= 15 if keyPress_R==True and self.x<=400: event_x += 15 if keyPress_L==True and self.x>=50: event_x -= 15 if click==True: self.shooting() def shooting(self): playerbullet = PlayerBullet(self.x, self.y)
class PlayerBullet:
def __init__(self, x, y): self.x = x self.y = y self.draw() self.shoot() def draw(self): self.id = can.create_oval(self.x+20, self.y+35, self.x+33, self.y+48, fill="white") def shoot(self): if self.x >= 0: can.move(self.id, 25, 0) self.x += 25 win.after(200, self.shoot)
def gameLoop():
can.delete("all")
player = Player(event_x, event_y)
win.after(50, gameLoop)
gameLoop()
win.mainloop()
一応下記が全コードです。
該当のソースコード
import random
from time import sleep
import tkinter as tk
from tkinter import messagebox
keyPress_U = False; keyPress_D = False; keyPress_R = False; keyPress_L = False; click = False; event_x = 200; event_y = 200;
bullet_list = []
#ゲームオーバー
def gameOver():
messagebox.showinfo("Information", "GAME OVER!")
exit()
#ゲームクリア
def gameClear():
messagebox.showinfo("Information", "CONGRATULATIONS!!!!")
exit()
def rightKeyPress(event):
global keyPress_R
keyPress_R = True
def rightKeyRelease(event):
global keyPress_R
keyPress_R = False
def leftKeyPress(event):
global keyPress_L
keyPress_L = True
def leftKeyRelease(event):
global keyPress_L
keyPress_L = False
def upKeyPress(event):
global keyPress_U
keyPress_U = True
def upKeyRelease(event):
global keyPress_U
keyPress_U = False
def downKeyPress(event):
global keyPress_D
keyPress_D = True
def downKeyRelease(event):
global keyPress_D
keyPress_D = False
def clicking(event):
global click
click = True
class Player:
def __init__(self, x, y): self.x = x self.y = y self.draw() def draw(self): global event_x, event_y self.id = can.create_rectangle(self.x, self.y, self.x+20, self.y+70, fill="white") if keyPress_D==True and self.y<=900: event_y += 15 if keyPress_U==True and self.y>=50: event_y -= 15 if keyPress_R==True and self.x<=400: event_x += 15 if keyPress_L==True and self.x>=50: event_x -= 15 if click==True: self.shooting() def shooting(self): playerbullet = PlayerBullet(self.x, self.y)
class PlayerBullet:
def __init__(self, x, y): self.x = x self.y = y self.draw() self.shoot() bullet_list.append(self) def draw(self): self.id = can.create_oval(self.x+20, self.y+35, self.x+33, self.y+48, fill="white") def shoot(self): if self.x >= 0: can.move(self.id, 25, 0) self.x += 25 win.after(200, self.shoot)
class Enemy:
def __init__(self, x, y, st): self.x = x self.y = y self.st = st self.draw() def draw(self): self.id = can.create_rectangle(self.x, self.y, self.x+20, self.y+30, fill="white") def collision(self): enemy_count = 0 if (self.x-playerbullet.x)**2+(self.y-playerbullet.y)**2<=120 and self.st==1: can.delete(self.id) self.x = 1200 #要改善 self.st = 0 if self.st==1 : enemy_count += 1 if enemy_count == 0: gameClear() win.destroy(self.id)
class EnemyBullet:
def __init__(self, x, y): self.x = x self.y = y self.draw() def draw(self): self.id = can.create_rectangle(self.x, self.y, self.x+20, self.y+30, fill="white") def collision(self): enemy_count = 0 if (self.x-player.x)**2+(self.y-player.y)**2<=120: can.delete(self.id) self.x = 0
win = tk.Tk()
win.title("シューティング")
win.bind("<KeyPress-Right>", rightKeyPress)
win.bind("<KeyRelease-Right>", rightKeyRelease)
win.bind("<KeyPress-Left>", leftKeyPress)
win.bind("<KeyRelease-Left>", leftKeyRelease)
win.bind("<KeyPress-Up>", upKeyPress)
win.bind("<KeyRelease-Up>", upKeyRelease)
win.bind("<KeyPress-Down>", downKeyPress)
win.bind("<KeyRelease-Down>", downKeyRelease)
win.bind("<Button-1>", clicking)
menubar = tk.Menu(win)
win.configure(menu=menubar)
menubar.add_command(label="QUIT", underline=0, command=win.quit)
can = tk.Canvas(bg="black", width=1100, height=720)
can.pack()
def gameLoop():
can.delete("all")
player = Player(event_x, event_y)
enemy = []
for i in range(3):
for u in range(3):
enemy_xy = Enemy(random.randrange(700, 1000, 20), random.randrange(100, 600, 35), 1)
enemy.append(enemy_xy)
win.after(50, gameLoop)
gameLoop()
win.mainloop()
試したこと
event_xを使わないコードを考えましたがわかりませんでした
回答1件
あなたの回答
tips
プレビュー