質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

解決済

pygame でobjectが描画されない

siber
siber

総合スコア3

Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2回答

0評価

0クリップ

299閲覧

投稿2021/11/09 05:19

編集2021/11/09 11:40

前提・実現したいこと

pythonで簡単なゲームを作っています。
pygame zeroを使用しコードを書いています。
playerから物(ほね)を投げるコードを書きたいと思っています。(シューティングのようなもの)

発生している問題・エラーメッセージ

骨をplayerから投げることを実現したいのですが座標が更新されず描画されません。
一度playerの座標に表示され、消えてしまいます。

該当のソースコード

以下が該当コード部分です。

python

class Obj(Actor): def __init__(self, x, y, angle, num): Actor.__init__(self, dogs[num].imagename, (x, y)) self.hp = dogs[num].hp self.num = num self.count = 0 self.angle = angle class Bone(Obj): def update(self): self.x, self.y = shootBone(self.pos, self.angle, 8) hitbox = Rect((self.x-15, self.y-15), (30, 30)) for sp in objects: if sp.hp == 99: continue if sp.colliderect(hitbox): self.x = OUTSIDE sp.hp -= 1 break def shootBone(pos, angle, speed): # 角度と速さから次の座標を返す x, y = pos rad = math.radians(angle) x += speed * (math.cos(rad)) y += speed * (math.sin(rad)) return int(x), int(y) def draw(): # 描画部分 screen.clear() if titlemode == True: screen.draw.text("game start", left=150, top=240, fontsize=64, color="YELLOW") else: for sp in objects: sp.draw() if gameover: screen.draw.text("game over", left=150, top=240, fontsize=64, color="YELLOW")

コード全体

python

import pgzrun import random import time import math WIDTH = 500 HEIGHT = 500 score = 0 OUTSIDE = 1000 gameover = False titlemode = True start = 0 class Charclass: def __init__(self, filename, hp): self.imagename = filename self.hp = hp char = [] # キャラの追加 char.append(Charclass("human.png", 999)) char.append(Charclass("dog.png", 1)) char.append(Charclass("bone.png", 1)) class Obj(Actor): # objectの基本クラス def __init__(self, x, y, angle, num): Actor.__init__(self, char[num].imagename, (x, y)) self.hp = char[num].hp self.num = num self.count = 0 self.angle = angle class Dog(Obj): #犬クラス def update(self): # 円形に動く rad = math.radians(self.count - 100) self.y = (HEIGHT / 2) + (math.sin(rad) * 200) self.x = (HEIGHT / 2) + (math.cos(rad) * 200) class Bone(Obj): # 骨クラス def update(self): self.x, self.y = shootBone(self.pos, self.angle, 8) hitbox = Rect((self.x-15, self.y-15), (30, 30)) for sp in objects: if sp.hp == 999: # playerなら無視 continue if sp.colliderect(hitbox):# player以外で当たっていれば self.x = OUTSIDE sp.hp -= 1 break class Player(Obj): def update(self): # キーボード操作 if keyboard.up: self.y -= 4 if keyboard.down: self.y += 4 if keyboard.left: self.x -= 4 if keyboard.right: self.x += 4 if self.x < 35: self.x = 35 if self.y < 35: self.y = 35 if self.x > (WIDTH-35): self.x = WIDTH-35 if self.y > (HEIGHT-35): self.y = HEIGHT-35 if keyboard.space and (self.count % 16) == 0: # 骨を投げる objects.append(Bone(self.x, self.y, 180, 2)) objects.append(Bone(self.x, self.y, 0, 2)) objects.append(Bone(self.x, self.y, -90, 2)) def shootBone(pos, angle, speed): x, y = pos rad = math.radians(angle) x += speed * (math.cos(rad)) y += speed * (math.sin(rad)) return int(x), int(y) objects = [Player(400, 400, 0, 0), Dog(20, 20, 0, 1)] def draw(): screen.clear() # screen.draw.text("Time:" + str(start), (10, 10), color="white") if titlemode == True: screen.draw.text("dog game", left=150, top=240, fontsize=64, color="YELLOW") else: for sp in objects: sp.draw() if gameover: screen.draw.text("game over", left=150, top=240, fontsize=64, color="YELLOW") def update(): global titlemode, start, objects, gameover start += 1 if titlemode: if keyboard.space: titlemode = False if gameover: return for sp in objects: if start == 1000: gameover = True sp.update() sp.count += 1 if sp.hp <= 0: sp.x = OUTSIDE if sp.x < -35 or sp.x > (HEIGHT+35) or sp.y < -35 or sp.y > (WIDTH+35): objects.remove(sp) pgzrun.go()

試したこと

骨を投げた後の座標をprintしてみたのですが1回しか表示されませんでした。骨はobjectを入れるリストには入っていました。

pygame zero については触って2日ほどでわからないことが多いので助けていただくと幸いです。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Pygame

Pygameは、ビデオゲームの製作用に設計されたクロスプラットフォームのPythonモジュールセットです。Pythonでコンピューターグラフィックスと音声を扱うためのライブラリが含まれています。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。