C64..ach ja... ich kenne noch den Vorgänger C16 mit Datasette... Uuuahhhh... Aber wir hatten ja Nix....
Also, wenn Du das mit einem Arm im Vordergrund machen willst, dann rate ich zu Objekten.
Ich selber habe auch mal drüber nachgedacht etwas in der Art wie "Streetfighter" einzubauen.
Wenn Du nur zwei Arme zeigst, dann geht das Ganze mit einer Mischung aus Chars und Objekten.
Der sichtbare Gegner ist ein Char - damit er auch beim Näherkommen grösser wird.
Eine Variablenberechnung setzt per Randomnum fest, ob der Gegner sich entfernt oder näher kommt
und gibt dann einen Wert aus :
aktuelle Charposition +1y -> Gegner kommt näher,
aktuelle Charposition -1y -> Gegner entfernt sich,
Damit weisst Du, ob Du vielleicht ins Leere haust.
Ausserdem musst Du festlegen, welche y Position die maximale Entfernung im Raum sein darf, damit
der Feigling nicht abhaut...
Ebenso, welcher Y Wert direkt vor Dir endet, damit der Typ dich nicht über den Haufen rennt.
usw
Nur, wenn der Gegner die max Y Wert erreicht hat, wird eine Kollisionsabfrage gestartet werden
können. ( kostet sonst zu viel Rechenzeit )
Damit der Gegner etwas "tänzelt", wäre auch eine Änderung der x Position denkbar.
Dann brauchst Du min 4 Dummyobjekte :
-Deinen Kopf
-Deine Faust
-Gegnerkopf
-Gegnerfaust
Dein Kopf ist fix, bleibt also, wo er ist. Willst Du dich bewegen, änderst Du die x/y Koordinaten des
Gegners, ohne, das er sich bewegt.
Schlägt der Gegner zu, dann startet eine Funktion die Schlaganimation, wenn er dicht genug vor
Dir steht. Dabei bewegst Du das Dummyobjekt der Gegnerfaust an die gewünschte Stelle.
Auf halber Armlänge startest Du ( per Frameskript ) dann die Kollisionsabfrage.
Da dein Kopfobjekt wohl das Grösste ist, wird ein Treffer wahrscheinlich sein. Machst Du den Kopf
aber nicht zu breit, dann kannst Du Dich ja auch seitlich bewegen - die Faust geht neben das
Kopfobjekt und verfehlt - oder wenn Du dich ducken willst, geht es darüber.
Ist der Arm eingefahren, oder es wurde ein Treffer erkannt, endet die Abfrage.
Jetzt Du :
Wenn Du zuschlägst, wird die Kollisionsabfrage nur gestartet, wenn der Gegner dicht genug vor Dir steht. Andernfalls läuft nur die Animation ab. Der Gegner könnte dann z.B. fies lachen...
Ist er dicht genug dran, bewegst Du dein Faustobjekt von der Ruheposition dorthin, wo die Grafik die
Faust am ausgestreckten Arm hinführt. dann startet die Kollisionsabfrage mit dem gegnerischen Kopf
( der ja kleiner ist ) , welcher sich passend mit dem Char seitlich bewegt. ( vor / zurück macht keinen Sinn, da ja nur getroffen wird, wenn er dicht genug vor dir steht )
Da ich während des Schreibens nachgedacht habe, kann vielleicht noch ne kleine Schwachstelle
drin sein...

Ist eben mit heisser Nadel gestrickt.
on (enter)
{
Setnum (Gegner_max_y;20) -> Gegner bei Y=20 am weitesten weg
Setnum (Gegner_min_y;25) -> Gegner direkt vor Dir
Setnum (Gegner_max_x;35) -> Gegner am Weitesten rechts
Setnum (Gegner_min_x;25) -> Gegner am Weitesten links
setnum (Treffer_min_x;29) -> Treffer nur möglich, wenn Gegner min x=29 oder
setnum (Treffer_max_x;31) -> x=31 hat, sonst zu weit rechts oder links
}
Der Y Laufbereich des Gegners leigt im Raum also zwischen Walkmappunkten Y20 und Y25
Der Trefferbereich liegt zwischen Walkmappunkten 29 und 31.
on (loop1)
moveobj (Gegnerdummy_Kopf; [charx:Gegner]-30;[chary:Gegner]-150;0)
Damit bewegst Du das Kopfobjekt passend zu den Walkmappunkten des Gegners.
Die Zahlen können variieren, musst du testen, kommt auf die Grössen an.
on (loop2)
{
randomnum (walkchar_y;6)
randomnum (walkchar_x;11)
setnum (current_GX;[charx;gegner]) ->aktuelle Gegnerposition feststellen
setnum (current_GY;[chary;gegner])
if_num (walkchar_x;11)
setnum (current_GX;[charx;gegner]) -> Wert 11= keine X Änderung
if_num (walkchar_y;6)
setnum (current_GY;[chary;gegner]) -> Wert 6= keine Y Änderung
if_num (walkchar_x;1)
{
if_num (current_GX;<36) -> Wenn Gegner x 35 noch nicht erreicht hat
setnum (current_GX;+1)
}
if_num (walkchar_x;2)
{
if_num (current_GX;<34)
setnum (current_GX;+2)
}
if_num (walkchar_x;3)
{
if_num (current_GX;<32)
setnum (current_GX;+3)
}
if_num (walkchar_x;4)
{
if_num (current_GX;<30)
setnum (current_GX;+4)
}
walkto (Gegner;[current_GX];[current_GY];1)
}
Das wäre ein Ansatz, wie der Gegner sich seitlich innerhalb der definierten Grenzen bewegen
könnte.
Jetzt brauch ich erstmal nen Kaffee...
Gruss
Manni