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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

Python

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

Q&A

解決済

1回答

858閲覧

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

ptk3

総合スコア27

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/05/18 15:45

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

■質問(やりたいこと)
「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で探して練習中

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

◇過去の質問で参考になりそうなもの。
0. pygame spriteで画像ではなく図形を扱いたい(動かしたい)
0. pygameでスペースを押すと、上に動く四角を表示させたい。


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

Python

1# -*- coding: utf-8 -*- 2from sys import exit 3import math 4from random import randint 5from itertools import cycle 6import pygame 7from pygame.locals import * 8 9pygame.init() 10screen = pygame.display.set_mode((640, 480)) 11pygame.display.set_caption("A126871") 12 13#クラス名は大文字で 14class Fire(object): 15 def __init__(self, x, y): 16 super().__init__() 17 self.w = 10 18 self.h = 10 19 self.rect = Rect(x, y, self.w, self.h) 20 # x方向の増分は固定値:5 21 self.vx = 5 22 # 描画色 23 self.color = (randint(0, 255), randint(0, 255), randint(0, 255)) 24 25 def move(self): 26 radians = self.rect.x % 360 27 vy = 2 * math.sin(math.radians(radians)) * self.h 28 # 移動 29 self.rect.move_ip(self.vx, vy) 30 31 def draw(self): 32 pygame.draw.rect(screen, self.color, self.rect) 33 34 @property 35 def is_destroy(self) -> bool: 36 return any([self.rect.x < -self.w, self.rect.y < -self.h, self.rect.x > 640, self.rect.y > 480]) 37 #以下の5行と判定は同じです。 38 #if self.rect.x < -self.w or self.rect.y < -self.h: 39 # return True 40 #if self.rect.x > 640 or self.rect.y > 480: 41 # return True 42 #return False 43 44 def __str__(self): 45 return ','.join(map(str, [self.rect.x, self.rect.y, self.rect.width, self.rect.height, self.is_destroy])) 46 47def application_exit(): 48 pygame.quit() 49 exit() 50 51def main(): 52 clock = pygame.time.Clock() 53 note_list = [] 54 # 生成間隔:20、数値が小さいほど生成間隔が短くなります。 55 t = cycle(list(range(20))) 56 while True: 57 clock.tick(30) 58 screen.fill((0, 0, 0)) 59 # 時間経過を元に生成 60 i = next(t) 61 if i == 0: 62 note_list.append(Fire(0, 40)) 63 64 #生成したオブジェクトに対して移動と描画を行う 65 for note in note_list: 66 note.move() 67 note.draw() 68 #リストからスクリーン範囲外の物を削除 69 note_list = list(filter(lambda x: not x.is_destroy, note_list)) 70 pygame.display.update() 71 for event in pygame.event.get(): 72 if event.type == QUIT: 73 application_exit() 74 if event.type == KEYDOWN: 75 if event.key == K_ESCAPE: 76 application_exit() 77 78if __name__ == "__main__": 79 main() 80

◇参考情報
0. 9.2.3. 三角関数
0. itertools.cycle

投稿2018/05/20 18:44

編集2018/05/26 18:09
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ptk3

2018/05/26 14:24

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

2018/05/27 12:31

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問