#!/usr/bin/python # -*- coding: utf-8 -*- u""" Pygame fullscreen Sample. draw 64x64 Sprite x 160 + BG x 2 Windows10 x64 20H2 + Python 3.8.7 x64 + pygame 2.0.1 (SDL 2.0.14) """ import pygame from pygame.locals import * import math import os import sys SCR_RECT = Rect(0, 0, 640, 480) mode_v = 0 class MySprite(pygame.sprite.Sprite): u"""スプライトクラス.""" def __init__(self, img, x, y, vx, vy): u"""初期化処理.""" pygame.sprite.Sprite.__init__(self) # self.image = pygame.image.load(filename).convert_alpha() self.image = img self.w = self.image.get_width() self.h = self.image.get_height() self.whf = self.w / 2 self.hhf = self.h / 2 self.fpx = float(x) self.fpy = float(y) self.fpvx = float(vx) self.fpvy = float(vy) self.rect = Rect(int(self.fpx - self.whf), int(self.fpy - self.hhf), self.w, self.h) def update(self): u"""毎フレーム呼ばれる処理.""" self.fpx += self.fpvx self.fpy += self.fpvy self.rect = Rect(int(self.fpx - self.whf), int(self.fpy - self.hhf), self.w, self.h) if self.rect.left <= 0 or self.rect.right >= SCR_RECT.width: self.fpvx *= -1 if self.rect.top <= 0 or self.rect.bottom >= SCR_RECT.height: self.fpvy *= -1 # self.rect = self.rect.clamp(SCR_RECT) def draw_bg(bx, by, bg, screen): u"""BG描画処理.""" bx = int(bx) by = int(by) for ofs in [[0, 0], [512, 0], [0, -512], [512, -512]]: screen.blit(bg, (bx + ofs[0], by + ofs[1])) def main(): u"""メイン処理.""" global mode_v fullscreen_flag = False running = True cap = "" # pygame初期化 pygame.init() if True: mode_v = pygame.DOUBLEBUF screen = pygame.display.set_mode(SCR_RECT.size, mode_v) else: mode_v = pygame.OPENGL | pygame.DOUBLEBUF screen = pygame.display.set_mode(SCR_RECT.size, mode_v, vsync=1) pygame.display.set_caption("Pygame Full Screen Demo") # フォント指定 font = pygame.font.Font("res/Vegur-Bold.otf", 18) # BG画像読み込み bg1 = pygame.image.load("res/bg1.png").convert() bg2 = pygame.image.load("res/bg2.png").convert_alpha() # スプライトグループを作成してスプライトクラスに割り当て sprgrp = pygame.sprite.OrderedUpdates() # スプライトを作成 pmax = 160 sprimg = pygame.image.load("res/ufo.png").convert_alpha() # ckey = sprimg.get_at((0,0)) # sprimg.set_colorkey(ckey) x = SCR_RECT.width / 2 y = SCR_RECT.height / 2 for i in range(pmax): rad = math.radians(i * 360 / pmax) vx = 3.0 * math.cos(rad) vy = 3.0 * math.sin(rad) sprgrp.add(MySprite(sprimg, x, y, vx, vy)) # BGM start pygame.mixer.music.load("res/bgm32.ogg") pygame.mixer.music.play(-1) drvname = "DRIVER: %s" % (pygame.display.get_driver()) sdlver = "SDL ver: %d.%d.%d" % (pygame.get_sdl_version()) bgx = [0, 0] bgy = [0, 0] sprdraw = True bg0draw = True bg1draw = True frame_count = 0 clock = pygame.time.Clock() # main loop while running: # キー入力に対する処理 for event in pygame.event.get(): if event.type == QUIT: running = False if event.type == KEYDOWN: if event.key == K_ESCAPE or event.key == K_q: # ESCキーで終了 running = False elif event.key == K_1: # フルスクリーンモードへの切り替え fullscreen_flag = not fullscreen_flag pygame.display.toggle_fullscreen() drvname = "DRIVER: %s" % (pygame.display.get_driver()) elif event.key == K_2: # スプライト描画のon/off切り替え sprdraw = not sprdraw elif event.key == K_3: # BG0描画のon/off切り替え bg0draw = not bg0draw elif event.key == K_4: # BG1描画のon/off切り替え bg1draw = not bg1draw # BG bgx[0] = -64 + (64 * math.cos(math.radians(frame_count))) bgx[1] = -128 + (128 * math.cos(math.radians(frame_count))) bgy[0] = (bgy[0] + 2) % 512 bgy[1] = (bgy[1] + 6) % 512 if bg0draw: draw_bg(bgx[0], bgy[0], bg1, screen) if bg1draw: draw_bg(bgx[1], bgy[1], bg2, screen) # スプライト座標更新 sprgrp.update() # スプライト描画 if sprdraw: sprgrp.draw(screen) # テキスト描画 strdt = [ cap, drvname, sdlver, "1: FULL/WDW", "2: SPR ON/OFF", "3: BG0 ON/OFF", "4: BG1 ON/OFF", "ESC,Q: EXIT" ] fontcolor = (255, 255, 255) fy = 8 for s in strdt: screen.blit(font.render(s, True, fontcolor), (16, fy)) fy += 18 # ウインドウタイトルの文字列を設定 if not fullscreen_flag: pygame.display.set_caption(cap) # 60fpsになるよう時間待ち clock.tick(60) # clock.tick_busy_loop(60) # pygame.display.update() pygame.display.flip() cap = '%5.2f FPS' % clock.get_fps() frame_count = frame_count + 1 pygame.quit() sys.exit() if __name__ == "__main__": main()