Odbicie piłki od pochylonej powierzchni [ ActionScript 3 ]
Skrypt tworzy efekt odbicia się piłki od pochylonej powierzchni linii, z nadaną na nią siłą grawitacji oraz tarciem, gdy dojdzie do zderzenia.
Przykład symuluje realną sytuację zachowania piłki po odbiciu się od krawędzi linii.
Wersja On-Line:
Listing
//KOD DLA OdbicieOdPochylonejPowierzchni.as
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.display.StageScaleMode;
import flash.display.StageAlign;
import flash.geom.Rectangle;
public class OdbicieOdPochylonejPowierzchni extends Sprite
{
private var pilka:Pilka;
private var linie:Array;
private var liczbaLinii:uint = 5;
private var grawitacja:Number = 0.3;
private var odbicie:Number = -0.6;
public function OdbicieOdPochylonejPowierzchni()
{
init();
}
private function init():void
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
pilka = new Pilka(20);
addChild(pilka);
pilka.x = 100;
pilka.y = 50;
linie = new Array();
for(var i:uint = 0; i < liczbaLinii; i++)
{
var line:Sprite = new Sprite();
line.graphics.lineStyle(1);
line.graphics.moveTo(-50, 0)
line.graphics.lineTo(50, 0);
addChild(line);
linie.push(line);
}
linie[0].x = 100;
linie[0].y = 100;
linie[0].rotation = 30;
linie[1].x = 100;
linie[1].y = 230;
linie[1].rotation = 45;
linie[2].x = 250;
linie[2].y = 180;
linie[2].rotation = -30;
linie[3].x = 150;
linie[3].y = 330;
linie[3].rotation = 10;
linie[4].x = 230;
linie[4].y = 250;
linie[4].rotation = -30;
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(event:Event):void
{
pilka.vy += grawitacja;
pilka.x += pilka.vx;
pilka.y += pilka.vy;
if(pilka.x + pilka.radius > stage.stageWidth)
{
pilka.x = stage.stageWidth - pilka.radius;
pilka.vx *= odbicie;
}
else if(pilka.x - pilka.radius < 0)
{
pilka.x = pilka.radius;
pilka.vx *= odbicie;
}
if(pilka.y + pilka.radius > stage.stageHeight)
{
pilka.y = stage.stageHeight - pilka.radius;
pilka.vy *= odbicie;
}
else if(pilka.y - pilka.radius < 0)
{
pilka.y = pilka.radius;
pilka.vy *= odbicie;
}
for(var i:uint = 0; i < liczbaLinii; i++)
{
checkLine(linie[i]);
}
}
private function checkLine(line:Sprite):void
{
var bounds:Rectangle = line.getBounds(this);
if(pilka.x > bounds.left && pilka.x < bounds.right)
{
var angle:Number = line.rotation * Math.PI / 180;
var cos:Number = Math.cos(angle);
var sin:Number = Math.sin(angle);
var x1:Number = pilka.x - line.x;
var y1:Number = pilka.y - line.y;
var y2:Number = cos * y1 - sin * x1;
var vy1:Number = cos * pilka.vy - sin * pilka.vx;
if(y2 > -pilka.height / 2 && y2 < vy1)
{
var x2:Number = cos * x1 + sin * y1;
var vx1:Number = cos * pilka.vx + sin * pilka.vy;
y2 = -pilka.height / 2;
vy1 *= odbicie;
x1 = cos * x2 - sin * y2;
y1 = cos * y2 + sin * x2;
pilka.vx = cos * vx1 - sin * vy1;
pilka.vy = cos * vy1 + sin * vx1;
pilka.x = line.x + x1;
pilka.y = line.y + y1;
}
}
}
}
}
//KOD DLA Pilka.as
package {
import flash.display.Sprite;
public class Pilka extends Sprite {
private var promien:Number;
private var kolor:uint;
public function Pilka(promien:Number=40, kolor:uint=0xff0000) {
this.promien = promien;
this.kolor = kolor;
init();
}
public function init():void {
graphics.beginFill(kolor);
graphics.drawCircle(0,0, promien);
graphics.endFill();
}
}
}
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.display.StageScaleMode;
import flash.display.StageAlign;
import flash.geom.Rectangle;
public class OdbicieOdPochylonejPowierzchni extends Sprite
{
private var pilka:Pilka;
private var linie:Array;
private var liczbaLinii:uint = 5;
private var grawitacja:Number = 0.3;
private var odbicie:Number = -0.6;
public function OdbicieOdPochylonejPowierzchni()
{
init();
}
private function init():void
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
pilka = new Pilka(20);
addChild(pilka);
pilka.x = 100;
pilka.y = 50;
linie = new Array();
for(var i:uint = 0; i < liczbaLinii; i++)
{
var line:Sprite = new Sprite();
line.graphics.lineStyle(1);
line.graphics.moveTo(-50, 0)
line.graphics.lineTo(50, 0);
addChild(line);
linie.push(line);
}
linie[0].x = 100;
linie[0].y = 100;
linie[0].rotation = 30;
linie[1].x = 100;
linie[1].y = 230;
linie[1].rotation = 45;
linie[2].x = 250;
linie[2].y = 180;
linie[2].rotation = -30;
linie[3].x = 150;
linie[3].y = 330;
linie[3].rotation = 10;
linie[4].x = 230;
linie[4].y = 250;
linie[4].rotation = -30;
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(event:Event):void
{
pilka.vy += grawitacja;
pilka.x += pilka.vx;
pilka.y += pilka.vy;
if(pilka.x + pilka.radius > stage.stageWidth)
{
pilka.x = stage.stageWidth - pilka.radius;
pilka.vx *= odbicie;
}
else if(pilka.x - pilka.radius < 0)
{
pilka.x = pilka.radius;
pilka.vx *= odbicie;
}
if(pilka.y + pilka.radius > stage.stageHeight)
{
pilka.y = stage.stageHeight - pilka.radius;
pilka.vy *= odbicie;
}
else if(pilka.y - pilka.radius < 0)
{
pilka.y = pilka.radius;
pilka.vy *= odbicie;
}
for(var i:uint = 0; i < liczbaLinii; i++)
{
checkLine(linie[i]);
}
}
private function checkLine(line:Sprite):void
{
var bounds:Rectangle = line.getBounds(this);
if(pilka.x > bounds.left && pilka.x < bounds.right)
{
var angle:Number = line.rotation * Math.PI / 180;
var cos:Number = Math.cos(angle);
var sin:Number = Math.sin(angle);
var x1:Number = pilka.x - line.x;
var y1:Number = pilka.y - line.y;
var y2:Number = cos * y1 - sin * x1;
var vy1:Number = cos * pilka.vy - sin * pilka.vx;
if(y2 > -pilka.height / 2 && y2 < vy1)
{
var x2:Number = cos * x1 + sin * y1;
var vx1:Number = cos * pilka.vx + sin * pilka.vy;
y2 = -pilka.height / 2;
vy1 *= odbicie;
x1 = cos * x2 - sin * y2;
y1 = cos * y2 + sin * x2;
pilka.vx = cos * vx1 - sin * vy1;
pilka.vy = cos * vy1 + sin * vx1;
pilka.x = line.x + x1;
pilka.y = line.y + y1;
}
}
}
}
}
//KOD DLA Pilka.as
package {
import flash.display.Sprite;
public class Pilka extends Sprite {
private var promien:Number;
private var kolor:uint;
public function Pilka(promien:Number=40, kolor:uint=0xff0000) {
this.promien = promien;
this.kolor = kolor;
init();
}
public function init():void {
graphics.beginFill(kolor);
graphics.drawCircle(0,0, promien);
graphics.endFill();
}
}
}
Dodano przez: divix
Ranga: Administrator serwisu Punktów: 0
Ranga: Administrator serwisu Punktów: 0
Komentarze użytkowników
:: Losowe artykuły
:: Wymiana linków
Modowe inspiracje |
Android Gry i Aplikacje |
ZaplanujTransport.pl: Przeprowadzki, transport, aukcje |
Logo dla firmy |
Change Tires - Car Weather Forecast Reminder |
Laminas: MVC Framework for PHP |
IT Books Reviews and Programming: JS, JAVA, PHP, ANDROID, CSS |
Katalog roślin |
Programming articles: JAVA, PHP, C++, Python, JavaScript |
Kancelaria Adwokacka Łukasz Huszno