[コード】pygame 学習
効果
コード
import pygame
import random
from pygame.locals import *
# Pygame provides a base class called Sprites, for drawing purposes. surface is considered a blank sheet of paper, and Rects are representations of rectangular areas in Surface.
class Player(pygame.sprite:)
def __init__(self):
super(Player, self). __init__()
self.image = pygame.image.load('jet.png').convert()
self.image.set_colorkey((255, 255, 255), RLEACCEL)
self.rect = self.image.get_rect()
# Define the keys
def update(self, pressed_keys):
if pressed_keys[K_UP]:
self.rect.move_ip(0, -2)
if pressed_keys[K_DOWN]:
self.rect.move_ip(0, 2)
if pressed_keys[K_LEFT]:
self.rect.move_ip(-2, 0)
if pressed_keys[K_RIGHT]:
self.rect.move_ip(2, 0)
# out of screen range to correct
if self.rect.left < 0:
self.rect.left = 0
elif self.rect.right > 800:
self.rect.right = 800
if self.rect.top <= 0:
self.rect.top = 0
elif self.rect.bottom >= 600:
self.rect.bottom = 600
# Define the enemy class
class Enemy(pygame.sprite:)
def __init__(self):
super(Enemy, self). __init__()
self.image = pygame.image.load('missile.png').convert()
self.image.set_colorkey((255, 255, 255), RLEACCEL)
self.rect = self.image.get_rect(
center=(random.randint(820, 900), random.randint(0, 600)))
self.speed = random.randint(1, 2)
def update(self):
self.rect.move_ip(-self.speed, 0)
# If out of bounds, remove and not rendered again
if self.rect.right < 0:
self.kill()
# Define the background class
class Cloud(pygame.sprite:)
def __init__(self):
super(Cloud, self). __init__()
self.image = pygame.image.load('cloud.png').convert()
self.image.set_colorkey((0, 0, 0), RLEACCEL)
self.rect = self.image.get_rect(center=(
random.randint(820, 900), random.randint(0, 600))
)
def update(self):
self.rect.move_ip(-2, 0)
if self.rect.right < 0:
self.kill()
# Initialize pygame
pygame.init()
# Create a canvas and pass the width and height
screen = pygame.display.set_mode((800, 600))
# Create custom events
ADDENEMY = pygame.USEREVENT + 1
pygame.time.set_timer(ADDENEMY, 1000)
ADDCLOUD = pygame.USEREVENT + 2
pygame.time.set_timer(ADDCLOUD, 1000)
# Create a class
player = Player()
background = pygame.Surface(screen.get_size())
background.fill((135, 206, 250))
# Group is a collection of Sprites
enemies = pygame.sprite.Group()
clouds = pygame.sprite.Group()
all_sprites = pygame.sprite.Group()
all_sprites.add(player)
# The main game loop
running = True
while running:
# Iterate through the event queue
for event in pygame.event.get():
# Detect KEYDOWN events: KEYDOWN is a constant defined in pygame.locals, which is imported at the beginning of the pygame.locals file
if event.type == KEYDOWN:
# If Esc is pressed then the main loop terminates
if event.key == K_ESCAPE:
running = False
# Detect QUIT: If QUIT, terminate main loop
elif event.type == QUIT:
running = False
elif event.type == ADDENEMY:
new_enemy = Enemy()
enemies.add(new_enemy)
all_sprites.add(new_enemy)
elif event.type == ADDCLOUD:
new_cloud = Cloud()
all_sprites.add(new_cloud)
clouds.add(new_cloud)
screen.blit(background, (0, 0))
pressed_keys = pygame.key.get_pressed()
player.update(pressed_keys)
enemies.update()
clouds.update()
for entity in all_sprites:
screen.blit(entity.image, entity.rect)
if pygame.sprite.spritecollideany(player, enemies):
player.kill()
pygame.display.flip()
ナレッジポイント
ここでは簡単な説明しかしていませんので、自分で理解してください。具体的な内容は末尾のリンク先を参照するか、わからない場合は
ブリット&フリップ
blit() は、作成した Surface を別の Surface に Blit(描画)します。blit() は、描画する Surface とソース Surface の座標の 2 つの引数を取ります。フリップは最後のフリップから画面全体を更新し、フリップの間に行われた変更が画面に表示されます。
ユーザー入力
pygameのイベントメソッドの1つ、pygame.event.get_pressed()です。get_pressed()メソッドは、すべてのキーストローク・イベントの辞書を含むキューを返し、それをメインループに入れることで、各フレームのキーストロークを取得することができます。
スプライト
スプライトは、画面上のものを2次元で表現したものです。基本的にスプライトは画像であり、Pygameはスプライトという基底クラスを提供し、画面に表示したいオブジェクトの1つまたは複数のグラフィック表現を含むように拡張するために使用されます。
グループ
GroupsはSpriteのコレクションで、sprite.Groupsには衝突や更新を助ける組み込みメソッドがいくつかあるので、この方法が推奨されます。スプライトを追加するには、add()を使用します。
イベントのカスタマイズ
数秒ごとに敵のバッチを作成するカスタムイベントを作成します。このイベントは、キーストロークや終了イベントをリッスンするのと同じ方法でリッスンすることになります。
コンフリクト
pygame.sprite は関数 spritecollideany() を提供します。これは Sprite オブジェクトと Sprite.Group を受け取り、Sprite オブジェクトが Sprite グループ内の他の Sprit と衝突しているかどうかを検出するものです。
if pygame.sprite.spritecollideany(player,enemies):
player.kill()
画像
Surfaceオブジェクトを画像に置き換えたいと思います。pygame.image.load()を使って画像へのパスをインポートします。load()メソッドはSurfaceオブジェクトを返します。次に、このSurfaceオブジェクトに対してconvert()を呼び、コピーを作成することで、より速く画面に描画することができます。
set_colorkeyは画像の色を設定するのに使います。そうしないとPygameは画像を透明に設定します。ここでは、平面の背景色と同じ白を選びました。rleaccelはオプションのパラメータで、非アクセラレーションモニタでPyGameのレンダリングを速くするのに役立ちます。
class Player(pygame.sprite:)
def __init__(self):
super(Player,self). __init__()
self.image = pygame.image.load('jet.png').convert()
self.image.set_colorkey((255,255,255),RLEACCEL)
self.rect = self.image.get_rect()
参考リンク
関連
-
Pythonです。pandasのiloc, loc, ixの違いと連携について
-
PythonでクロールするときにAttributeError: 'NoneType' オブジェクトに 'find_all' 属性がないのを解決する
-
Ubuntu pip AttributeError: 'module' オブジェクトに '_main' 属性がない。
-
AttributeError: モジュール 'time' には属性 'clock' がありません。
-
gensim: queue という名前のモジュールがありません。
-
知っておきたいPythonの一行コード50選
-
タートル共通機能関数
-
アルゴリズム図 1.2 二項対立型ルックアップ TypeError: リストのインデックスは整数またはスライスでなければならず、float ではありません 解答
-
TypeError: -: 'list' および 'list' のオペランド型が未サポート 問題解決
-
Python2.7のエンコード問題:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position... 解決方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Abort trap: 6エラーに対するPythonの解決策
-
Solve 'DataFrame' オブジェクトに 'sort' 属性がない。
-
SyntaxError: 構文が無効です。
-
ORMにおけるトランザクションとロック、Ajaxによる非同期リクエストと部分リフレッシュ、Ajaxによるファイルアップロード、日時指定Json、マルチテーブルクエリブックのシステム
-
Pythonインストールモジュールエラー AttributeError: モジュール 'pip' には 'main' という属性がありません。
-
Logistics Regressionにおけるcoef_とintercept_の具体的な意味についてsklearnで解説します。
-
TypeError: バイトライクオブジェクトで文字列パターンを使用できない
-
'dict_items' オブジェクトは添え字を付けることができません。
-
Python で実行 TypeError: + でサポートされていないオペランド型: 'float' および 'str'.
-
[解決済み] です。TypeError: read() missing 1 required positional argument: 'filename'.