私は、プレーヤーの想像上の「視線」に何かがあるかどうかを「検出」する方法を理解しようとすると、深刻な問題を抱えています。私は単純な壁を作りました。このアイデアは、プレーヤーが壁を狙ってマウスのクリックボタンを同時に押すと何かを印刷することです。ここでmath.atan2関数を使ってオブジェクトが別のオブジェクトの「視線」にあるかどうかを検出する方法は?
は私のコードです:
import sys
import pygame
import math
pygame.init()
screen_width = 640
screen_height = 480
screen = pygame.display.set_mode((screen_width, screen_height))
running = True
class Actor:
def __init__(self, x, y, w, h):
self.x = x
self.y = y
self.w = w
self.h = h
class Wall:
def __init__(self):
Actor.__init__(self, 300, 100, 128, 32)
self.surface = pygame.Surface((self.w, self.h))
self.surface.fill((0, 0, 0))
def draw(self):
screen.blit(self.surface, (self.x, self.y))
class Player(Actor):
def __init__(self):
Actor.__init__(self, 0, 0, 64, 64)
self.surface = pygame.transform.scale(pygame.image.load("GFX/player.png"), (self.w, self.h))
self.rotated_surface = self.surface.copy()
self.rect = self.surface.get_rect()
self.directions = [False, False, False, False]
self.speed = 0.1
self.running = False
def rotate(self):
mouse_x = pygame.mouse.get_pos()[0]
mouse_y = pygame.mouse.get_pos()[1]
angle = math.atan2(mouse_y - (self.y + (self.w/2)), mouse_x - (self.x + (self.w/2)))
angle = angle * (180/math.pi)
rot_image = pygame.transform.rotozoom(self.surface, -angle + 270, 1)
rot_rect = self.rect.copy()
rot_rect.center = rot_image.get_rect().center
self.rotated_surface = rot_image
def move(self):
if self.directions[0]:
self.y -= self.speed
if self.directions[1]:
self.y += self.speed
if self.directions[2]:
self.x -= self.speed
if self.directions[3]:
self.x += self.speed
if self.running:
self.speed = 0.2
else:
self.speed = 0.1
def draw(self):
screen.blit(self.rotated_surface, (self.x, self.y))
pygame.draw.aaline(screen, (0, 255, 0), (player.x + (player.w/2), player.y), pygame.mouse.get_pos())
def fire(self, actor):
bullet_x_pos = self.x + (self.w/2)
bullet_y_pos = self.y
# ...
player = Player()
wall = Wall()
def redraw():
screen.fill((75, 0, 0))
player.draw()
player.move()
wall.draw()
pygame.display.flip()
while (running):
for e in pygame.event.get():
if e.type == pygame.QUIT:
sys.exit()
elif e.type == pygame.KEYDOWN:
if e.key == pygame.K_ESCAPE:
sys.exit()
if e.key == pygame.K_w:
player.directions[0] = True
if e.key == pygame.K_s:
player.directions[1] = True
if e.key == pygame.K_a:
player.directions[2] = True
if e.key == pygame.K_d:
player.directions[3] = True
if e.key == pygame.K_LSHIFT:
player.running = True
elif e.type == pygame.KEYUP:
if e.key == pygame.K_w:
player.directions[0] = False
if e.key == pygame.K_s:
player.directions[1] = False
if e.key == pygame.K_a:
player.directions[2] = False
if e.key == pygame.K_d:
player.directions[3] = False
if e.key == pygame.K_LSHIFT:
player.running = False
elif e.type == pygame.MOUSEMOTION:
player.rotate()
elif e.type == pygame.MOUSEBUTTONDOWN:
print("Yep")
redraw()
ここでの画像です:
特にPythonの/ pygameのためにそれについてのウェブ上に十分な材料、(私はシューティングゲームが非常にではありません推測はありませんライブラリ上で共通)。私はatan2から返された角度に基づいてブール値を返す方法を知らず、プレイヤーがオブジェクトを目標にしていることを伝えています。
ウェブ上には多くの情報がありますが、この問題は「レイキャスティング」 –
と言われています。これは基本的な高校の数学で、ウェブ上でも見ることができます。あなたは、あなたが理解していないことをより正確にする必要があります。 – Evert
線と矩形の交差点を評価しようとしています。 'atan2'関数は必要ありません。 –