我做了一个简单的2D游戏,但是当英雄射击时,一些子弹比其他子弹移动得更快,特别是从英雄角落出来的子弹(英雄的形状是简单的盒子)。
以下是我编写拍摄代码的方法(我写这条线只是为了确保子弹朝着正确的方向)。我使用的是Python 3.5.2。
运行代码并随时随地拍摄,你会看到其中一些更快。
import pygame
from pygame.locals import*
import os
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (0,25)
pygame.init()
x=pygame.display.set_mode((1360,705))
clock = pygame.time.Clock()
kx=[]
ky=[]
kx1=[]
ky1=[]
while True :
x.fill((0,0,0))
for event in pygame.event.get():
if event.type==QUIT :
pygame.quit()
quit()
if event.type== pygame.MOUSEBUTTONDOWN and event.button == 1:
xvx=pygame.mouse.get_pos()
xa=(int(xvx[0]))
ya=(int(xvx[1]))
wox=(xa-680)
woy=(ya-352)
ox=wox/70
oy=woy/70
while True :
if xa >= 700 or xa <=660 or ya>=372 or ya<=332 :
xa=xa-ox
ya=ya-oy
else :
break
pygame.draw.line(x,(255,150,100),(xa,ya),(680,352))
kx.append(xa-1)
ky.append(ya-1)
kx1.append(680)
ky1.append(352)
for i in range (len(kx)):
wox=(kx[i]-kx1[i])
woy=(ky[i]-ky1[i])
ox=wox/20
oy=woy/20
kx[i]=kx[i]+ox
ky[i]=ky[i]+oy
kx1[i]=kx1[i]+ox
ky1[i]=ky1[i]+oy
pygame.draw.rect(x,(250,250,250),(kx[i],ky[i],2,2))
pygame.display.update()
clock.tick(60)
答案 0 :(得分:4)
当您单击它以确定速度时,您当前的代码似乎使用鼠标的位置。再远一点就可以获得更快的拍摄效果。但听起来你只想要鼠标的位置来确定镜头的方向,所有子弹的速度都相同。
这是矢量标准化的工作!
您可以通过将字符位置中的单击位置除以其自身长度,将您计算的位置矢量减去单位矢量。然后,您可以将单位矢量乘以所需的速度。
尝试这样的事情:
if event.type== pygame.MOUSEBUTTONDOWN and event.button == 1:
xvx=pygame.mouse.get_pos()
click_x = int(xvx[0]) - 680 # get relative position of the click
click_y = int(xvx[1]) - 352
distance = math.sqrt(click_x**2 + click_y**2)
unit_x = click_x / distance # make a unit vector
unit_y = click_y / distance
BULLET_SPEED = 20 # this constant could be defined elsewhere
velocity_x = unit_x * BULLET_SPEED # make the velocity vector
velocity_y = unit_y * BULLET_SPEED
pygame.draw.line(x, (255, 150, 100),
(680, 352), (680+velocity_x, 352+velocity_y))
kx.append(680 + velocity_x)
ky.append(352 + velocity_y)
kx1.append(680)
ky1.append(352)
我使用了更有意义的变量名称,因此希望代码比原始名称更易于理解。如果你想通过将一些顺序操作组合到一行上的一个组合操作中(例如,不需要存在unit_x
和unit_y
变量,你可以缩短一些事情,你可以直接去velocity_x
和velocity_y
乘以速度,同时除以distance
)。
请注意,我已按原样离开kx
/ ky
和kx1
/ ky1
列表,但可能更有意义地存储速度的组件kx1
/ ky1
中的子弹而不是存储前一个位置(因为你正在减去位置以获得速度)。
您也可以考虑制作一个Bullet
类,将子弹的位置和速度存储在一个对象中,而不是存在多个并行列表。
答案 1 :(得分:0)
@Blckknght descibed问题,我只展示了如何使用pygame.math.Vector2
BTW:而不是4个列表kx
,ky
,kx1
,ky1
我使用一个bullets
并将所有信息保存为列表{{1}其中[position, speed]
和position
是speed
所以它们保持为float,只有当pygame绘制对象时,值才会舍入为整数。
Vector2
或
position += speed
完整代码:
position.x += speed.x
position.y += speed.y