Pygame,围绕中心旋转使图像消失

如何解决Pygame,围绕中心旋转使图像消失

我不明白为什么当我尝试围绕它的中心旋转它时,我的射弹消失了。 不围绕其中心旋转它没有问题。我尝试显示其中心的坐标,看起来不错。谢谢你的帮助。 这是旋转的方法,在“projectile”脚本中。

    def rotate(self):
        # Tourner le projectile
        self.angle += 2
        self.image = pg.transform.rotozoom(self.origin_image,self.angle,1)
        self.rect = self.image.get_rect(center = self.rect.center)

主要:

"""
Created on Mon Jun 14 09:54:56 2021

@author: Graven
"""

import pygame as pg
import math
from game import Game


pg.init()  # charger les composants de pygame

clock = pg.time.Clock()           

# Générer la fenêtre du jeu
screenSize = (1080,720)
pg.display.set_caption('Comet fall game')  #(title,icontitle)  Définir le titre de la fenêtre
screen = pg.display.set_mode(screenSize)  # (size,flag...) taille de la fenêtre

# Importer l'arrière plan
background = pg.image.load('assets/bg.jpg')

# Importer la bannière
banner = pg.image.load('assets/banner.png')
banner = pg.transform.scale(banner,(500,500))
banner_rect = banner.get_rect()
banner_rect.x = math.ceil(screen.get_width() / 4)
# importerle bouton pour lancer la partie
play_button = pg.image.load('assets/button.png')
play_button = pg.transform.scale(play_button,(400,150))
play_button_rect = play_button.get_rect()
play_button_rect.x = math.ceil(screen.get_width() / 3.33)
play_button_rect.y = math.ceil(screen.get_height() / 2)


# Charger le jeu
game = Game()
running = True  # jeu en cours d'execution

# Boucle tant que running est vrai
while running :
    # pg.time.delay(10)
    # Appliquer l'arrière plan du jeu
    screen.blit(background,(-1000,-200))  # injecter l'image sur l'écran


    # Vérifier si notre jeu a commencé ou non
    if game.is_playing:
        # Déclencher les instructions de la partie
        game.update(screen,screenSize) 
          
    # Vérifier si le jeu n'a pas encore commencé 
    else :
        # Ajouter l'écran de bienvenue
        screen.blit(play_button,play_button_rect)
        screen.blit(banner,banner_rect)

            
    # mettre à jour l'écran
    pg.display.flip() 
    # clock.tick(1000)
    
    # si le joueur ferme cette fenetre ou click sur start
    for event in pg.event.get():  # reprendre tous les évenements possibles
        # vérifier que l'evenement est fermeture de fenetre
        if event.type == pg.QUIT :
            running = False
            pg.quit()
        elif event.type == pg.MOUSEBUTTONDOWN:
            # Vérification pour savoir si le curseur est en collision avec le boutton
            if play_button_rect.collidepoint(event.pos):
                # mettre le jeu en mode "lancé"
                game.start()
                
                
              

游戏:

"""
Created on Mon Jun 14 10:40:05 2021

@author: Graven
"""
import pygame as pg
from player import Player
from monster import Monster
clock = pg.time.Clock()  
# Créer une seconde classe qui représente le jeu
class Game :
    def __init__(self):
        # Définir si le jeu a commencé ou non
        self.is_playing = False
        # Générer notre joueur
        self.all_players = pg.sprite.Group()  # Uniquement pour la fonction collision qui vérifie un sprite avec un groupe
        self.player = Player(self)
        self.all_players.add(self.player)
        # Enregistrer toutes les touches actionnées   
        self.pressed = {}
        # Groupe de monstre
        self.all_monsters = pg.sprite.Group()
        self.k=0
    
    def start(self):
        # lors d'une nouvelle partie,respawn des monstres
        self.is_playing = True
        # self.spawn_monster()
        # self.spawn_monster()
    
    def game_over(self):
        # Remettre le jeu à neuf,retirer les monstres,remettre 100 pv et jeu en attente
        self.all_monsters = pg.sprite.Group()
        self.player.health = self.player.max_health
        self.is_playing = False
        
    def update(self,screen,screenSize):
        # Appliquer l'image du joueur
        screen.blit(self.player.image,self.player.rect)
        # Visualiser la barre de vie du joueur
        self.player.update_health_bar(screen,self.player.chargeState)
        # Récupérer les projectiles du joueur
        for projectile in self.player.all_projectile:
            projectile.move()
        # Récupérer les monstres du jeu
        for monster in self.all_monsters:
            monster.forward()
            monster.update_health_bar(screen)
            
            
        # Appliquer l'ensemble des images de mon groupe de projectiles
        self.player.all_projectile.draw(screen)
        # Appliquer l'ensemble des images de mon groupe de monstre
        self.all_monsters.draw(screen)
        # Charge du projectile
        if self.player.charge_projectile:
            self.player.chargeState += 1
        else:
            self.player.chargeState = 0

        
        # Vérifier si le joueur souhaite se déplacer
        if self.pressed.get(pg.K_RIGHT) and self.player.rect.x < screenSize[0] - self.player.rect.width:
            self.player.move_right()
            
        elif self.pressed.get(pg.K_LEFT) and self.player.rect.x > 0:
            self.player.move_left()
            
 
        # si le joueur réalise un évenement
        for event in pg.event.get():  # reprendre tous les évenements possibles
            # vérifier que l'evenement est fermeture de fenetre
            if event.type == pg.QUIT :
                pg.quit()  
            # Détecter si un joueur lache une touche du clavier
            elif event.type == pg.KEYDOWN:
                self.pressed[event.key] = True                
                # Détecter si espace est enclenché pour lancer le projectile
                if event.key == pg.K_SPACE:
                    self.player.charge_projectile = True
            elif event.type == pg.KEYUP and self.player.charge_projectile :
                self.player.launch_projectile()
                self.player.charge_projectile = False
                self.pressed[event.key] = False
            elif event.type == pg.KEYUP :
                self.pressed[event.key] = False
        # self.k += 1
        # print(self.k,self.pressed)

    
    def check_collision(self,sprite,group):
        return pg.sprite.spritecollide(sprite,group,False,pg.sprite.collide_mask)
    
    def spawn_monster(self):
        monster = Monster(self)
        self.all_monsters.add(monster)

玩家:

"""
Created on Mon Jun 14 10:39:16 2021

@author: Graven
"""
import pygame as pg
from projectile import Projectile


# Créer une première classe qui représente le joueur
class Player(pg.sprite.Sprite) :
    def __init__(self,game):
        super().__init__()
        self.game = game
        self.health = 100
        self.max_health = 100
        self.chargeState = 0
        self.attack =  0.5
        self.max_charge = 100
        self.velocity = 3  
        self.image = pg.image.load('assets/player.png')
        self.rect =  self.image.get_rect()
        self.rect.x = 450
        self.rect.y = 500
        self.all_projectile = pg.sprite.Group()
        self.charge_projectile = False
        
        
    def damage(self,amout):
        self.health -= amout
        if self.health <= 0 :
            self.game.game_over()
        
    def move_right(self):
        # si le joueur n'est pas en collision avec un monstre
        if not self.game.check_collision(self,self.game.all_monsters):
            self.rect.x += self.velocity
    def move_left(self):
        self.rect.x -= self.velocity
        
    def launch_projectile(self):
        # Créer une nouvelle instance de la classe projectile
        self.all_projectile.add(Projectile(self))
        
    
    def update_health_bar(self,surface,max_charge):
        # Définir une couleur pour la jauge de vie(vert) et son arrière plan (gris)
        if max_charge <  self.max_charge :
            bar_color = (111,210,46)
        else:
            bar_color = (255,128,0)
        back_bar_color = (60,63,60)
        # Définir la position de la jauge de vie et sa largeur/épaisseur
        bar_position = [self.rect.x +50,self.rect.y + 20,self.health,7]        # Définir la position de l'arrière plan dela jauge
        back_bar_position = [self.rect.x + 50,self.max_health,7]
        # Dessiner la barre de vie
        pg.draw.rect(surface,back_bar_color,back_bar_position)
        pg.draw.rect(surface,bar_color,bar_position)

怪物

# -*- coding: utf-8 -*-
"""
Created on Mon Jun 14 18:48:46 2021

@author: Graven
"""

import pygame as pg
import random


# Création d'une classe qui gère la notion de monstre
class Monster(pg.sprite.Sprite):
    def __init__(self,game):
        self.game = game
        super().__init__()
        self.max_health = 60 + random.randint(0,60) 
        self.health = self.max_health
        self.attack = 0.3
        self.image = pg.image.load('assets/mummy.png')
        self.rect = self.image.get_rect()
        self.rect.x = 1080 + random.randint(0,300)
        self.rect.y = 540
        self.velocity = random.randint(1,3)
    
    def damage(self,amount):
        self.health -= amount
        if self.health <= 0 :
            # Réapparaitre comme un nouveau monstre
            self.rect.x = 1080 + random.randint(0,300)
            self.max_health = 60 + random.randint(0,60) 
            self.health = self.max_health
            self.velocity = random.randint(1,3)
        
    def update_health_bar(self,surface):
        # Définir une couleur pour la jauge de vie(vert) et son arrière plan (gris)
        bar_color,back_bar_color = (111,46),(60,60)
        # Définir la position de la jauge de vie et sa largeur/épaisseur
        bar_position = [self.rect.x + 10,self.rect.y - 20,5]
        # Définir la position de l'arrière plan dela jauge
        back_bar_position = [self.rect.x + 10,5]

        # Dessiner la barre de vie
        pg.draw.rect(surface,bar_position)
        
        
    def forward(self):
        # si le monster n'est pas en collision avec le joueur
        if not self.game.check_collision(self,self.game.all_players):
            self.rect.x -= self.velocity
        else:
            # Si le monstre est en collision avec le joueur,inflige des degats
            self.game.player.damage(self.attack)
        

投射物:

# -*- coding: utf-8 -*-
"""
Created on Mon Jun 14 11:41:52 2021

@author: Graven
"""

import pygame as pg
# définir la classe qui gère le projectile de notre joueur
class Projectile(pg.sprite.Sprite):
    
    #définir le constructeur
    def __init__(self,player):
        super().__init__()
        self.velocity = 5
        self.player = player
        self.image = pg.image.load('assets/projectile.png')
        self.rect = self.image.get_rect()
        self.damage = int(self.player.attack * min(self.player.chargeState,self.player.max_charge)**1.1)
        self.image = pg.transform.scale(self.image,(self.damage,self.damage))
        self.rect.x = player.rect.x + 95
        self.rect.y = player.rect.y + 115 - self.damage/2
        self.origin_image = self.image
        self.angle = 0
        
        
    def rotate(self):
        # Tourner le projectile
        self.angle += 2
        self.image = pg.transform.rotozoom(self.origin_image,1)
        self.rect = self.image.get_rect(center = self.rect.center)

        
    def remove(self):
        self.player.all_projectile.remove(self)
        
    def move(self):
        self.rect.x += self.velocity
#        self.rotate()
#        centre_proj = self.rect.center
#        print('centre_proj',centre_proj)
        
        # Vérifier su le projectile entre en collision avec un monstre
        for monstre_rencontre in  self.player.game.check_collision(self,self.player.game.all_monsters):
            # Attribuer les dégats
            monstre_rencontre.damage(self.damage)

            
            #supprimer le projectile
            self.remove()
        # Vérifier si le projectie n'est plus présent sur l'écran
        if self.rect.x > 1080:
            # Supprimer le projectile
            self.remove()
            
            

解决方法

确保 False 的大小不低于最小大小。:

Projectile

self.damage = int(self.player.attack * min(self.player.chargeState,self.player.max_charge)**1.1)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res