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

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

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

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

Python

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

Q&A

0回答

1041閲覧

pygame_画面の更新について

soukenbicha

総合スコア2

Pygame

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

Python

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

0グッド

0クリップ

投稿2022/02/14 12:42

pythonの初心者です。自身であれこれ試してはみたのですが、どうにも上手く行きません。
教えて下さいm(__)mよろしくお願い致します。
PyActionのkey_handlerメソッドにて「s」キーを押したら図の様に左上の一マスを空白にしたいのですが、
コードの様に値を代入した後(self.map.back[0][0] = 0) どの様に記述すれば、そうなってくれるかが判りませんでした。お手数をお掛けしますが、どうか教えて下さい。

イメージ説明

import pygame from pygame.locals import * import os import sys SCR_RECT = Rect(0, 0, 500, 500) class PyAction: def __init__(self): pygame.init() screen = pygame.display.set_mode(SCR_RECT.size) pygame.display.set_caption("マップをロード") # 画像のロード Python.left_image = load_image("python.png", -1) # 左向き Python.right_image = pygame.transform.flip(Python.left_image, 1, 0) # 右向き Block.image = load_image("block.png", -1) # マップのロード self.map = Map([ [2,2,2,2,2,2,2,2,2,2], [2,0,0,0,0,0,0,0,0,2], [2,0,0,0,0,0,0,0,0,2], [2,0,0,0,0,0,0,0,0,2], [2,0,0,0,0,0,0,0,0,2], [2,0,0,0,0,0,0,0,0,2], [2,0,0,0,0,0,0,0,0,2], [2,0,0,0,0,0,0,0,0,2], [2,0,0,0,0,0,0,0,0,2], [2,2,2,2,2,2,2,2,2,2] ]) # メインループ clock = pygame.time.Clock() while True: clock.tick(60) self.update() self.draw(screen) pygame.display.update() self.key_handler() def update(self): self.map.update() def draw(self, screen): # スプライトをマップサーフェイスに描画 # この時点では画面に表示されない self.map.draw() # マップサーフェイスをスクリーンに描画 screen.blit(self.map.surface, (0,0), (0,0,SCR_RECT.width, SCR_RECT.height)) def key_handler(self): for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == KEYDOWN and event.key == K_ESCAPE: pygame.quit() sys.exit() elif event.type == KEYDOWN and event.key == K_s: self.map.back[0][0] = 0 print(self.map.back) class Python(pygame.sprite.Sprite): """パイソン""" MOVE_SPEED = 2.5 # 移動速度 JUMP_SPEED = 6.0 # ジャンプの初速度 GRAVITY = 0.2 # 重力加速度 MAX_JUMP_COUNT = 2 # ジャンプ段数の回数 def __init__(self, pos, blocks): pygame.sprite.Sprite.__init__(self, self.containers) self.image = self.right_image self.rect = self.image.get_rect() self.rect.x, self.rect.y = pos[0], pos[1] # 座標設定 self.blocks = blocks # 衝突判定用 # ジャンプ回数 self.jump_count = 0 # 浮動小数点の位置と速度 self.fpx = float(self.rect.x) self.fpy = float(self.rect.y) self.fpvx = 0.0 self.fpvy = 0.0 # 地面にいるか? self.on_floor = False def update(self): """スプライトの更新""" # キー入力取得 pressed_keys = pygame.key.get_pressed() # 左右移動 if pressed_keys[K_RIGHT]: self.image = self.right_image self.fpvx = self.MOVE_SPEED elif pressed_keys[K_LEFT]: self.image = self.left_image self.fpvx = -self.MOVE_SPEED else: self.fpvx = 0.0 # ジャンプ if pressed_keys[K_SPACE]: if self.on_floor: self.fpvy = - self.JUMP_SPEED # 上向きに初速度を与える self.on_floor = False self.jump_count = 1 elif not self.prev_button and self.jump_count < self.MAX_JUMP_COUNT: self.fpvy = -self.JUMP_SPEED self.jump_count += 1 # 速度を更新 if not self.on_floor: self.fpvy += self.GRAVITY # 下向きに重力をかける self.collision_x() # X方向の衝突判定処理 self.collision_y() # Y方向の衝突判定処理 # 浮動小数点の位置を整数座標に戻す # スプライトを動かすにはself.rectの更新が必要! self.rect.x = int(self.fpx) self.rect.y = int(self.fpy) # ボタンのジャンプキーの状態を記録 self.prev_button = pressed_keys[K_SPACE] def collision_x(self): """X方向の衝突判定処理""" # パイソンのサイズ width = self.rect.width height = self.rect.height # X方向の移動先の座標と矩形を求める newx = self.fpx + self.fpvx newrect = Rect(newx, self.fpy, width, height) # ブロックとの衝突判定 for block in self.blocks: collide = newrect.colliderect(block.rect) if collide: # 衝突するブロックあり if self.fpvx > 0: # 右に移動中に衝突 # めり込まないように調整して速度を0に self.fpx = block.rect.left - width self.fpvx = 0 elif self.fpvx < 0: # 左に移動中に衝突 self.fpx = block.rect.right self.fpvx = 0 break # 衝突ブロックは1個調べれば十分 else: # 衝突ブロックがない場合、位置を更新 self.fpx = newx def collision_y(self): """Y方向の衝突判定処理""" # パイソンのサイズ width = self.rect.width height = self.rect.height # Y方向の移動先の座標と矩形を求める newy = self.fpy + self.fpvy newrect = Rect(self.fpx, newy, width, height) # ブロックとの衝突判定 for block in self.blocks: collide = newrect.colliderect(block.rect) if collide: # 衝突するブロックあり if self.fpvy > 0: # 下に移動中に衝突 # めり込まないように調整して速度を0に self.fpy = block.rect.top - height self.fpvy = 0 # 下に移動中に衝突したなら床の上にいる self.on_floor = True self.jump_count = 0 # ジャンプカウントをリセット elif self.fpvy < 0: # 上に移動中に衝突 self.fpy = block.rect.bottom self.fpvy = 0 break # 衝突ブロックは1個調べれば十分 else: # 衝突ブロックがない場合、位置を更新 self.fpy = newy # 衝突ブロックがないなら床の上にいない self.on_floor = False class Block(pygame.sprite.Sprite): """ブロック""" def __init__(self, pos): pygame.sprite.Sprite.__init__(self, self.containers) self.rect = self.image.get_rect() self.rect.topleft = pos class Map: """マップ(プレイヤーや内部のスプライトを含む)""" GS = 50 # グリッドサイズ def __init__(self, back): self.back = back # スプライトグループの登録 self.all = pygame.sprite.RenderUpdates() self.blocks = pygame.sprite.Group() Python.containers = self.all Block.containers = self.all, self.blocks # プレイヤーの作成 self.python = Python((300,200), self.blocks) # マップをロードしてマップ内スプライトの作成 self.load(self.back) # マップサーフェイスを作成 self.surface = pygame.Surface((10*self.GS, 10*self.GS)).convert() def draw(self): """マップサーフェイスにマップ内スプライトを描画""" self.surface.fill((0,0,0)) self.all.draw(self.surface) def update(self): """マップ内スプライトを更新""" self.all.update() def load(self, map): # マップからスプライトを作成 for i in range(10): for j in range(10): if map[i][j] == 2: Block((j*self.GS, i*self.GS)) # ブロック def load_image(filename, colorkey=None): """画像をロードして画像と矩形を返す""" filename = os.path.join("data", filename) try: image = pygame.image.load(filename) except pygame.error as message: print("Cannot load image:", filename) raise SystemExit(message) image = image.convert() if colorkey is not None: if colorkey == -1: colorkey = image.get_at((0,0)) image.set_colorkey(colorkey, RLEACCEL) return image if __name__ == "__main__": PyAction()

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

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

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

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

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.69%

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

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

質問する

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

Pygame

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

Python

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