Anonymous
Как заставить игрока в шутере вращаться вместе с мышью? [дубликат]
Сообщение
Anonymous » 19 дек 2024, 00:32
Я хотел, чтобы игрок следовал направлению мыши во время ее движения, чтобы он мог целиться более чем в 4 направлениях.
Я написал этот код, чтобы повернуть его, но он не сработал.< /p>
Код: Выделить всё
def rotate(self):
mouse_pos = pygame.Vector2(pygame.mouse.get_pos())
angle = degrees(atan2(mouse_pos.x, mouse_pos.y)) - 90
self.image = pygame.transform.rotozoom(self.original_image, angle, 1)
Я долго боролся с этим, но так и не смог найти проблему.
main.py
Код: Выделить всё
from settings import *
from sprites import *
from pytmx.util_pygame import load_pygame
from support import *
from groups import *
class Game:
def __init__(self):
pygame.init()
self.display_surface = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption('Survivor')
self.clock = pygame.time.Clock()
self.running = True
self.load_folder()
# Groups
self.all_sprites = AllSprites()
self.collision_sprites = pygame.sprite.Group()
self.cursor = pygame.transform.scale(pygame.image.load("cursor.png"), (32,32))
pygame.mouse.set_visible(False)
self.setup()
def load_folder(self):
self.characters = import_folder("characters")
def setup(self):
map = load_pygame("data/world.tmx")
for x, y, image in map.get_layer_by_name("Main").tiles():
Sprite((x * TILE_SIZE, y * TILE_SIZE), image, self.all_sprites)
pass
for x, y, image in map.get_layer_by_name("Collision").tiles():
Sprite((x * TILE_SIZE, y * TILE_SIZE), image, (self.all_sprites, self.collision_sprites))
for obj in map.get_layer_by_name("Entities"):
if obj.name == "Player":
self.player = Player((obj.x, obj.y), self.characters[0], self.all_sprites, self.collision_sprites)
if obj.name == "Enemy":
self.enemy1 = Enemy((obj.x, obj.y), self.characters[randint(0,20)], self.player,self.all_sprites,
self.collision_sprites)
if obj.name == "Enemy2":
self.enemy2 = Enemy((obj.x, obj.y), self.characters[randint(0,20)], self.player,self.all_sprites, self.collision_sprites)
def run(self):
while self.running:
dt = self.clock.tick(60) / 1000
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
self.all_sprites.update(dt)
self.display_surface.fill("black")
self.all_sprites.draw(self.player.rect.center)
pos = pygame.mouse.get_pos()
self.display_surface.blit(self.cursor, pos)
pygame.display.update()
if __name__ == "__main__":
game = Game()
game.run()
sprites.py
Код: Выделить всё
from settings import *
from math import atan2, degrees
class Sprite(pygame.sprite.Sprite):
def __init__(self, pos, surf, groups):
super().__init__(groups)
self.image = surf
self.rect = self.image.get_frect(center= pos)
class Bullet(pygame.sprite.Sprite):
def __init__(self, surf, pos, direction, groups):
super().__init__(groups)
self.image = surf
self.rect = self.image.get_rect(center=pos)
self.direction = direction
self.speed = 850
self.image = pygame.transform.flip(self.image, direction==-1, False)
def update(self, dt):
self.rect.x += self.direction * self.speed*dt
class Player(pygame.sprite.Sprite):
def __init__(self, pos, surf,groups,collision_sprites):
super().__init__(groups)
self.all_sprites = groups
surf = pygame.transform.scale(surf, (80, 53*2))
self.original_image = pygame.transform.rotate(surf, 90)
self.original_image = self.original_image
self.image = self.original_image
self.rect = self.image.get_rect(center= pos)
self.rect = self.rect.inflate(-30,0)
self.bullet_surf = pygame.image.load("bullets/player bullet.png")
self.speed = 500
self.direction = pygame.Vector2()
self.collision_sprites = collision_sprites
self.can_shoot = True
self.duration = 400
self.start_time = 0
self.flipx = False
self.flipy = False
def collision(self, direction):
for sprite in self.collision_sprites:
if sprite.rect.colliderect(self.rect):
if direction == "horizontal":
if self.direction.x > 0:
self.rect.right = sprite.rect.left
if self.direction.x < 0:
self.rect.left = sprite.rect.right
else:
if self.direction.y > 0:
self.rect.bottom = sprite.rect.top
if self.direction.y < 0:
self.rect.top = sprite.rect.bottom
def cooldown(self):
if self.can_shoot == False:
current_time = pygame.time.get_ticks()
if current_time - self.start_time >= self.duration:
self.can_shoot = True
def input(self):
keys = pygame.key.get_pressed()
mouse = pygame.mouse.get_pressed()
self.direction.x = int(keys[pygame.K_RIGHT]) - int(keys[pygame.K_LEFT])
self.direction.y = int(keys[pygame.K_DOWN]) - int(keys[pygame.K_UP])
self.direction = self.direction.normalize() if self.direction else self.direction
if mouse[0] and self.can_shoot:
self.can_shoot = False
self.start_time = pygame.time.get_ticks()
Bullet(self.bullet_surf, self.rect.center, -1 if self.flipx else 1, self.all_sprites)
self.cooldown()
# def flip_image(self):
# if self.direction:
# self.flipx = self.direction.x < 0
# if self.direction.y > 0:
# if self.direction.y < 0:
#
# self.image = pygame.transform.rotozoom(pygame.transform.flip(self.original_image, self.flipx, False))
def rotate(self):
mouse_pos = pygame.Vector2(pygame.mouse.get_pos())
angle = degrees(atan2(mouse_pos.x, mouse_pos.y)) - 90
self.image = pygame.transform.rotozoom(self.original_image, angle, 1)
def move(self, dt):
self.rotate()
self.rect.x += self.direction.x * self.speed * dt
self.collision("horizontal")
self.rect.y += self.direction.y * self.speed * dt
self.collision("vertical")
def update(self, dt):
self.input()
self.move(dt)
class Enemy(pygame.sprite.Sprite):
def __init__(self, pos, surf, player, groups, collision_sprites):
super().__init__(groups)
surf = pygame.transform.scale(surf, (80, 53 * 2))
self.original_image = pygame.transform.rotate(surf, 270)
self.original_image = self.original_image
self.image = self.original_image
self.rect = self.image.get_rect(center=pos)
self.rect = self.rect.inflate(-30, 0)
self.speed = randint(300, 400)
self.player = player
self.direction = pygame.Vector2()
self.collision_sprites = collision_sprites
self.flip = False
def collision(self, direction):
for sprite in self.collision_sprites:
if sprite.rect.colliderect(self.rect):
if direction == "horizontal":
if self.direction.x > 0:
self.rect.right = sprite.rect.left
if self.direction.x < 0:
self.rect.left = sprite.rect.right
else:
if self.direction.y > 0:
self.rect.bottom = sprite.rect.top
if self.direction.y < 0:
self.rect.top = sprite.rect.bottom
def move(self, dt):
player_pos = pygame.Vector2(self.player.rect.center)
enemy_pos = pygame.Vector2(self.rect.center)
distance = player_pos.distance_to(enemy_pos)
if distance > 100:
self.direction = (player_pos - enemy_pos).normalize()
self.rect.x += self.direction.x * self.speed * dt
self.collision("horizontal")
self.rect.y += self.direction.y * self.speed * dt
self.collision("vertical")
self.flip = self.direction.x > 0
self.image = pygame.transform.flip(self.original_image, self.flip, False)
self.rect = self.image.get_rect(center=self.rect.center)
def update(self, dt):
self.move(dt)
Это код для main.py и sprites.py. Я изо всех сил пытался найти какие-либо проблемы, но возможные ответы были бы полезны.
Подробнее здесь:
https://stackoverflow.com/questions/792 ... -the-mouse
1734557543
Anonymous
Я хотел, чтобы игрок следовал направлению мыши во время ее движения, чтобы он мог целиться более чем в 4 направлениях. Я написал этот код, чтобы повернуть его, но он не сработал.< /p> [code] def rotate(self): mouse_pos = pygame.Vector2(pygame.mouse.get_pos()) angle = degrees(atan2(mouse_pos.x, mouse_pos.y)) - 90 self.image = pygame.transform.rotozoom(self.original_image, angle, 1) [/code] Я долго боролся с этим, но так и не смог найти проблему. main.py[code] from settings import * from sprites import * from pytmx.util_pygame import load_pygame from support import * from groups import * class Game: def __init__(self): pygame.init() self.display_surface = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) pygame.display.set_caption('Survivor') self.clock = pygame.time.Clock() self.running = True self.load_folder() # Groups self.all_sprites = AllSprites() self.collision_sprites = pygame.sprite.Group() self.cursor = pygame.transform.scale(pygame.image.load("cursor.png"), (32,32)) pygame.mouse.set_visible(False) self.setup() def load_folder(self): self.characters = import_folder("characters") def setup(self): map = load_pygame("data/world.tmx") for x, y, image in map.get_layer_by_name("Main").tiles(): Sprite((x * TILE_SIZE, y * TILE_SIZE), image, self.all_sprites) pass for x, y, image in map.get_layer_by_name("Collision").tiles(): Sprite((x * TILE_SIZE, y * TILE_SIZE), image, (self.all_sprites, self.collision_sprites)) for obj in map.get_layer_by_name("Entities"): if obj.name == "Player": self.player = Player((obj.x, obj.y), self.characters[0], self.all_sprites, self.collision_sprites) if obj.name == "Enemy": self.enemy1 = Enemy((obj.x, obj.y), self.characters[randint(0,20)], self.player,self.all_sprites, self.collision_sprites) if obj.name == "Enemy2": self.enemy2 = Enemy((obj.x, obj.y), self.characters[randint(0,20)], self.player,self.all_sprites, self.collision_sprites) def run(self): while self.running: dt = self.clock.tick(60) / 1000 for event in pygame.event.get(): if event.type == pygame.QUIT: self.running = False self.all_sprites.update(dt) self.display_surface.fill("black") self.all_sprites.draw(self.player.rect.center) pos = pygame.mouse.get_pos() self.display_surface.blit(self.cursor, pos) pygame.display.update() if __name__ == "__main__": game = Game() game.run() [/code] sprites.py [code]from settings import * from math import atan2, degrees class Sprite(pygame.sprite.Sprite): def __init__(self, pos, surf, groups): super().__init__(groups) self.image = surf self.rect = self.image.get_frect(center= pos) class Bullet(pygame.sprite.Sprite): def __init__(self, surf, pos, direction, groups): super().__init__(groups) self.image = surf self.rect = self.image.get_rect(center=pos) self.direction = direction self.speed = 850 self.image = pygame.transform.flip(self.image, direction==-1, False) def update(self, dt): self.rect.x += self.direction * self.speed*dt class Player(pygame.sprite.Sprite): def __init__(self, pos, surf,groups,collision_sprites): super().__init__(groups) self.all_sprites = groups surf = pygame.transform.scale(surf, (80, 53*2)) self.original_image = pygame.transform.rotate(surf, 90) self.original_image = self.original_image self.image = self.original_image self.rect = self.image.get_rect(center= pos) self.rect = self.rect.inflate(-30,0) self.bullet_surf = pygame.image.load("bullets/player bullet.png") self.speed = 500 self.direction = pygame.Vector2() self.collision_sprites = collision_sprites self.can_shoot = True self.duration = 400 self.start_time = 0 self.flipx = False self.flipy = False def collision(self, direction): for sprite in self.collision_sprites: if sprite.rect.colliderect(self.rect): if direction == "horizontal": if self.direction.x > 0: self.rect.right = sprite.rect.left if self.direction.x < 0: self.rect.left = sprite.rect.right else: if self.direction.y > 0: self.rect.bottom = sprite.rect.top if self.direction.y < 0: self.rect.top = sprite.rect.bottom def cooldown(self): if self.can_shoot == False: current_time = pygame.time.get_ticks() if current_time - self.start_time >= self.duration: self.can_shoot = True def input(self): keys = pygame.key.get_pressed() mouse = pygame.mouse.get_pressed() self.direction.x = int(keys[pygame.K_RIGHT]) - int(keys[pygame.K_LEFT]) self.direction.y = int(keys[pygame.K_DOWN]) - int(keys[pygame.K_UP]) self.direction = self.direction.normalize() if self.direction else self.direction if mouse[0] and self.can_shoot: self.can_shoot = False self.start_time = pygame.time.get_ticks() Bullet(self.bullet_surf, self.rect.center, -1 if self.flipx else 1, self.all_sprites) self.cooldown() # def flip_image(self): # if self.direction: # self.flipx = self.direction.x < 0 # if self.direction.y > 0: # if self.direction.y < 0: # # self.image = pygame.transform.rotozoom(pygame.transform.flip(self.original_image, self.flipx, False)) def rotate(self): mouse_pos = pygame.Vector2(pygame.mouse.get_pos()) angle = degrees(atan2(mouse_pos.x, mouse_pos.y)) - 90 self.image = pygame.transform.rotozoom(self.original_image, angle, 1) def move(self, dt): self.rotate() self.rect.x += self.direction.x * self.speed * dt self.collision("horizontal") self.rect.y += self.direction.y * self.speed * dt self.collision("vertical") def update(self, dt): self.input() self.move(dt) class Enemy(pygame.sprite.Sprite): def __init__(self, pos, surf, player, groups, collision_sprites): super().__init__(groups) surf = pygame.transform.scale(surf, (80, 53 * 2)) self.original_image = pygame.transform.rotate(surf, 270) self.original_image = self.original_image self.image = self.original_image self.rect = self.image.get_rect(center=pos) self.rect = self.rect.inflate(-30, 0) self.speed = randint(300, 400) self.player = player self.direction = pygame.Vector2() self.collision_sprites = collision_sprites self.flip = False def collision(self, direction): for sprite in self.collision_sprites: if sprite.rect.colliderect(self.rect): if direction == "horizontal": if self.direction.x > 0: self.rect.right = sprite.rect.left if self.direction.x < 0: self.rect.left = sprite.rect.right else: if self.direction.y > 0: self.rect.bottom = sprite.rect.top if self.direction.y < 0: self.rect.top = sprite.rect.bottom def move(self, dt): player_pos = pygame.Vector2(self.player.rect.center) enemy_pos = pygame.Vector2(self.rect.center) distance = player_pos.distance_to(enemy_pos) if distance > 100: self.direction = (player_pos - enemy_pos).normalize() self.rect.x += self.direction.x * self.speed * dt self.collision("horizontal") self.rect.y += self.direction.y * self.speed * dt self.collision("vertical") self.flip = self.direction.x > 0 self.image = pygame.transform.flip(self.original_image, self.flip, False) self.rect = self.image.get_rect(center=self.rect.center) def update(self, dt): self.move(dt) [/code] Это код для main.py и sprites.py. Я изо всех сил пытался найти какие-либо проблемы, но возможные ответы были бы полезны. Подробнее здесь: [url]https://stackoverflow.com/questions/79290738/how-do-i-make-the-player-in-my-shooter-game-rotate-along-with-the-mouse[/url]