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

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

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

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

Python

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

Q&A

解決済

1回答

982閲覧

pygameでシューティングゲーム作成。自機が動かない。

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/03/01 09:37

前提・実現したいこと

pygameでシューティングゲームを作っています。

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

クラス継承で自機と敵機の動きを設定しているのですが、敵機は動くのに自機は動きません。
同じように暮らす継承しているはずなのですがなぜ自機だけ動かないのでしょうか?

該当のソースコード

Python3

1import pygame 2from pygame.locals import * 3import sys 4 5SCREEN = Rect(0, 0, 700, 500) 6 7 8#Player and Enemy 9class Flyer(pygame.sprite.Sprite): 10 def __init__(self, filename, x, y, vx, vy): 11 pygame.sprite.Sprite.__init__(self) 12 self.image = pygame.image.load(filename).convert_alpha() 13 w = self.image.get_width() 14 h = self.image.get_height() 15 self.rect = Rect(x, y, w, h) 16 self.vx = vx 17 self.vy = vy 18 def draw(self, screen): 19 screen.blit(self.image, self.rect) 20 21class Player(Flyer): 22 def __init__(self, filename, x, y, vx, vy): 23 super().__init__(filename, x, y, vx, vy) 24 def move(self): 25 pressed_key = pygame.key.get_pressed() 26 if pressed_key[K_LEFT]: 27 player.rect.move_ip(-self.vx, 0) 28 if pressed_key[K_RIGHT]: 29 player.rect.move_ip(self.vx, 0) 30 if pressed_key[K_UP]: 31 player.rect.move_ip(0, -self.vy) 32 if pressed_key[K_DOWN]: 33 player.rect.move_ip(0, self.vy) 34 self.rect = self.rect.clamp(SCREEN) 35 36class Enemy(Flyer): 37 def __init__(self, filename, x, y, vx, vy): 38 super().__init__(filename, x, y, vx, vy) 39 def move(self): 40 self.rect.move_ip(self.vx, self.vy) 41 self.rect = self.rect.clamp(SCREEN) 42 43#Main 44def main(): 45 pygame.init() 46 screen = pygame.display.set_mode((700, 500)) 47 pygame.display.set_caption("Shooting") 48 player = Player("player.jpg", 350, 400, 5, 5) 49 enemy1 = Enemy("enemy.jpg", 100, 100, 5, 0) 50 clock = pygame.time.Clock() 51 52 while 1: 53 clock.tick(30) 54 screen.fill((0, 0, 0)) 55 56 enemy1.move() 57 player.draw(screen) 58 enemy1.draw(screen) 59 60 pygame.display.update() 61 62 for event in pygame.event.get(): 63 if event.type == QUIT: 64 pygame.quit() 65 sys.exit() 66 if event.type == KEYDOWN: 67 if event.key == K_ESCAPE: 68 pygame.quit() 69 sys.exit() 70 71if __name__ == "__main__": 72 main() 73 74 75

補足情報(FW/ツールのバージョンなど)

pygame:最新版

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

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

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

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

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

guest

回答1

0

ベストアンサー

1.main関数にプレイヤーを動かすコードがない

Python

1def main(): 2 # 略 3 while 1: 4 # 略 5 player.move() # これが必要なのでは? 6 enemy1.move() 7 # 略

2.Player::move関数、player.ではなくself.では?

Python

1class Player(Flyer): 2 # 略 3 def move(self): 4 pressed_key = pygame.key.get_pressed() 5 if pressed_key[K_LEFT]: 6 #player.rect.move_ip(-self.vx, 0) 7 self.rect.move_ip(-self.vx, 0) 8 # 略

投稿2018/03/01 09:49

can110

総合スコア38262

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

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

退会済みユーザー

退会済みユーザー

2018/03/02 03:40

ありがとうございます。ちゃんと動きました。 初めはwhileのなかに、 pressed_key = pygame.key.get_pressed() if pressed_key[K_LEFT]: player.rect.move_ip(-self.vx, 0) if pressed_key[K_RIGHT]: player.rect.move_ip(self.vx, 0) if pressed_key[K_UP]: player.rect.move_ip(0, -self.vy) if pressed_key[K_DOWN]: player.rect.move_ip(0, self.vy) を書いていたのですが(その時はちゃんと動きました)、画面の枠内に動きを制限したかったので、クラス化した時にそのままコピペしていたことが原因でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問