Volledige versie bekijken : Platform hittest
Stienzer
%Europe/Berlin %784 %2008, 18:49
Hallo,
Ik ben bezig met een simpele platform game, ik heb de besturing inmiddels gemaakt in een extern as bestand
Alleen nu wil ik dat de speler altijd op de blauwe balkjes(de platforms) kan blijven staan en er dus ook niet aan de zijkanten en boven kanten doorheen kan springen.
Hoe krijg ik dit voor elkaar doormiddel van hittest in een extern as. bestand?
De gehele grond moet dus eigen een hittest op gedaan worden, wanneer het bolletje de grond raakt moet deze op de grond blijven staan, en kan er niet doorheen springen/zakken.
Hier is wat ik tot nu toe heb:
http://www.stienzers.nl/spel.swf
Moet ik de hittest uitvoeren op de grond? of juist op het bolletje?
deresen
%Europe/Berlin %860 %2008, 20:39
Je kan hiervoor inderdaad goed hittest gebruiken.
Het maakt niets uit hoe je dat doet, door middel van:
grond.hitTest(bal)
of
bal.hitTest(grond)
Mooi zou natuurlijk zijn: bal.hitTest(grond)
Want als je het gewoon vertaald ziet het er zo uit:
Als de bal de grond raakt, dan mag die er niet doorheen zakken.
Dat is logischer dan:
Als de grond tegen de bal aan komt doordat de bal beweegt moet deze de bal stoppen.
Het kan wel, maar ik vind de eerste mooier omdat de bal beweegt.
Stienzer
%Europe/Berlin %920 %2008, 22:05
Oke, dit heb ik tot nu toe voor het bolletje:
class bol extends MovieClip
{
var xspeed: Number;
var yspeed: Number;
var gravity: Number;
var jumping: Boolean;
var currentFloor: Number;
var noHit: Boolean;
function bol(){
this.xspeed = 15;
this.yspeed = 0;
this.gravity = 17;
this.jumping = true;
this.noHit = true;
this.currentFloor = 600;
this.onEnterFrame = EnterFrame;
}
function EnterFrame(){
if (Key.isDown(Key.LEFT))
{
this._x -= xspeed;
this.gotoAndPlay(12);
}
if (Key.isDown(Key.RIGHT))
{
this._x += xspeed;
this.gotoAndPlay(1);
}
if (Key.isDown(Key.UP) and !jumping)
{
this.yspeed = this.gravity;
this.jumping = true;
}
if (this.jumping) {
this._y -= --yspeed;
// if this y is greater then the current floor, jumping is possible and players stops falling
if (this._y > this.currentFloor)
{
this._y = this.currentFloor;
this.jumping = false;
}
// if not hitting any walls player is jumping
if (this.currentFloor == 600 and this.noHit)
{
this.jumping = true;
}
// not jumping when the player it's y is equal to the currentFloor
if (this._y == this.currentFloor)
{
this._y = this.currentFloor;
this.jumping = false;
}
}
}
}
Hoe voeg ik de hittest van de grond daaraan toe dan?
deresen
%Europe/Berlin %929 %2008, 22:18
Die zet je in de onEnterFrame.
Als je precies wilt weten hoe de hitTest werkt moet je hier even naar kijken:
http://www.kirupa.com/developer/actionscript/hittest.htm
Stienzer
%Europe/Berlin %895 %2008, 21:29
Hallo,
Ik heb het nu zo opgelost:
class wall extends MovieClip{
function onEnterFrame()
{
if(this.hitTest(_root.speler._x,_root.speler._y,tr ue))
{
_root.speler.currentFloor = this._y;
_root.speler.jumping = false;
}
if(!this.hitTest(_root.speler._x,_root.speler._y,t rue) and this._y == _root.speler.currentFloor)
{
_root.speler.jumping = true;
_root.speler.noHit = true;
_root.speler.currentFloor = 600;
}
}
}
http://www.stienzers.nl/platform.swf Kijk maar...
Maar zoals je ziet zakt ie soms verder door het platform, de ene keer blijft de speler er bovenop staan de andere x zaktie ietsje verder.. Hoe kan dat??
Jan
%Europe/Berlin %127 %2008, 03:03
if(this.hitTest(_root.speler._x,_root.speler._y,tr ue))
{
_root.speler._y = this._y-_root.speler._height;
_root.speler.currentFloor = this._y;
_root.speler.jumping = false;
}
En het gebruik van _root moet je eigenlijk vermijden en zeker in een class.
Jan
Stienzer
%Europe/Berlin %683 %2008, 16:24
Waarom als ik vragen mag? :)
Trouwens, de code die je hebt toegevoegt werkt niet, de speler flipt em nu en springt automatisch de hele tijd op en neer en stopt dan en blijft onder een blokje hangen, hij raakt de grond dus niet meer..
En waar geef ik de stage width en height aan, zodat het poppetje niet meer buiten het beeld kan lopen?
Jan
%Europe/Berlin %702 %2008, 16:51
Waarom als ik vragen mag? :)
Omdat _root een absolute verwijzing is naar de main time line.
Stel dat je meerdere games gaat maken en uiteindelijk een portfolio maakt waar je deze games (swf's) inlaadt (via loadMovie bijvoorbeeld of de MovieClipLoader class) dan werken je games niet meer want _root verwijst dan naar de hoofdtijdlijn van je portfolio en niet (meer) naar de (vroegere) (hoofd)tijdlijn van je game movie.
Andere situatie maar dezelfde bekommernis:
http://www.flashfocus.nl/forum/showthread.php?t=39678 (één van jullie twee zal met _lockroot* moeten gaan 'knoeien'.)
En voor classes geldt dit eens te meer. Je wil toch zoveel mogelijk code reusability. En dat doe je voor een groot deel zoniet volledig teniet door er absolute verwijzingen als _root in te steken.
Groeten, :°)
Jan
*A Boolean value that specifies what _root refers to when a SWF file is loaded into a movie clip. The _lockroot property is undefined by default. You can set this property within the SWF file that is being loaded or in the handler that is loading the movie clip.
For example, suppose you have a document called Games.fla that lets a user choose a game to play, and loads the game (for example, Chess.swf) into the game_mc movie clip. Make sure that, after being loaded into Games.swf, any use of _root in Chess.swf refers to _root in Chess.swf (not _root in Games.swf). If you have access to Chess.fla and publish it to Flash Player 7 or later, you can add this statement to Chess.fla on the main Timeline:
this._lockroot = true;
Stienzer
%Europe/Berlin %708 %2008, 17:00
Oké ik begrijp het. Bedankt :)
Zou je me nu kunnen uitleggen waarom dat stukje code wat je aan mijn code hebt toegevoegt niet werkt? Het bolletje blijft maar springen en blijft op het laatst hangen aan een platformpje..
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.