Die Condition am Ende der Methode ist hier relevant.
Ein ganz anderer Gedanke war, jede Figur mit jedem Pixel in einem Array zu halten, um dann einfach zu überprüfen ob sich einer der Pixel der Figur, welche gerade geprüft wird, in dem Array befindet (include?).
Allerdings kann man sich denken, dass dies sehr unperformant werden könnte und dem entgegen wird erwartet, dass das Mapping-System, welches zum Schluss raus kommt (mit dir8, Pixelmovement und so weiter), mit geschätzten 200 Events klar kommen muss. Da ist es verständlich, dass ich schnelle und speicher sparende Wege suche.
Der Code darin ist frisch und nicht refaktorisiert, entsprechend können also Redundanzen vorhanden sein oder unkommentierte Stellen enthalten sein.
Die Klasse Character_Cache ist hier die relevante, welche die Kollisions-Abfragen derzeit zugeschustert bekommt.
Ich suche also eine Alternative für self.get_range_characters(self_key), wo derzeit alle Charaktere gefunden werden sollen, welche genauestens geprüft werden müssen (da hier dann real einzelne Pixel geprüft werden müssen, ich das aber nur bei den Figuren mache, mit denen ich theoretisch kollidieren könnte).
Movement: Numpad (1-9 ohne 5), Pfeiltasten
Running: B (nicht B-7, funktioniert nicht.)
Beenden: Enter
Kollidierende Figuren ausgeben lassen: ESC
Kann dort jemand helfen und mir vielleicht sagen, wo ich was falsch mache?
Zusatzfrage: Wie kann ich mir die Speicheradresse einer Instanz von einem Objekt besorgen? (vgl. Pointer C++)
EDIT:
Bis auf die Zusatzfrage hat sich die Anfrage erledigt (:
def self.get_range_characters(my_key)
in_range = []
my_char = @@characters[my_key]
my_x = my_char.x
my_y = my_char.y
my_length = my_char.src_x
my_height = my_char.src_y
@@characters.each_pair { |key, figure_char|
next if key == my_key
diff_x = my_x - figure_char.x
diff_y = my_y - figure_char.y
if (diff_x.betrag <= my_length) && (diff_y.betrag <= my_height)
in_range.push key
end
}
in_range
end
# Zusätzlich:
class Integer
def betrag
return (self >= 0) ? self : (self * (-1))
end
end