2016-07-08 8 views
0

私は2dトップダウンシューティングゲームを作っています。理想的には、プレイヤーが彼/彼女を見るときに敵を撃って欲しいと思っています(プレイヤーがクレートの背後に隠れる可能性があります)Pygame Raycasting of sight

私は研究を行っており、これを行うための最善の方法はレイキャスティングだと思います。私はパイゲでレイキャスティングの良い例を見つけることができませんでした。

また、私は別のstackoverflowの質問(Pygame Line of Sight from Fixed Position

def isInLine(player, person): 
    deltaX = person[0] - player[0] 
    deltaY = person[1] - player[1] 

    if (person[0] == player[0]) or (person[1] == player[1]) or (abs(deltaX) == abs(deltaY)): 
     return true 

にコードのこの作品を見たが、私はそれは私がしたい事の種類をaccomplsihかどうかわからない、それがあれば私はどのように私がそれを実装するか分からない。

私が求めているのは、まず私が使っているコードが私がやりたいことを達成するかどうかです。もしそうなら、私はそれをどのように実装し、それを行うよりよい方法がありますか?

+2

正確に何を求めていますか?あなたの投稿は一連の声明ですが、疑問はありません。 – MattDMo

+0

まず、私が作業を追加したコードはどうすればよいでしょうか? – randomtoenailmonkey

答えて

1

変数 'player'と 'person'がプレイヤーと敵の位置であると仮定していますか?

  • 同じx位置にある(人[0] ==プレーヤー[0])
  • が同じyの位置にある(:その場合はどちらかの2つのオブジェクトがあれば、あなたが追加したコードがチェックされます
  • は同じxとyの差があります。すなわち、オブジェクトは互いに45度です(abs(deltaX)== abs(deltaY))。

これはあなたが望むようには見えません。

  • 敵とバリアの間の角度が敵とプレイヤーとの間の角度に等しいです:あなたがあればチェックするとうまくいくかもしれない何

    です。これを行う1つの方法は、tan(angle)=対向/隣接、またはdeltaY/deltaXを使用することです。

  • 敵はバリケードよりもプレイヤーから離れています。これはピタゴラスを使用して行うことができます。

    import math 
    
    def isInLine(enemy_pos, player_pos, barrier_pos): 
        # get x and y displacements from enemy to objects 
        playerDX = player_pos[0] - enemy_pos[0] 
        playerDY = player_pos[1] - enemy_pos[1] 
        barrierDX = barrier_pos[0] - enemy_pos[0] 
        barrierDY = barrier_pos[1] - enemy_pos[1] 
    
        # have to convert to degrees, as math uses radians 
        playerAngle = math.degrees(math.atan(playerDY/playerDX)) 
        barrierAngle = math.degrees(math.atan(barrerDY/barrierDX)) 
    
        # use pythagoras to find distances 
        playerDist = math.sqrt((playerDX)**2 + (playerDY)**2) 
        barrierDist = math.sqrt((barrierDX)**2 + (barrierDY)**2) 
    
        return (playerAngle == barrierAngle) and (playerDist > barrierDist) 
    

    をだから、敵からのプレイヤーとバリアの角度が同じラインに沿っていること、等しい場合:ここでは

は役立つかもしれない、このための機能です。敵がバリケードよりもプレイヤーから離れている場合、プレイヤーは敵と比較してバリケードの後ろにいます。

EDIT:実際には、これは敵からバリアまでのラインが敵からプレーヤまでのラインと正確に等しい場合にのみ機能します。これは、バリアの範囲を考慮に入れて編集する必要があるかもしれません。