vinTagesworld Flash forum

Stel zelf een vraag in het flash forum!


zwaartekracht
blokje door W0utah op 17-01-09 om 15:18
Hey, ik ben bezig met het maken van een soort "physics engine", maar al direct in het begin zit ik wat vast.

Ik wil namelijk zwaartekracht toevoegen over mijn hele stage (of toch een movieclips die alle object vasthoud);

Dit is wat ik al heb:
http://physics.woutr.be/physics_test.html
Maar nu zit ik met het probleem wanneer het balletje terug op zijn hoogtepunt is moet hij weer naar beneden vallen.
Daarom heb ik deze controle ingebouwd:
actionscript code

if(item.speedY > -0.5)
        {
          item.speedY *= -1;
        }
 

Maar natuurlijk als de snelheid te laag is loopt alles vast.

Dit is mijn volledige code:
actionscript code

init();
function init():void {
  drawBal();
  stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
function drawBal():void {
  var bal:MovieClip = new MovieClip();
  bal.graphics.beginFill(0xFFFFFF);
  bal.graphics.drawCircle(20, 10, 10);
  bal.graphics.endFill();
  bal.speedY = 10;
  holder.addChild(bal);
}
function enterFrameHandler(event:Event):void {
  for (var i:uint = 0; i < holder.numChildren; i++) {
    var item:Object = holder.getChildAt(i);
    if (item != "[object Shape]") {
      item.y += item.speedY;

      // bounce at the floor
      if (item.y + item.height >= stage.stageHeight) {
        item.speedY = item.speedY / 2;
        item.speedY *= -1;
      }
      // falling down
      if (item.speedY >= 0) {
        var a:Number = item.speedY - (item.speedY * 0.95);
        item.speedY += a;
      }
      // bouncing up
      if (item.speedY < 0) {
        item.speedY *= 0.95;
        if(item.speedY > -0.5)
        {
          item.speedY *= -1;
        }
      }
      trace(item.speedY);
    }
  }
}
 


 


Reply
blokje door vinTage op 17-01-09 om 16:35
Ik ben héél slecht in wiskundige berekeningen, maar onderstaande code werkt wel bij mij ? (enige wat ik gedaan heb is die holder weggewerkt)

actionscript code

init();
function init():void {
  drawBal();
  stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
function drawBal():void {
  var bal:MovieClip = new MovieClip();
  bal.graphics.lineStyle(2, 0x000000);
  bal.graphics.beginFill(0xFFFFFF);
  bal.graphics.drawCircle(20, 10, 10);
  bal.graphics.endFill();
  bal.speedY = 10;
  addChild(bal);
}
function enterFrameHandler(event:Event):void {
  for (var i:uint = 0; i < numChildren; i++) {
    var item:Object = getChildAt(i);
    if (item != "[object Shape]") {
      item.y += item.speedY;

      // bounce at the floor
      if (item.y + item.height >= stage.stageHeight) {
        item.speedY = item.speedY / 2;
        item.speedY *= -1;
      }
      // falling down
      if (item.speedY >= 0) {
        var a:Number = item.speedY - (item.speedY * 0.95);
        item.speedY += a;
      }
      // bouncing up
      if (item.speedY < 0) {
        item.speedY *= 0.95;
        if(item.speedY > -0.5)
        {
          item.speedY *= -1;
        }
      }
      trace(item.speedY);
    }
  }
}
 
 


 
Reply
blokje door W0utah op 17-01-09 om 16:41
Dat geeft eigenlijk juist hetzelfde resultaat.

Maar het probleem zit hem in de berekening om hem na het botsen terug naar beneden te laten komen.
Dus wanneer hij zijn hoogtepunt bereikt heeft.

 
Reply
blokje door vinTage op 17-01-09 om 17:11
Maar bij jouw voorbeeld blijft hij in de lucht hangen, bij mijn voorbeeld valt hij wel (ook niet echt deftig, maar hij gaat iig)

sidenote, aardig leuke free swf host btw :)

laatst ge-edit op: 17-01-09 om 17:13
Reply
blokje door W0utah op 17-01-09 om 17:21
Ow, was vergeten mijn huidige swf te updaten naar de server.
Anyway, de mijne is nu hetzelfde als jouw voorbeeld.

Ik kan misschien beter uitreken hoe hoog de bal gaat botsen en zo controleren.
Straks ff proberen

 
Dit topic is gesloten.