Python Pygame 线条逐渐增大
好的,我正在制作一个游戏,里面有个角色可以在屏幕上移动并射击敌人。角色的头上有一个炮筒(就是一条线;)但我在这里遇到了问题。在下面的炮筒类中,我让这条线围着角色旋转,这个部分是没问题的。问题是,这条线的长度好像在不断变长 :/ 我不太确定为什么会这样,任何帮助都很感激。如果让它转圈圈转太多次,它就会旋转得很奇怪(听起来有点幼稚,但确实如此)
附注(抱歉代码有点长,我还是决定把它放上来。其实你只需要看炮筒类下面的部分。谢谢)
import pygame, sys
from pygame.locals import *
# Classes
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y, targetX, targetY):
self.x = x
self.y = y
self.targetX = targetX
self.targetY = targetY
pygame.sprite.Sprite.__init__(self, bulletGroup)
def update(self):
pygame.draw.rect(screen, (251, 231, 9), (self.x, self.y, 5, 5))
class Cannon(pygame.sprite.Sprite):
def __init__(self):
self.x = 0
self.y = -30
self.xSpeed = 10
self.ySpeed = 10
self.right = False
self.left = False
def update(self):
if self.y >= 0:
self.xSpeed = self.xSpeed * -1
print self.x
if self.right:
if self.x < 0:
self.x += self.xSpeed
self.y -= self.ySpeed
else:
self.x += self.xSpeed
self.y += self.ySpeed
if self.left:
if self.x > 0:
self.x -= self.xSpeed
self.y -= self.ySpeed
else:
self.x -= self.xSpeed
self.y += self.ySpeed
self.xSpeed = 0.5
self.ySpeed = 0.5
pygame.draw.line(screen, red, player.center, ((player.x + 14) + self.x, (player.y + 14) + self.y), 2)
class Player(pygame.sprite.Sprite):
def __init__(self, config):
self.loadConfig(config)
self.x = 250
self.y = 250
self.up = False
self.down = False
self.right = False
self.left = False
self.canShoot = True
self.canShootTicks = 0
self.shooting = False
def loadConfig(self, config):
loaded = 0
for line in config:
if "health - " in line:
self.health = int(line[9:])
loaded += 1
elif "damage - " in line:
self.damage = int(line[9:])
loaded += 1
if loaded < 2:
loaded = 0
config = open("config.txt", "w")
config = open("config.txt", "r+")
self.writeToConfig(config)
def writeToConfig(self, config):
config.write("health - 100\n")
config.write("damage - 10\n")
config.seek(0)
self.loadConfig(config)
def update(self):
if self.canShootTicks > 2:
self.canShoot = True
self.shoot()
if self.up and self.y > 20:
self.y -= 5
if self.right and self.x < 550:
self.x += 5
if self.left and self.x > 20:
self.x -= 5
if self.down and self.y < 550:
self.y += 5
self.canShootTicks += 1
self.center = (self.x + 14, self.y + 15)
screen.blit(playerImg, (self.x, self.y))
def shoot(self):
if player.canShoot:
if player.shooting:
bullet = Bullet(self.x, self.y, 10, 10)
bulletGroup.add(bullet)
self.canShootTicks = 0
self.canShoot = False
# Functions
def getResources():
wallImgTop = pygame.image.load("wallTop.png")
wallImgSide = pygame.image.load("wallSide.png")
wallImgCorner1 = pygame.image.load("wallCorner1.png")
wallImgCorner2 = pygame.image.load("wallCorner2.png")
wallImgCorner3 = pygame.image.load("wallCorner3.png")
wallImgCorner4 = pygame.image.load("wallCorner4.png")
playerImg = pygame.image.load("player.png")
return (wallImgTop, wallImgSide, wallImgCorner1, wallImgCorner2, wallImgCorner3, wallImgCorner4, playerImg)
def drawWalls():
for i in range (4):
if i == 0 or i == 2:
direction = 0
else:
direction = 580
for n in range(20):
if i < 2:
screen.blit(wallImgTop, (n * 30, direction))
else:
screen.blit(wallImgSide, (direction, n * 30))
screen.blit(wallImgCorner1, (-6, -1))
screen.blit(wallImgCorner2, (567, -6))
screen.blit(wallImgCorner3, (-1, 564))
screen.blit(wallImgCorner4, (564, 567))
def loadSave():
try:
config = open("config.txt", "r+")
except IOError:
config = open("config.txt", "w")
config = open("config.txt", "r+")
player = Player(config)
return player
# Starting out
pygame.init()
screen = pygame.display.set_mode((600, 600), 0, 32)
pygame.display.set_caption("Upgrady Shooter")
clock = pygame.time.Clock()
# Variables
FPS = 50
red = (255, 0, 0)
black = (0, 0, 0)
# Get goin'
wallImgTop, wallImgSide, wallImgCorner1, wallImgCorner2, wallImgCorner3, wallImgCorner4, playerImg = getResources()
bulletGroup = pygame.sprite.Group()
player = loadSave()
cannon = Cannon()
while True:
screen.fill(black)
drawWalls()
bulletGroup.update()
player.update()
cannon.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == K_w:
player.up = True
elif event.key == K_d:
player.right = True
elif event.key == K_a:
player.left = True
elif event.key == K_s:
player.down = True
elif event.key == K_SPACE:
player.shooting = True
elif event.key == K_LEFT:
cannon.left = True
elif event.key == K_RIGHT:
cannon.right = True
elif event.type == pygame.KEYUP:
if event.key == K_w:
player.up = False
elif event.key == K_d:
player.right = False
elif event.key == K_a:
player.left = False
elif event.key == K_s:
player.down = False
elif event.key == K_SPACE:
player.shooting = False
elif event.key == K_LEFT:
cannon.left = False
elif event.key == K_RIGHT:
cannon.right = False
pygame.display.update()
1 个回答
1
独立的位置
Player
(玩家)和Cannon
(炮台)的速度是不一样的,玩家的速度基本上是5
(比如说self.x += 5
),而炮台的初始速度是10
(self.xSpeed = 10
),但之后会变成0.5
(self.xSpeed = 0.5
)。
当你把玩家的中心作为线的起点,把炮台的x
和y
作为终点时,这条线的长度会发生变化。
更具体来说,你画的炮台线是
pygame.draw.line(screen, red, player.center, ((player.x + 14) + self.x, (player.y + 14) + self.y), 2)
这样线的起点是player.center
,而终点包含self.x
和self.y
...
圆周运动
要实现圆周运动,你需要使用类似于
x = r * sin(2*PI*t/PERIOD),
y = r * cos(2*PI*t/PERIOD)
或者更可能的是,这些值会放在一个查找表里(也就是说,生成从0到2π的所有x
和y
值)。
其他的公式也可以使用