M14 | L9 – Interacțiunea cu utilizatorul

Astăzi vom afla despre:

  • Interfete pentru jocuri

Aplicațiile pe care le vom folosi sunt:

Replit, python

PROIECTE:

Jocuri

Click and Drag

import pygame                                                             # Setup

pygame.init()

screen = pygame.display.set_mode([800,600])

pygame.display.set_caption(„Click to draw”)

keep_going = True

RED = (255,0,0)                                                          # RGB color triplet for RED

radius = 15

while keep_going:                                                       # Game loop

for event in pygame.event.get():                      # Handling events

if event.type == pygame.QUIT:

keep_going = False

if event.type == pygame.MOUSEBUTTONDOWN:

spot = event.pos

pygame.draw.circle(screen, RED, spot, radius)

pygame.display.update()

#

Update display

pygame.quit()

#

Exit

Drag and paint

import pygame                                                             # Setup

pygame.init()

screen = pygame.display.set_mode([800,600]) pygame.display.set_caption(„Click and drag to draw”) keep_going = True

YELLOW = (255,255,0)                                            # RGB color triplet for YELLOW

radius = 15

mousedown = False

while keep_going:

 

# Game loop

for event in pygame.event.get():

# Handling events

if event.type

== pygame.QUIT:

 

keep_going = False

 

if event.type

== pygame.MOUSEBUTTONDOWN:

mousedown

= True

 

if event.type

== pygame.MOUSEBUTTONUP:

mousedown

= False

 

if mousedown:

 

# Draw/update graphics

spot = pygame.mouse.get_pos()

 

pygame.draw.circle(screen, YELLOW, spot, radius)

pygame.display.update()

# Update display

pygame.quit()

 

# Exit

Explozie de smiley

Versiunea 1:

# SmileyExplosion.py

import pygame

import random

BLACK = (0,0,0)

pygame.init()

screen = pygame.display.set_mode([800,600])

pygame.display.set_caption(„Smiley Explosion”)

mousedown = False

keep_going = True

clock = pygame.time.Clock()

pic = pygame.image.load(„CrazySmile.bmp”)

colorkey = pic.get_at((0,0))

pic.set_colorkey(colorkey)

sprite_list = pygame.sprite.Group()

class Smiley(pygame.sprite.Sprite):

    pos = (0,0)

    xvel = 1

    yvel = 1

    scale = 100

    def __init__(self, pos, xvel, yvel):

        pygame.sprite.Sprite.__init__(self)

        self.image = pic

        self.scale = random.randrange(10,100)

        self.image = pygame.transform.scale(self.image, (self.scale,self.scale))

        self.rect = self.image.get_rect()

        self.pos = pos

        self.rect.x = pos[0] – self.scale/2

        self.rect.y = pos[1] – self.scale/2

        self.xvel = xvel

        self.yvel = yvel

    def update(self):

        self.rect.x += self.xvel

        self.rect.y += self.yvel

        if self.rect.x <= 0 or self.rect.x > screen.get_width() – self.scale:

            self.xvel = -self.xvel

        if self.rect.y <= 0 or self.rect.y > screen.get_height() – self.scale:

            self.yvel = -self.yvel

while keep_going:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            keep_going = False

        if event.type == pygame.MOUSEBUTTONDOWN:

            mousedown = True

        if event.type == pygame.MOUSEBUTTONUP:

            mousedown = False

    screen.fill(BLACK)

    sprite_list.update()

    sprite_list.draw(screen)

    clock.tick(60)

    pygame.display.update()

    if mousedown:

        speedx = random.randint(-5, 5)

        speedy = random.randint(-5, 5)

        newSmiley = Smiley(pygame.mouse.get_pos(),speedx,speedy)

        sprite_list.add(newSmiley)

pygame.quit()

Versiunea 2:

# SmileyPop.py

import pygame

import random

BLACK = (0,0,0)

pygame.init()

screen = pygame.display.set_mode([800,600])

pygame.display.set_caption(„Pop a Smiley”)

mousedown = False

keep_going = True

clock = pygame.time.Clock()

pic = pygame.image.load(„CrazySmile.bmp”)

colorkey = pic.get_at((0,0))

pic.set_colorkey(colorkey)

sprite_list = pygame.sprite.Group()

class Smiley(pygame.sprite.Sprite):

    pos = (0,0)

    xvel = 1

    yvel = 1

    scale = 100

    def __init__(self, pos, xvel, yvel):

        pygame.sprite.Sprite.__init__(self)

        self.image = pic

        self.scale = random.randrange(10,100)

        self.image = pygame.transform.scale(self.image, (self.scale,self.scale))

        self.rect = self.image.get_rect()

        self.pos = pos

        self.rect.x = pos[0] – self.scale/2

        self.rect.y = pos[1] – self.scale/2

        self.xvel = xvel

        self.yvel = yvel

    def update(self):

        self.rect.x += self.xvel

        self.rect.y += self.yvel

        if self.rect.x <= 0 or self.rect.x > screen.get_width() – self.scale:

            self.xvel = -self.xvel

        if self.rect.y <= 0 or self.rect.y > screen.get_height() – self.scale:

            self.yvel = -self.yvel

while keep_going:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            keep_going = False

        if event.type == pygame.MOUSEBUTTONDOWN:

            if pygame.mouse.get_pressed()[0]:    # Regular left mouse button, draw

                mousedown = True

            elif pygame.mouse.get_pressed()[2]:  # Right mouse button, pop

                pos = pygame.mouse.get_pos()

                clicked_smileys = [s for s in sprite_list if s.rect.collidepoint(pos)]

                sprite_list.remove(clicked_smileys)

        if event.type == pygame.MOUSEBUTTONUP:

            mousedown = False

    screen.fill(BLACK)

    sprite_list.update()

    sprite_list.draw(screen)

    clock.tick(60)

    pygame.display.update()

    if mousedown:

        speedx = random.randint(-5, 5)

        speedy = random.randint(-5, 5)

        newSmiley = Smiley(pygame.mouse.get_pos(),speedx,speedy)

        sprite_list.add(newSmiley)

pygame.quit()

Provocare 1:

Începeți prin alegerea propriului triplet de culoare pe care să îl utilizați în programul DragDots.py. Apoi modificați programul pentru a desena puncte colorate aleatoriu, creând un triplet de trei numere aleatoare între 0 și 255 pe care să le folosiți ca culori. Apelați noua dvs. creație RandomPaint.py.

Provocare 2:

Lăsați utilizatorul să deseneze două sau mai multe culori consistente utilizând oricare dintre următoarele opțiuni:

  • Schimbați culoarea desenului curent de fiecare dată când utilizatorul apasă o tastă, fie la o culoare aleatorie de fiecare dată, fie la o culoare specifică pentru anumite taste (cum ar fi roșu pentru R, albastru pentru B și așa mai departe).
  • Desenați cu culori diferite pentru fiecare dintre butoanele mouse-ului (roșu pentru butonul stâng al mouse-ului, verde pentru butonul din mijloc și albastru pentru butonul drept al mouse-ului, de exemplu).
  • Adăugați câteva dreptunghiuri colorate în partea de jos sau laterală a ecranului și modificați programul astfel încât, dacă utilizatorul face clic într-un dreptunghi, culoarea desenului se schimbă la aceeași culoare cu dreptunghiul.

Încercați o abordare sau toate cele trei și salvați noul fișier ca ColorPaint.py.

Provocare 3:

Pygame are o funcție numită pygame.mouse.get_rel () care va returna cantitatea de mișcare relativă sau cât de mult s-a modificat poziția mouse-ului în pixeli de la ultimul apel către get_rel (), în direcțiile x și y. Modificați fișierul SmileyExplosion.py pentru a utiliza cantitatea de mișcare relativă a mouse-ului în direcțiile x și y ca vitezele orizontale și verticale ale fiecărui smiley (în loc să generați o pereche de valori speedx și speedy aleatorii). Acest lucru va arăta ca și cum utilizatorul aruncă zâmbete, deoarece acestea vor accelera în direcția în care utilizatorul trage mouse-ul!

Pentru a adăuga un alt efect realist, încetiniți ușor smiley-urile înmulțind xvel și yvel cu un număr mai mic de 1,0 (cum ar fi 0,95) în secțiunea de actualizare (auto) de fiecare dată când smiley-urile sări de pe o margine a ecranului. Zâmbetele vor încetini în timp, ca și cum fricțiunea de la fiecare săritură a peretelui îi face să se miște din ce în ce mai încet. Salvați noua aplicație ca SmileyThrow.py.