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
        
    

 
  
				

 
                             
 


 
                        
 
		 
	