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

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

ただいまの
回答率

90.33%

  • Python

    9269questions

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

  • Python 3.x

    7441questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

【Python】複数のオブジェクト・スプライトグループについて

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 226

ptk3

score 15

初心者な質問になります!

■質問(やりたいこと)
「Pygame」のスプライトグループを用いた描画で
class fireという「弾」について定義し、その座標を関数的に動かしたい。
無数に増えていく「弾」に(Img,x,y)の値を入れ、無数の「弾」が曲線を描くようにしたい。

⇒「無数の」はどのように書けばよいのでしょうか?

■現状
WEB検索でいろいろ拾って、
1:定点を複数用意すること
2:1つの弾(画像)を関数的に動かすこと
上記2つはできました。

def init(self,filename,x,y):
(省略)
fire1 = (Img,0,0)
fire2 = (Img,50,50)

上記のように手動でできても「無数の」というのが分からず、いくつかWEBで探しても見つけきれませんでした。

※補足=================
■スキルレベル
PythonはPaizaなどでLoop処理やリストまで、勉強したばかりで「クラス」「オブジェクト指向」などがふわっとしており、よく理解してません。

■本来のゴール
「MIDIキーボードを用いて、リアルタイムに音符などを飛ばす」という
趣味用のアプリを制作したい。
⇒弾幕シューティングが似たような挙動なので、WEBで探して練習中

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

「無数の」はどのように書けばよいのでしょうか?

ループ内で時間経過を元にして、fireを生成すればよいかと。
無限に生成するとメモリが枯渇するため、生成したfireの生存管理は必須です。
描画範囲外から出たら、リストから削除してくださいな。

◇過去の質問で参考になりそうなもの。

  1. pygame spriteで画像ではなく図形を扱いたい(動かしたい)
  2. pygameでスペースを押すと、上に動く四角を表示させたい。

結構悩んでらっしゃるみたいなので、サンプルコードを添付します。
こんな感じで次 x,y座標のどこに位置するかを求めればよいのではないでしょうか。

# -*- coding: utf-8 -*-
from sys import exit
import math
from random import randint
from itertools import cycle
import pygame
from pygame.locals import *

pygame.init()
screen = pygame.display.set_mode((640, 480))
pygame.display.set_caption("A126871")

#クラス名は大文字で
class Fire(object):
    def __init__(self, x, y):
        super().__init__()
        self.w = 10
        self.h = 10
        self.rect = Rect(x, y, self.w, self.h)
        # x方向の増分は固定値:5
        self.vx = 5
        # 描画色
        self.color = (randint(0, 255), randint(0, 255), randint(0, 255))

    def move(self):
        radians = self.rect.x % 360
        vy = 2 * math.sin(math.radians(radians)) * self.h
        # 移動
        self.rect.move_ip(self.vx, vy)

    def draw(self):
        pygame.draw.rect(screen, self.color, self.rect)

    @property
    def is_destroy(self) -> bool:
        return any([self.rect.x < -self.w, self.rect.y < -self.h, self.rect.x > 640, self.rect.y > 480])
        #以下の5行と判定は同じです。
        #if self.rect.x < -self.w or self.rect.y < -self.h:
        #    return True
        #if self.rect.x > 640 or self.rect.y > 480:
        #    return True
        #return False

    def __str__(self):
        return ','.join(map(str, [self.rect.x, self.rect.y, self.rect.width, self.rect.height, self.is_destroy]))

def application_exit():
    pygame.quit()
    exit()

def main():
    clock = pygame.time.Clock()
    note_list = []
    # 生成間隔:20、数値が小さいほど生成間隔が短くなります。
    t = cycle(list(range(20)))
    while True:
        clock.tick(30)
        screen.fill((0, 0, 0))
        # 時間経過を元に生成
        i = next(t)
        if i == 0:
            note_list.append(Fire(0, 40))

        #生成したオブジェクトに対して移動と描画を行う
        for note in note_list:
            note.move()
            note.draw()
        #リストからスクリーン範囲外の物を削除
        note_list = list(filter(lambda x: not x.is_destroy, note_list))
        pygame.display.update()
        for event in pygame.event.get():
            if event.type == QUIT:
                application_exit()
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    application_exit()

if __name__ == "__main__":
    main()


◇参考情報

  1. 9.2.3. 三角関数
  2. itertools.cycle

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/26 23:24

    回答ありがとうございます!!
    fireを生成し、無数に出現させることはできました!
    しかしTime(tとする)を変数として、関数で描きたい(x = a + t*sinΘなど)が実現できず…そもそもTimeが上手く扱えてないようです。。
    オブジェクト出現をt=0として単調に増加するtを扱いたい場合
    tは「self.time」ということになるのでしょうか・・?

    ※試行錯誤して数日たってしまいましたが…
    改めて記載できるコードを作成して詳細は改めて質問します!

    キャンセル

  • 2018/05/27 21:31

    回答の追記ありがとうございました!
    現在、動作と書き方を比較していて、初めて納得できました!
    本やWEB上のものではよくわからなかったので、大変感謝してます!
    頂いた書き方を基に、自作のものにも応用してみたいと思います!

    キャンセル

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • Python

    9269questions

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

  • Python 3.x

    7441questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。