0
0

More than 1 year has passed since last update.

pygameでゲームを作ってみる5<アニメーション編 Part.3>

Last updated at Posted at 2021-12-30

1. はじめに

プレーリードッグをランダムに動かすための旅に出た...
(きっとひょこひょこ動いてかわいいんだろうなという期待を胸に)

2. 進捗 

できること

・テキストを表示する
・残り時間をカウントし、表示する
・得点を計算し、表示する
・画像を表示する
・画像上をクリックしたときに「+1」を表示する
・画像上をクリックしたときに1点加える
・画像を上下に動かし続ける 
・残り時間が0になったときに画像の動きを止める
・画像が出現して消える間は1点しか獲得できないようにする

:sparkles:NEW:sparkles:
・画像をランダムに動かす

コード全文

import pygame
from pygame.locals import *
import sys
import random

Scr_rect = Rect(0, 0, 500, 500)

class DogSprite(pygame.sprite.Sprite):
    move_height = 100

    def __init__(self, filename, x, y, vx, vy):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(filename).convert()
        width = self.image.get_width()
        height = self.image.get_height()
        self.rect = Rect(x, y, width, height)
        self.y = y
        self.vx = vx
        self.vy = vy
        self.up = self.move_height
        self.down = self.up + self.move_height
        self.enabled = True
        self.frame_count = self.move_height* 2 / abs(self.vy)
        self.time = self.frame_count

    def move(self):
            if self.time >= self.frame_count:
                self.time = 0
                self.enabled = True

    def update(self):
        if self.time >= self.frame_count:
            self.enabled = False
            self.rect.top = self.y
            return

        else: 
            if self.time < self.frame_count // 2:
                dy = self.vy
            else:
                dy = -self.vy
            self.time += 1

        self.rect.top += dy

    def is_clicked(self, pos):
        if self.enabled and self.rect.collidepoint(pos):
            self.enabled = False
            return True

        return False

    def draw(self, screen):
        screen.blit(self.image, self.rect)

def main():
    pygame.init()
    cl = pygame.time.Clock()
    screen = pygame.display.set_mode(Scr_rect.size)
    pygame.display.set_caption("Game")

    font = pygame.font.SysFont(None, 78)
    font2 = pygame.font.SysFont(None, 45)
    font3 = pygame.font.SysFont(None, 30)
    text1 = font.render("Click!", True, (204, 102, 112))
    text2 = font2.render("+1", True, (0, 0, 0))
    click = 0
    score = 0
    n_frames = 0
    TIME_END = 20
    random1 = [random.randint(0, TIME_END*30) for i in range(10)]
    random2 = [random.randint(0, TIME_END*30) for i in range(10)]
    random3 = [random.randint(0, TIME_END*30) for i in range(10)]

    line = pygame.image.load("Game/line.png").convert()
    colorkey = line.get_at((0,0))
    line.set_colorkey(colorkey,RLEACCEL)
    #Spriteを作成
    dog1 = DogSprite("Game/dg.jpg", 50, 200, 0, -5)
    dog2 = DogSprite("Game/dg.jpg", 200, 200, 0, -3)
    dog3 = DogSprite("Game/dg.jpg", 350, 200, 0, -4)
    #Groupを作成
    group = pygame.sprite.RenderUpdates()
    group.add(dog1)
    group.add(dog2)
    group.add(dog3)

    while (1):
        screen.fill((102, 204, 194))
        screen.blit(text1, [170, 30])
        screen.blit(line,(50, 180))
        rest = TIME_END - (n_frames / 30)
        text4 = font3.render('time: {}'.format(round(rest,1)), True, (0, 0, 0))
        screen.blit(text4,[350,60])

        if n_frames in random1:
            dog1.move()

        if n_frames in random2:
            dog2.move()

        if n_frames in random3:
            dog3.move()

        if n_frames < 30 * TIME_END:
            group.update()

        group.draw(screen)

        for event in pygame.event.get():
            if event.type == QUIT:
               pygame.quit()
               sys.exit()

            if n_frames < 30 * TIME_END and event.type == MOUSEBUTTONDOWN and event.button == 1:
                if dog1.is_clicked(event.pos) or dog2.is_clicked(event.pos) or dog3.is_clicked(event.pos):
                    click = 9
                    score += 1

        text3 = font3.render('score : {}'.format(score), True, (0, 0, 0))
        screen.blit(text3, [350, 40] )

        if click > 0:
            pos = pygame.mouse.get_pos()
            screen.blit(text2, pos)
            click -= 1
        pygame.display.update()

        if n_frames < 30 * TIME_END:
             n_frames += 1

        cl.tick(30)

if __name__ == "__main__":
    main()

3. おわりに

ランダムに動くことで、さらにそれっぽくなってきた。楽しい。
今のままでは、キャラクターが隠れている部分をクリックしても点が入ってしまう。そのため次回は、得点システムの改善をしたい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0