Per hitTest Objekt stoppen

PHs

Mitglied
Hi, Community.

Versuch mich seit ein 2 Wochen mit Flash. Und hab auch schon so einige Tuts durch. Jetzt wollte ich ein kleine Game mal "selber" Programmieren, nur bin ich leider auf ein Problem gestoßen von dem ich nicht die Lösung finde. (b.z.w ob es überhaupt möglich ist)

Und hier mein Problem:

Ich will meinen Helden auf den Boden laufen lassen, soll heißen das er nicht in den Erdboden verschwindet soll. Zurzeit versuche ich es mit hitTest, nur ögendwie will es nicht funken.
Oder der Held verschwindet in den Erboden - oder er springt herum^^

kann man ögendwie mit hitTest definieren dass er den Boden nicht überkreuzen/überlappen darf? So dass man mit dem Held darauf laufen kann.

(P.S: der Held wird andauernd automatisch herunter gezogen, Erdanziehung. Sonst könnte er doch in der Luft stehen.)

Code:
onClipEvent (load) {
	power = 0.3;
	yspeed = 0;
	xspeed = 0;
	friction = 0.96;
	gravity = 0.1;
}

onClipEvent (enterFrame) {
	if (Key.isDown(Key.LEFT)) {
		xspeed -= power;
	}
	if (Key.isDown(Key.RIGHT)) {
		xspeed += power;
	}
	if (Key.isDown(Key.UP)) {
		yspeed -= power;

	}
	yspeed += gravity;
	xspeed *= friction;
	yspeed *= friction;
	_y += yspeed;
	_x += xspeed;
     if (_root.grenzen.hitTest(_x, _y, true)) {
		 	    >>was für ein befehl?<<

		 
		}
}

Thx für eure mithilfe. (konnte leider in Google und Forum-Suche nichts finde.)
 
Hi und willkommen,

Mein Lösungsvorschlag lautet wie folgt:
Code:
if (_root.grenzen.hitTest(_root.held)) {
		 	    _root.held._y=200;  //oder eine anderer Wert
}
Der funktioniert aber nur, wenn der Boden die ganze Zeit bei y=200 ist, sonst muss man mehrere MC's und if-Abfragen einbauen.

Das ganze ist wahrscheinlich optimierbar, vll fällt jem anderem noch was ein :)

Gruß marfirk
 
Ich würde die Gravitation immer nur dann anrechnen, wenn der held._y über einem bestimmten Wert, nämlich dem, den er wenn er auf dem Boden steht, hat, ist.
 
Der funktioniert aber nur, wenn der Boden die ganze Zeit bei y=200 ist, sonst muss man mehrere MC's und if-Abfragen einbauen.

Gruß marfirk

Die Idee ist gut, nur habe ich bei mir das Probleme dass es keine grade Fläche/Boden ist.
Es soll ein art Run&Jump Spiel werden, wo auch z.b Plattformen in der Luft hängen.


Ich würde die Gravitation immer nur dann anrechnen, wenn der held._y über einem bestimmten Wert, nämlich dem, den er wenn er auf dem Boden steht, hat, ist.

Musst mir erst 3 mal den Text durchlesen bis ich in richtig verstand. Aber ich glaube das ist wirklich die Lösung meines Problem. Trotzdem habe ich gehofft das es einen Code gibt den es einen Objekt verbietet den anderen zu Überkreuzen.

egal. Ich nehme mal an das du an sowas gedacht hast, Jens.

Code:
onClipEvent (load) {
	power = 0.3;
	yspeed = 0;
	xspeed = 0;
	friction = 0.96;
}

onClipEvent (enterFrame) {
	if (Key.isDown(Key.LEFT)) {
		xspeed -= power;
	}
	if (Key.isDown(Key.RIGHT)) {
		xspeed += power;
	}
	if (Key.isDown(Key.UP)) {
		yspeed -= power;
	}
	yspeed += gravity;
	xspeed *= friction;
	yspeed *= friction;
	_y += yspeed;
	_x += xspeed;
	     if (_root.grenzen.hitTest(this)) {
		 friction = 0
		 }
		 else
		 {
		 gravity = 0.1;
		 }
 
	}

Bei mir bleibt der Held einfach in der Luft hängen/ er kann sich nicht bewegen. Hat aber wahrscheinlich ein ganz anderen Grund den ich schon selber lösen werden kann.

Thx, euch beiden. :D
 
Hey,
du benutzt ja Flash 5-Syntax. Benutzt du auch Flash 5?

Ich würde das ganze so machen:

Code:
onClipEvent (enterFrame) {
	if (Key.isDown(Key.LEFT)) {
		xspeed -= power;
	}
	if (Key.isDown(Key.RIGHT)) {
		xspeed += power;
	}
	if (Key.isDown(Key.UP)) {
		yspeed -= power;
yspeed += gravity;
	} else {
	
if(this._y < 210) {
 yspeed = 0; // wenn der Held 
}
}
	xspeed *= friction;
	yspeed *= friction;
	_y += yspeed;
	_x += xspeed;
}

Sorry für die komische Formatierung, der Tutorials-Posteditor unterstützt ja leider keine Tabs.

Gruß.
 
Hm, ja. Wen ich das nur wüsste. *räusper* Bin newbie in Thema Flash. ^^

Also ich benutzte zur Zeit Macromedia Flash Prof 8 (Test Version). Ist aber wahrscheinlich nicht die Antwort zu deiner Frage, oder?

Zu den Code, den du grad reingestellt hast.

Wie gesagt würde ich gerne ein Jump&Run ähnliches Spiel maken. Ich habe es jetzt so bei mir stehen.

Code:
	     if (_root.boden.hitTest(this)) {
		 friction = 0;
		 }else{
		 gravity = 0.4;
		 }

Per den Pfeiltasten kann man jetzt nur noch Hochspringen und seitliche laufen. Also "nicht" runter, die braucht man ja nicht mehr - da ich die "Erdanziehung" nachahme. Deswegen möchte ich es so haben:

Falls der Held den Boden berührt: Friction auf 0 setzen.
Falls er nicht den Boden berührt: Soll die Gravity auf 0.4 gesetzt werden.

Somit müsste ein nicht eindringen in den Boden möglich sein, oder? Sollte doch so funktionieren. :confused:

Gruß, PH

( " yspeed *= friction; " --- bedeutet das "*" vielleicht mal? )
 
Zuletzt bearbeitet:
Dem Code nach sollte es mE funktionieren. Tut es das denn nicht? Und wenn nicht, was tut sich denn nicht?

( " yspeed *= friction; " --- bedeutet das "*" vielleicht mal? )

Das ist die Kurzform für :

Code:
yspeed = yspeed * friction;

und bedeutet "mal"....

Gruß marfirk
 
Ich hab dir mal ein Beispiel gebastelt. Ist durchaus verbesserungswürdig und wahrscheinlich nicht 100% sauber programmiert, aber macht die Idee deutlich.

Habe es angehängt.

Gruß
.
 

Anhänge

  • jumprun.fla
    23 KB · Aufrufe: 33
  • Gefällt mir
Reaktionen: PHs
Jo, das prob ist ja bei mir das es ja auch noch z.b Kisten rumliegen worauf man drauf springen kann/soll. Hab aber jetzt das Problem gelöst, sobald er den Kasten oder Boden berührt wird im die yspeed+ entzogen.

Mein einziges Problem wäre jetzt nur noch das ich einzeln die Objekte in die if abfrage reinstecken müsste. Da wenn man mehrer Objekte gleichzeitig in einen MovieClip konventiert, benutzt der die ganze höhe - deswegen muss ich einzeln die Kisten in MovieClip verwandeln.

Ist es ögendwie möglich mehrere Objekte zu "anvisieren". Also z.b:

if (_root.boden1 & boden2 & kiste1 & kiste3 .hitTest(this)) {

gibt es so eine Funktion? Immerhin schaffen andere Flasher es auch so aufwendige Spiele zu Programmieren. Und ich glaube ich das sie für jedes Objekt (Kiste, Boden, Berg) die _x un _y werte eingegeben haben. Das muss doch auch bequemer gehen :rolleyes:

Herzliche Gruß,
PH
 
Tag,
nenne die Kisten "kiste1" bis "kiste9999" und dann machs so:

Code:
for(i = 1; i <= 9999; i++) {
 if(this.hitTest(_root["kiste" + i])) {
  trace("ich bin auf ner kiste");
 }
}
 

Neue Beiträge

Zurück