当前位置:网站首页>[pygame Learning notes] 8. Elfe.
[pygame Learning notes] 8. Elfe.
2022-07-21 02:00:00 【Leleprogrammer】
Terminologie“Elfe”C'est la réserve des vieux ordinateurs et des consoles de jeux.Ces boîtes plus anciennes ne peuvent pas dessiner et effacer des graphiques ordinaires assez rapidement,Pour qu'il ne puisse pas être utilisé comme jeu.Ces machines ont du matériel spécial pour gérer les objets de jeu qui nécessitent une animation rapide.Ces objets sont appelés“Elfe”Et avec des limites particulières,Mais il peut être dessiné et mis à jour très rapidement.Ils sont généralement présents dans des tampons de superposition spéciaux dans la vidéo.Ces jours - ci,,L'ordinateur est devenu assez rapide,.Vous pouvez traiter des objets comme des sprites sans matériel dédié.sprite Le mot est toujours utilisé pour désigner 2D Toute animation dans le jeu.
Cette note d'étude,Apprenons les elfes,Donnez d'abord le Code du cadre de base
import pygame
from pygame.locals import *
import sys
class Game:
def __init__(self):
pygame.init()
self.W,self.H=800,800
self.screen=pygame.display.set_mode((self.W,self.H))
pygame.display.set_caption("【Pygame Notes d'étude】")
def listen(self):
for event in pygame.event.get():
if event.type==QUIT:
sys.exit()
def draw(self):
self.screen.fill((255,255,255))
def run(self):
while True:
self.listen()
self.draw()
pygame.display.update()
if __name__ == '__main__':
game=Game()
game.run()
Donnez les fichiers de ressources nécessaires :
balloon.png
On va écrire un programme avec des ballons qui descendent du Haut de l'écran. ,Tout d'abord,,On vaballoon.pngPlacé surpythonLes fichiers sont dans le même répertoire queresourcesDossiers,resources Les dossiers peuvent être utilisés pour stocker des fichiers de ressources , Puis définissez une classe Balloon,Depygame.sprite.Sprite, Initialisation de la superclasse dans l'initialisation
class Balloon(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
Puis continuez à créer dans la méthode d'initialisation self.image Variable utilisée pour stocker l'image du ballon , Importer l'image et zoomer vers 50x50Taille,self.rect La variable stocke l'emplacement du Sprite ,self.speed Indique la vitesse de chute , Importer au début du programme random,import random as rd, Ensuite, utilisez la méthode de génération d'entiers aléatoires de la Bibliothèque aléatoire ,Génération aléatoirexCoordonnées,En basy Les coordonnées sont en haut de la fenêtre
Attention!,Ici.self.imageEtself.rect Le nom de la variable ne peut pas être changé en un autre nom , Parce que ces deux variables sont pygameDeSpriteDéfini dans la classe, On réécrit ce qu'on veut. , Et ce que nous allons dire plus tard, c'est que le fait de dessiner un Sprite dans une fenêtre est lié à ces deux variables. ,Donc iciself.imageEtself.rect L'image stockée doit correspondre rectObjet
self.image=pygame.transform.smoothscale(pygame.image.load("resources/balloon.png"),(50,50))
self.rect=self.image.get_rect()
self.rect.midbottom=rd.randint(50,game.W-50),0
self.speed=1
Et puis,RéécritureupdateMéthodes,Ici.update La méthode ne peut pas non plus changer de nom Oh ,InupdateDans la méthode,Jeany Incréments de coordonnées ,Et justerect Le Haut de la fenêtre atteint le bas , Efface le génie , Les elfes utilisent SpriteMoyennekillMéthodes
def update(self):
self.rect.y+=self.speed
if self.rect.top>=game.H:
self.kill()
Voilà., Une simple classe d'elfes est terminée. ,Et puis..., Apprenons à dessiner des Elfes à l'écran , Et comment ajouter des sprites, etc
InGame Créer un groupe de sprites dans l'initialisation de classe ,Avecpygame.sprite.GroupCatégorie
self.balloons=pygame.sprite.Group()
Ensuite, définissez dans le programme principal CREATEBALLOON,La valeur est:USEREVENT+1
CREATEBALLOON=USEREVENT+1
USEREVENT- Oui.pygame Constante d'événement réservée à l'utilisateur ,Plus grand queUSEREVENT Toutes les valeurs de sont à la disposition de l'utilisateur , Donc nous le définissons ici comme USEREVENT+1
Et puis...GameDans la classerunLa procédurewhile Écrivez avant le cycle
pygame.time.set_timer(CREATEBALLOON,700)
La ligne de code ci - dessus utilise pygame.time.set_timerMéthodes,Deux paramètres sont passés, Le premier est l'événement , Le deuxième est le nombre de millisecondes , Indique qu'à partir de cette ligne de code , Événements déclenchés toutes les millisecondes de fonctionnement ,Nous avons mis ici700,C'est - à - dire chaque700 Les millisecondes déclenchent un événement pour créer un ballon ,Ensuite, on valisten Surveillance des événements en cours ,Infor Ajouter ce code à la boucle de traversée des événements , Quand le programme a saisi cet événement ,Juste àself.balloons Groupes de sprites ajouter des sprites ,Oui.addMéthodes, L'argument passé est une Instanciation de notre classe Sprite
if event.type==CREATEBALLOON:
self.balloons.add(Balloon())
Et puis,IndrawDans la méthode, Mise à jour du Groupe Sprite ,Et dessiner, Mise à jour avec updateMéthodes,Pour dessinerdrawMéthodes,draw Dans la fenêtre Surface, C'est - à - dire directement dans self.screenC'est tout.
self.balloons.update()
self.balloons.draw(self.screen)
Le Code final est le suivant:
import pygame
from pygame.locals import *
import sys
import random as rd
CREATEBALLOON=USEREVENT+1
class Game:
def __init__(self):
pygame.init()
self.W,self.H=800,800
self.screen=pygame.display.set_mode((self.W,self.H))
pygame.display.set_caption("【Pygame Notes d'étude】")
self.balloons=pygame.sprite.Group()
def listen(self):
for event in pygame.event.get():
if event.type==QUIT:
sys.exit()
if event.type==CREATEBALLOON:
self.balloons.add(Balloon())
def draw(self):
self.screen.fill((255,255,255))
self.balloons.update()
self.balloons.draw(self.screen)
def run(self):
pygame.time.set_timer(CREATEBALLOON,700)
while True:
self.listen()
self.draw()
pygame.display.update()
class Balloon(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image=pygame.transform.smoothscale(pygame.image.load("resources/balloon.png"),(50,50))
self.rect=self.image.get_rect()
self.rect.midbottom=rd.randint(50,game.W-50),0
self.speed=1
def update(self):
self.rect.y+=self.speed
if self.rect.top>=game.H:
self.kill()
if __name__ == '__main__':
game=Game()
game.run()
On exécute le Code maintenant , Trouver le ballon tomber trop vite ,InBalloonModification moyennespeedPour0.1,Nous avons découvert, Quand le génie a été créé , Il ne restera qu'en haut de la fenêtre ,C'est parce que,ElferectEt ordinairerectUn peu différent,Elferect Les valeurs des paramètres de l'objet sont généralement des entiers , Nous ne pouvons pas augmenter ou diminuer les décimales , C'est - à - dire que les elfes tombent à chaque fois. 1Pixels, Expliquons la solution
Solutions1: Modifier la vitesse de fonctionnement
Parce que nous courons trop vite ,Par seconderunMoyennewhile Il y a eu beaucoup de cycles , Nous devons réduire le nombre de fois ,Ce n'est pas difficile.,InrunDewhileCréation précédenteclock
clock=pygame.time.Clock()
Regardez le taux de trame de la façon suivante
clock.tick()
print(clock.get_fps())
Parce que mon ordinateur est mieux configuré ,Assez fluide, Donc le taux de trame de sortie de la console est toujours 5000Et3333.333Entre
On est là.tickAjouter un paramètre, Changer le taux de trame en 120
clock.tick(120)
print(clock.get_fps())
Rediriger le programme,Je vois., Le ballon tombe normalement lentement , Taux de trame de sortie de la console ,Et très proche120
Mise en service terminée,Encoreprint La déclaration peut être supprimée ,Le Code final est le suivant
import pygame
from pygame.locals import *
import sys
import random as rd
CREATEBALLOON=USEREVENT+1
class Game:
def __init__(self):
pygame.init()
self.W,self.H=800,800
self.screen=pygame.display.set_mode((self.W,self.H))
pygame.display.set_caption("【Pygame Notes d'étude】")
self.balloons=pygame.sprite.Group()
def listen(self):
for event in pygame.event.get():
if event.type==QUIT:
sys.exit()
if event.type==CREATEBALLOON:
self.balloons.add(Balloon())
def draw(self):
self.screen.fill((255,255,255))
self.balloons.update()
self.balloons.draw(self.screen)
def run(self):
pygame.time.set_timer(CREATEBALLOON,700)
clock=pygame.time.Clock()
while True:
clock.tick(120)
self.listen()
self.draw()
pygame.display.update()
class Balloon(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image=pygame.transform.smoothscale(pygame.image.load("resources/balloon.png"),(50,50))
self.rect=self.image.get_rect()
self.rect.midbottom=rd.randint(50,game.W-50),0
self.speed=1
def update(self):
self.rect.y+=self.speed
if self.rect.top>=game.H:
self.kill()
if __name__ == '__main__':
game=Game()
game.run()
Solutions2
Nous pouvons ajouter une variable et un compteur à la classe Sprite nous - mêmes ,Chaque Courseupdate Je vais juste mettre le compteur +1, Quand la valeur de la variable est atteinte ,Compteur à zéro, L'elfe descend ensuite . Changez la classe Sprite en ceci
class Balloon(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image=pygame.transform.smoothscale(pygame.image.load("resources/balloon.png"),(50,50))
self.rect=self.image.get_rect()
self.rect.midbottom=rd.randint(50,game.W-50),0
self.speed=1
self.toUpdate=20
self.counter=0
def update(self):
self.counter+=1
if self.counter>=self.toUpdate:
self.counter=0
self.rect.y+=self.speed
if self.rect.top>=game.H:
self.kill()
Nous lancerons le programme à nouveau , Les ballons ont aussi réussi à ralentir la chute.
Solutions3: Fonctionnement manuel différé après chaque cycle principal
Ce n'est pas difficile non plus ,Une ligne de code suffit,Avecpygame.time.delayMéthodes,Passe un numéro, Indique le nombre de millisecondes de retard , Ajoutez cette ligne de code directement à while La dernière face du cycle est ( C'est la taille qu'on se sent bien. ,Je mets ça ici pour10MS)
pygame.time.delay(10)
Le Code final est le suivant:
import pygame
from pygame.locals import *
import sys
import random as rd
CREATEBALLOON=USEREVENT+1
class Game:
def __init__(self):
pygame.init()
self.W,self.H=800,800
self.screen=pygame.display.set_mode((self.W,self.H))
pygame.display.set_caption("【Pygame Notes d'étude】")
self.balloons=pygame.sprite.Group()
def listen(self):
for event in pygame.event.get():
if event.type==QUIT:
sys.exit()
if event.type==CREATEBALLOON:
self.balloons.add(Balloon())
def draw(self):
self.screen.fill((255,255,255))
self.balloons.update()
self.balloons.draw(self.screen)
def run(self):
pygame.time.set_timer(CREATEBALLOON,700)
while True:
self.listen()
self.draw()
pygame.display.update()
pygame.time.delay(10)
class Balloon(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image=pygame.transform.smoothscale(pygame.image.load("resources/balloon.png"),(50,50))
self.rect=self.image.get_rect()
self.rect.midbottom=rd.randint(50,game.W-50),0
self.speed=1
def update(self):
self.rect.y+=self.speed
if self.rect.top>=game.H:
self.kill()
if __name__ == '__main__':
game=Game()
game.run()
Aujourd'hui【Pygame Notes d'étude】C'est tout., J'aime mon article, n'oubliez pas de l'apprécier. +Concentrez - vous sur le soutien aux blogueurs Oh!
Merci pour votre soutien~
边栏推荐
- 干货丨重中之重:数据分析中常用指标及术语!
- Ampere Altra Max provides sustainable high-resolution h.265 coding
- LeetCode. 1252. Number of odd value cells___ Simple simulation / row and column array + permutation and combination
- Huawei employees revealed that this position is about to start recruiting a lot!!!
- 香港大学SPACE中国商业学院暨企业研究院第三届创新创业大赛全国总决赛圆满收官
- 美国议员倡导打击加密挖矿 敲响加密警钟?减少碳足迹才能发挥真正价值
- A gadget that displays SAP CRM product hierarchy
- 每日一题:数组中出现次数超过一半的数字(剑指Offer39)
- 通过例子学C标准库<assert.h>
- JVM调优方法
猜你喜欢
U.S. lawmakers advocate cracking down on encrypted mining, ringing the alarm of encryption? Only by reducing the carbon footprint can we achieve real value
AT32使用内核DWT寄存器设定延时时间
SparkCore算子及案例,220719,
每日一题:数组中出现次数超过一半的数字(剑指Offer39)
Redhat 7网络服务无法启动问题(“Device does not seem to be present, delaying initialization”)处理
【5GC】5G PDU会话以及会话类型
[5gc] 5g PDU session and session type
MindSpore开源周年狂欢,量子机器学习与深度分子模拟等巨量新特性来袭!
Win: use Netsh command to configure port forwarding
编译+链接和预处理
随机推荐
.Net Core快速开发平台,强大工作流引擎,多系统快速配置
每日一题:数组中出现次数超过一半的数字(剑指Offer39)
Grouping convolution and deep separable convolution
After reading this article, you should thoroughly understand how to do interface testing
Harbor 高可用集群设计及部署(离线安装方式、含视频)
Matlab summary of differential equation solving methods
Win: use Netsh command to configure port forwarding
【obs】Transform: fit to screen
乐扣乐扣澄清欠税事件:不存在欠税,将一如既往合规经营,植根中国
0.0. Pytorch model building method
NETFLOW 与 SNMP两种不同的网络监控方法
【upload靶场1-11】基础关卡:特点、分析、利用
Uncaught (in promise) cancel
Huawei employees revealed that this position is about to start recruiting a lot!!!
ChromeOptions常用配置与WebUI实操
About: Customizing templates in office 2021
【5GC】5G PDU会话以及会话类型
JASMINER X4在海外爆红,获众多知名博主点赞认可
MySQL 事务管理
2022 Hangzhou future science and technology city digital economy talent programming competition 02 Black and white chess game_____ sliding window