Ergebnis 1 bis 15 von 15

Thema: Wie lässt sich Auto-Aim implementieren?

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #2
    Hm, bin mir nicht sicher ob ich dich richtig verstehe. Der Held zielt auf den Gegner. Die Schussbahn ist eine Gerade vom Helden zum Gegner, die eine Reihe von Tiles schneidet. Ist eines der Tiles ein Hinderniss, kann der Charakter den Gegner nicht treffen.
    Die Schussbahn kann man ja folgendermaßen beschreiben:
    (tx, ty) = (sx, sy) + (x, y)
    tx/ty sind Zielkoordinaten, sx/sy sind Startkoordinaten, s/y ist die Richtung

    Für ein gegebenes dx kann man jetzt nach einem dy suchen für das (dx,dy) von der Gerade geschnitten wird:
    dx = sx+ x*a
    a = (dx-sx)/x
    dy = sy + y*a

    Das kann man analog auch mit dy als Parameter und dx als gesuchte Variable machen.

    So kannst du alle Tiles iterieren die von der Geraden geschnitten werden.

    Mal als Beispielalgorithmus:
    Code:
    def cut_tiles sx, sy, tx, ty
      sx, tx = [sx, tx].sort
      sy, ty = [sy, ty].sort
      x = (tx-sx).to_f
      y = (ty-sy).to_f
      if x > y
        (sx..tx).each {|dx|
          a = (dx - sx)/x
          dy = (sy + a*y).to_i
          yield(dx, dy)
        }
      else
        (sy..ty).each {|dy|
          a = (dy - sy)/y
          dx = (sx + a*x).to_i
          yield(dx, dy)
        }
      end
    end
    
    def hinderniss? sx, sy, tx, ty
      cut_tiles(sx, sy, tx, ty) do |x, y|
        if terrain_id(x, y) == hinderniss_id
          return false
        end
      end
      true
    end

    Geändert von -KD- (10.04.2012 um 18:39 Uhr) Grund: noch ein bissel optimiert

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •