Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何旋转玩家的移动?_Python_Python 3.x_Pygame_Rotation - Fatal编程技术网

Python 如何旋转玩家的移动?

Python 如何旋转玩家的移动?,python,python-3.x,pygame,rotation,Python,Python 3.x,Pygame,Rotation,我正在制作一个只有键盘才能移动的星体克隆。球员能够旋转,并且需要向前移动,以避免正面碰撞 例如: 当我将球员旋转30度并推动W向前移动时,我希望球员朝球员所面对的方向前进。我不能只使用self.rect.x+=self.vel 我还尝试使用此功能: def calculate_new_xy(speed, degrees): add_x = (speed*(math.sin((degrees)*math.pi/180))) add_y = (speed*(math.cos((d

我正在制作一个只有键盘才能移动的星体克隆。球员能够旋转,并且需要向前移动,以避免正面碰撞

例如: 当我将球员旋转30度并推动W向前移动时,我希望球员朝球员所面对的方向前进。我不能只使用self.rect.x+=self.vel

我还尝试使用此功能:

def calculate_new_xy(speed, degrees):
    add_x =  (speed*(math.sin((degrees)*math.pi/180)))
    add_y =  (speed*(math.cos((degrees)*math.pi/180)))
    return add_x, add_y
从理论上讲,这应该行得通,因为我正在考虑这件事的正反两面

但是,当我在代码中添加这一点时,玩家的移动并不像我希望的那样平稳。有时球员会间接向前移动

我还注意到,玩家面对左上角时移动速度比面对右下角时快

因此,当始终向右转弯时,玩家不会在圆圈内移动。相反,玩家将椭圆移动到左上角

代码如下:

import pygame
import time
import random
import math
from os import path

#Colors:
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)

#Settings:
pygame.init()
pygame.mixer.init() #for sound
WIDTH = 700
HEIGHT = 500
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Astroids")
clock = pygame.time.Clock()
FPS = 60

#Images/Sounds:
game_folder = path.dirname(__file__)
img_folder = path.join(game_folder, "img")
player = pygame.image.load(path.join(img_folder, 'Player.png'))
stone = pygame.image.load(path.join(img_folder, 'Stein.png'))

#Game Classes
class Player(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.original_image = player
        self.image = self.original_image.copy()
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH/2, HEIGHT/2)
        self.speed_x = 0
        self.speed_y = 0
        self.vel = 3
        self.degrees = 0

    def boundary(self):
        if self.rect.left > WIDTH:
            self.rect.right = 0
        if self.rect.bottom < 0:
            self.rect.top = HEIGHT
        if self.rect.right < 0:
            self.rect.left = WIDTH
        if self.rect.top > HEIGHT:
            self.rect.bottom = 0

    def movement(self):
        '''Player Movement'''
        keystate = pygame.key.get_pressed()
        if keystate[pygame.K_q]:
            self.degrees += 3

        if keystate[pygame.K_e]:
            self.degrees -= 3

        if keystate[pygame.K_w]:
            self.rect.centerx += (self.vel*(math.sin((self.degrees+180)*math.pi/180)))
            self.rect.centery += (self.vel*(math.cos((self.degrees+180)*math.pi/180)))

        if keystate[pygame.K_s]:
            self.rect.centery += -self.vel * math.sin(math.radians(self.degrees - 90))
            self.rect.centerx +=  self.vel * math.cos(math.radians(self.degrees - 90))

    def rotate(self):
        old_center = self.rect.center 
        self.image = pygame.transform.rotate(self.original_image, self.degrees)
        self.rect = self.image.get_rect()
        self.rect.center = old_center



    def update(self):
        '''Picture is "printed"'''
        self.movement()
        self.boundary()
        self.rotate()
        #self.rect.y += self.speed_y


class Astroid(pygame.sprite.Sprite):
    def __init__(self, life):
        pygame.sprite.Sprite.__init__(self)
        self.original_image = stone
        self.image = self.original_image.copy()
        self.rect = self.image.get_rect()
        self.rect.center = (WIDTH/2, HEIGHT/2)
        self.speed = 2
        self.life = life
        self.speed_x = random.randrange(-3, 3)
        self.speed_y = random.randrange(-3, 3)
        self.rect.x = random.randrange(0, WIDTH - self.rect.width)
        self.rect.y = random.randrange(-3, 3) 
        self.last_rotation = pygame.time.get_ticks() # keeps track of time in milliseconds
        self.rotation_deegre = random.randint(0, 360)
        self.rotation_speed = 5



    def rotate(self):
        current_time = pygame.time.get_ticks()
        if current_time - self.last_rotation > 50:
            self.last_rotation = current_time
            self.rotation_deegre += self.rotation_speed
            old_center = self.rect.center 
            self.image = pygame.transform.rotate(self.original_image, self.rotation_deegre)
            self.rect = self.image.get_rect()
            self.rect.center = old_center


    '''def new_astroids(self):
        for i in range(2):
            m = Astroid()
            all_sprites.add(m)
            all_astroids.add(m)''' #to do



    def boundary(self):
        if self.rect.left > WIDTH:
            self.rect.right = 0
        if self.rect.bottom < 0:
            self.rect.top = HEIGHT
        if self.rect.right < 0:
            self.rect.left = WIDTH
        if self.rect.top > HEIGHT:
            self.rect.bottom = 0

    def movement(self):
        self.rect.x += self.speed_x
        self.rect.y += self.speed_y

    def update(self):
        '''Picture is "printed"'''
        self.movement()
        self.boundary()
        self.rotate()


#Game Funktions
def calculate_new_xy(speed, degrees):
    add_x =  (speed*(math.sin((degrees)*math.pi/180)))
    add_y =  (speed*(math.cos((degrees)*math.pi/180)))
    return add_x, add_y

#Game Sprites
all_astroids = pygame.sprite.Group()
all_sprites = pygame.sprite.Group()
player = Player()
all_sprites.add(player)

for i in range (1):
    m = Astroid(3)
    all_astroids.add(m)
    all_sprites.add(m)

#Main Game Loop
running = True
while running:

    #Keep the game runnung at 60 FPS
    clock.tick(FPS)


    #Check for events:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    #Update for Sprites
    all_sprites.update()

    #Check to see if any Astroids hit the player
    astroid_colision = pygame.sprite.spritecollide(player, all_astroids, False)
    if astroid_colision:
        running = False

    #Draw/Render
    screen.fill(BLACK)
    all_sprites.draw(screen)

    #Update the display
    pygame.display.update()

pygame.quit()
导入pygame
导入时间
随机输入
输入数学
从操作系统导入路径
#颜色:
白色=(255,255,255)
黑色=(0,0,0)
红色=(255,0,0)
绿色=(0,255,0)
蓝色=(0,0255)
黄色=(255,255,0)
#设置:
pygame.init()
pygame.mixer.init()#用于声音
宽度=700
高度=500
screen=pygame.display.set_模式((宽度、高度))
pygame.display.set_标题(“星象”)
clock=pygame.time.clock()
FPS=60
#图像/声音:
game\u folder=path.dirname(\u文件\u)
img\u folder=path.join(游戏文件夹,“img”)
player=pygame.image.load(path.join(img_文件夹'player.png'))
stone=pygame.image.load(path.join(img_文件夹'Stein.png'))
#游戏课
职业玩家(pygame.sprite.sprite):
定义初始化(自):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.original_image=播放器
self.image=self.original\u image.copy()
self.rect=self.image.get_rect()
self.rect.center=(宽度/2,高度/2)
自速度_x=0
自速度_y=0
self.vel=3
自相关度=0
def边界(自):
如果self.rect.left>宽度:
self.rect.right=0
如果self.rect.bottom<0:
self.rect.top=高度
如果self.rect.right<0:
self.rect.left=宽度
如果self.rect.top>高度:
self.rect.bottom=0
def移动(自):
“玩家移动”
keystate=pygame.key.get_pressed()
如果keystate[pygame.K_q]:
自身学位+=3
如果keystate[pygame.K_e]:
自身度数-=3
如果keystate[pygame.K_w]:
self.rect.centerx+=(self.vel*(math.sin((self.degrees+180)*math.pi/180)))
self.rect.centery+=(self.vel*(math.cos((self.degrees+180)*math.pi/180)))
如果keystate[pygame.K_s]:
self.rect.centery+=-self.vel*math.sin(数学弧度(self.degrees-90))
self.rect.centerx+=self.vel*math.cos(数学弧度(self.degrees-90))
def旋转(自):
旧中心=自整中心
self.image=pygame.transform.rotate(self.original_image,self.degrees)
self.rect=self.image.get_rect()
self.rect.center=旧中心
def更新(自我):
“图片已打印”
self.movement()
self.boundary()
self.rotate()
#self.rect.y+=self.speed\u y
类星体(pygame.sprite.sprite):
定义初始(自我,生命):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
self.original_image=stone
self.image=self.original\u image.copy()
self.rect=self.image.get_rect()
self.rect.center=(宽度/2,高度/2)
自身速度=2
自我生活
self.speed_x=random.randrange(-3,3)
self.speed_y=random.randrange(-3,3)
self.rect.x=random.randrange(0,宽度-self.rect.WIDTH)
self.rect.y=random.randrange(-3,3)
self.last_rotation=pygame.time.get_ticks()#以毫秒为单位跟踪时间
self.rotation\u deegre=random.randint(0360)
自转速度=5
def旋转(自):
当前时间=pygame.time.get_ticks()
如果当前时间-自上次旋转>50:
自上次旋转=当前旋转时间
自转速度
旧中心=自整中心
self.image=pygame.transform.rotate(self.original\u image,self.rotation\u deegre)
self.rect=self.image.get_rect()
self.rect.center=旧中心
''定义新天体(自身):
对于范围(2)中的i:
m=星体()
所有精灵。添加(m)
所有的星象。添加(m)“”来做
def边界(自):
如果self.rect.left>宽度:
self.rect.right=0
如果self.rect.bottom<0:
self.rect.top=高度
如果self.rect.right<0:
self.rect.left=宽度
如果self.rect.top>高度:
self.rect.bottom=0
def移动(自):
self.rect.x+=self.speed\u x
self.rect.y+=self.speed\u y
def更新(自我):
“图片已打印”
self.movement()
self.boundary()
self.rotate()
#游戏功能
def计算新的xy(速度、度数):
加法x=(速度*(数学sin((度)*数学pi/180)))
加法y=(速度*(数学cos((度)*数学pi/180)))
返回add_x,add_y
#游戏精灵
all_astroids=pygame.sprite.Group()
all_sprites=pygame.sprite.Group()
player=player()
所有精灵。添加(玩家)
对于范围(1)中的i:
m=星体(3)
所有天体。加上(m)
所有精灵。添加(m)
#主游戏循环
运行=真
运行时:
#让游戏以每秒60帧的速度运行
时钟滴答声(FPS)
#检查事件:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
#精灵更新
所有精灵更新()
#检查是否有星象击中玩家
星象碰撞=pygame.sprite.SpriteClide(玩家,所有星象,错误)
如果星体碰撞:
运行=错误
#绘制/渲染