Pygame 拍摄地点
Pygame shooting to location
我一直在尝试为我正在制作的游戏(基于疯狂上帝的境界)实现一项功能,您可以在点击的地方射击。为此,我一直在尝试使用毕达哥拉斯和 运行 的上升或三角形的梯度法则来计算 x 和 y 每次必须移动多远才能保持稳定的速度并每次都保持该速度我点击。我看到人们到处都在使用角度和 python 2 而我目前正在使用 python 3 因此使代码兼容比仅仅询问更棘手。我的代码使用 类 来创建障碍物和纹理。我使用数组在游戏循环中存储和创建子弹,并使用 pygames 矩形功能将它们绘制到屏幕上。请参阅下面的代码(不包括所有代码)。
import pygame, random, time
pygame.init()
shoot= []
class Projectiles(object):
def __init__(self, pos):
self.rect = pygame.Rect(pos[0], pos[1], 20, 20)
shoot.append(self)
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
quit()
if event.key == pygame.K_a:
movement_status = pcharl
x_change = 5
if event.key == pygame.K_w:
movement_status = pcharb
y_change = 5
if event.key == pygame.K_s:
movement_status = pchar
y_change = -5
if event.key == pygame.K_d:
movement_status = pcharr
x_change = -5
if event.key == pygame.K_e:
pygame.display.toggle_fullscreen()
if event.key == pygame.K_SPACE:
shooting = True
if movement_status == pcharl:
Projectiles((x, y))
direction = "left"
bx_change = -8
shooting = True
if movement_status == pcharr:
Projectiles((x+30, y))
direction = "right"
bx_change = 8
shooting = True
if movement_status == pcharb:
Projectiles((x + 30, y))
direction = "up"
by_change = -8
shooting = True
if movement_status == pchar:
Projectiles((x + 30, y))
direction = "down"
by_change = 8
shooting = True
if event.type == pygame.KEYUP:
x_change = 0
y_change = 0
if event.type == pygame.MOUSEBUTTONDOWN:
xm,ym = pygame.mouse.get_pos()
shooting_arr = True
if movement_status == pchar:
Projectiles((x + 60, y))
bullx = 560
if movement_status == pcharb:
Projectiles((x + 60, y))
bullx = 560
if movement_status == pcharr:
Projectiles((x + 60, y))
bullx = 560
if movement_status == pcharl:
Projectiles((x, y))
bullx = 500
for bullet in shoot:
pygame.draw.rect(screen, (255, 100, 0), bullet.rect)
xm = xm - bullx
ym = ym - 500
if xm % 2 == 0 and ym % 2 == 0:
xm = xm / 2
ym = ym / 2
xm = xm / ym
ym = ym / xm
bx_change = xm
by_change = ym
print(str(xm) + " " + str(ym))
xm = 0
ym = 0
shooting = True
screen.fill((225, 50, 25))
if shooting:
for bullet in shoot:
pygame.draw.rect(screen, (255, 0, 255), bullet.rect)
bullet.rect.x += bx_change
bullet.rect.y += by_change
if bullet.rect.x <= 0:
shoot.remove(bullet)
if bullet.rect.x >= 1000:
shoot.remove(bullet)
if bullet.rect.y <= 0:
shoot.remove(bullet)
if bullet.rect.y >= 1000:
shoot.remove(bullet)
x 和 y 等于 500 屏幕尺寸为 1000x1000
通过从鼠标光标位置减去玩家位置来创建矢量。然后使用该矢量通过将其添加到射弹位置来移动射弹。
这是一个简单的例子:
import pygame
import math
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((32, 32))
self.image.fill((0, 0, 0))
self.image.set_colorkey((0, 0, 0))
pygame.draw.polygon(self.image, pygame.Color('dodgerblue'), ((0, 0), (16, 32), (32, 0)))
self.org_image = self.image.copy()
self.rect = self.image.get_rect(center=(200, 200))
self.direction = pygame.Vector2(0, 1)
def update(self, events, dt):
for e in events:
if e.type == pygame.MOUSEBUTTONDOWN:
self.groups()[0].add(Projectile(self.rect.center, self.direction))
self.direction = pygame.Vector2(pygame.mouse.get_pos()) - self.rect.center
self.image = pygame.transform.rotate(self.org_image, math.degrees(math.atan2(*self.direction)))
self.rect = self.image.get_rect(center=self.rect.center)
class Projectile(pygame.sprite.Sprite):
def __init__(self, pos, direction):
super().__init__()
self.image = pygame.Surface((8, 8))
self.image.fill((0, 0, 0))
self.image.set_colorkey((0, 0, 0))
pygame.draw.circle(self.image, pygame.Color('orange'), (4, 4), 4)
self.rect = self.image.get_rect(center=pos)
self.direction = direction.normalize()
self.pos = pygame.Vector2(self.rect.center)
def update(self, events, dt):
self.pos += self.direction * dt
self.rect.center = self.pos
if not pygame.display.get_surface().get_rect().contains(self.rect):
self.kill()
def main():
pygame.init()
screen = pygame.display.set_mode((500, 500))
sprites = pygame.sprite.Group(Player())
clock = pygame.time.Clock()
dt = 0
while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
sprites.update(events, dt)
screen.fill((30, 30, 30))
sprites.draw(screen)
pygame.display.update()
dt = clock.tick(60)
if __name__ == '__main__':
main()
我一直在尝试为我正在制作的游戏(基于疯狂上帝的境界)实现一项功能,您可以在点击的地方射击。为此,我一直在尝试使用毕达哥拉斯和 运行 的上升或三角形的梯度法则来计算 x 和 y 每次必须移动多远才能保持稳定的速度并每次都保持该速度我点击。我看到人们到处都在使用角度和 python 2 而我目前正在使用 python 3 因此使代码兼容比仅仅询问更棘手。我的代码使用 类 来创建障碍物和纹理。我使用数组在游戏循环中存储和创建子弹,并使用 pygames 矩形功能将它们绘制到屏幕上。请参阅下面的代码(不包括所有代码)。
import pygame, random, time
pygame.init()
shoot= []
class Projectiles(object):
def __init__(self, pos):
self.rect = pygame.Rect(pos[0], pos[1], 20, 20)
shoot.append(self)
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
pygame.quit()
quit()
if event.key == pygame.K_a:
movement_status = pcharl
x_change = 5
if event.key == pygame.K_w:
movement_status = pcharb
y_change = 5
if event.key == pygame.K_s:
movement_status = pchar
y_change = -5
if event.key == pygame.K_d:
movement_status = pcharr
x_change = -5
if event.key == pygame.K_e:
pygame.display.toggle_fullscreen()
if event.key == pygame.K_SPACE:
shooting = True
if movement_status == pcharl:
Projectiles((x, y))
direction = "left"
bx_change = -8
shooting = True
if movement_status == pcharr:
Projectiles((x+30, y))
direction = "right"
bx_change = 8
shooting = True
if movement_status == pcharb:
Projectiles((x + 30, y))
direction = "up"
by_change = -8
shooting = True
if movement_status == pchar:
Projectiles((x + 30, y))
direction = "down"
by_change = 8
shooting = True
if event.type == pygame.KEYUP:
x_change = 0
y_change = 0
if event.type == pygame.MOUSEBUTTONDOWN:
xm,ym = pygame.mouse.get_pos()
shooting_arr = True
if movement_status == pchar:
Projectiles((x + 60, y))
bullx = 560
if movement_status == pcharb:
Projectiles((x + 60, y))
bullx = 560
if movement_status == pcharr:
Projectiles((x + 60, y))
bullx = 560
if movement_status == pcharl:
Projectiles((x, y))
bullx = 500
for bullet in shoot:
pygame.draw.rect(screen, (255, 100, 0), bullet.rect)
xm = xm - bullx
ym = ym - 500
if xm % 2 == 0 and ym % 2 == 0:
xm = xm / 2
ym = ym / 2
xm = xm / ym
ym = ym / xm
bx_change = xm
by_change = ym
print(str(xm) + " " + str(ym))
xm = 0
ym = 0
shooting = True
screen.fill((225, 50, 25))
if shooting:
for bullet in shoot:
pygame.draw.rect(screen, (255, 0, 255), bullet.rect)
bullet.rect.x += bx_change
bullet.rect.y += by_change
if bullet.rect.x <= 0:
shoot.remove(bullet)
if bullet.rect.x >= 1000:
shoot.remove(bullet)
if bullet.rect.y <= 0:
shoot.remove(bullet)
if bullet.rect.y >= 1000:
shoot.remove(bullet)
x 和 y 等于 500 屏幕尺寸为 1000x1000
通过从鼠标光标位置减去玩家位置来创建矢量。然后使用该矢量通过将其添加到射弹位置来移动射弹。
这是一个简单的例子:
import pygame
import math
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((32, 32))
self.image.fill((0, 0, 0))
self.image.set_colorkey((0, 0, 0))
pygame.draw.polygon(self.image, pygame.Color('dodgerblue'), ((0, 0), (16, 32), (32, 0)))
self.org_image = self.image.copy()
self.rect = self.image.get_rect(center=(200, 200))
self.direction = pygame.Vector2(0, 1)
def update(self, events, dt):
for e in events:
if e.type == pygame.MOUSEBUTTONDOWN:
self.groups()[0].add(Projectile(self.rect.center, self.direction))
self.direction = pygame.Vector2(pygame.mouse.get_pos()) - self.rect.center
self.image = pygame.transform.rotate(self.org_image, math.degrees(math.atan2(*self.direction)))
self.rect = self.image.get_rect(center=self.rect.center)
class Projectile(pygame.sprite.Sprite):
def __init__(self, pos, direction):
super().__init__()
self.image = pygame.Surface((8, 8))
self.image.fill((0, 0, 0))
self.image.set_colorkey((0, 0, 0))
pygame.draw.circle(self.image, pygame.Color('orange'), (4, 4), 4)
self.rect = self.image.get_rect(center=pos)
self.direction = direction.normalize()
self.pos = pygame.Vector2(self.rect.center)
def update(self, events, dt):
self.pos += self.direction * dt
self.rect.center = self.pos
if not pygame.display.get_surface().get_rect().contains(self.rect):
self.kill()
def main():
pygame.init()
screen = pygame.display.set_mode((500, 500))
sprites = pygame.sprite.Group(Player())
clock = pygame.time.Clock()
dt = 0
while True:
events = pygame.event.get()
for e in events:
if e.type == pygame.QUIT:
return
sprites.update(events, dt)
screen.fill((30, 30, 30))
sprites.draw(screen)
pygame.display.update()
dt = clock.tick(60)
if __name__ == '__main__':
main()