Python 如何旋转玩家的移动?
我正在制作一个只有键盘才能移动的星体克隆。球员能够旋转,并且需要向前移动,以避免正面碰撞 例如: 当我将球员旋转30度并推动W向前移动时,我希望球员朝球员所面对的方向前进。我不能只使用self.rect.x+=self.vel 我还尝试使用此功能: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
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(玩家,所有星象,错误)
如果星体碰撞:
运行=错误
#绘制/渲染