Hi there,
I have made myself a little game loosely based on peggle. You can have a look here:-
http://www.ourtestsite.org/antigravitysnowballgame/
Currently it uses Greensocks Physics2DPlugin and MotionBlurPlugin. It works o.k. but I would really appreciate anything you can spot that might make it run smoother. It also runs differently every time and sometimes the ball overlaps the pegs. I have the peg and boundary hit checks running using greensocks onUpdate feature but I'm not sure if this is the best way.
Thanks for any help. If you manage to help make it smoother then you can feel free to use my code to make your own game but please don't copy it 100%.
Any other comments are greatly appreciated.
Will
stop();
mainTL = this;
import com.greensock.*;
import com.greensock.easing.*;
import com.greensock.plugins.*;
TweenPlugin.activate([Physics2DPlugin, MotionBlurPlugin]);
//TweenPlugin.activate([Physics2DPlugin]);
ball.cacheAsBitmap = true;
// Variables
var gravity:Number = 500;
var totalPegs:Number = 15;
var pegRadius:Number = 10;
var ballRadius:Number = 20;
// Constants
var collisionRadius:Number = pegRadius + ballRadius;
var leftBorder:Number = 0;
var rightBorder:Number = Stage.width;
var topBorder:Number = 0;
var bottomBorder:Number = Stage.height + (ballRadius*2) + 20;
var activePegs:Array = new Array();
var mBStrength:Number = 0.5;
var mBQuality:Number = 0;
var reboundVelocity:Number = 350;
var dHitNum:Number = 0;
var bNum:Number = 0;
var lastSecSaveGot:Boolean = false;
var gameStatus:String = "idle";
var mainScore:Number = 0;
var myHighScore:Number = 0;
var hitsNoClicks:Number = 0;
var offTheWall:Boolean = false;
// Initial setup
clickArea._width = rightBorder;
clickArea._height = bottomBorder;
ballPlatform._y = 570;
for(i=0; i activePegs[i] = mainTL["peg" + i];
mainTL["_level0." + i + "hit"] = false;
}
startAd();
function startAd() {
getSharedData();
offScreenMarker._visible = false;
TweenMax.killTweensOf(ball);
ball._x = 500;
ball._y = 544;
ballRadius = 20;
ball._xscale = 100;
ball._yscale = 100;
ball.hotSpot._xscale = 100;
ball.hotSpot._yscale = 100;
ball.snow_whirl._xscale = 100;
ball.snow_whirl._yscale = 100;
mainScore = 0;
}
function getSharedData() {
//////////
user = SharedObject.getLocal("user_profile");
//user.clear();
if (user.data.score == undefined){
myHighScore = 0;
myHighScore_txt.text = "High Score: " + myHighScore;
} else {
myHighScore = user.data.score;
myHighScore_txt.text = "High Score: " + myHighScore;
}
}
function saveSharedData() {
user.data.score = mainScore;
user.flush();
myHighScore_txt.text = "High Score: " + user.data.score;
gotoAndStop('submit_score');
}
// Ball interaction
clickArea.onPress = function() {
ballPressed = true;
ballActive = false;
}
clickArea.onRelease = function() {
if(gameStatus != "gameover"){
mainScore -= 100;
if(gameStatus == "idle"){
TweenLite.to(ballPlatform, 1, {_y:620, ease:Quad.easeOut, overwrite:false});
}
gameStatus = "active";
TweenMax.killTweensOf(ball);
ballPressed = false;
ballActive = true;
hitsNoClicks = 0;
offTheWall = false;
if(ball._y > 640 && lastSecSaveGot == false){
lastSecSaveGot = true;
drawBonus("lastSecondSave");
}
var storeVelocity:Number = (getDistance(ball._x, ball._y, _xmouse, _ymouse))*2;
if(storeVelocity <= 400){
storeVelocity = 400;
}
TweenMax.to(ball, 20, {physics2D:{velocity:storeVelocity, angle:pingArrow._rotation, gravity:gravity}, onUpdate:doChecks, motionBlur:{strength:mBStrength, quality:mBQuality}});
}
}
function toDegrees(radians) :Number{
var degrees = radians * 180/Math.PI
return degrees;
}
function getAngleOf(x1,y1,x2,y2):Number{
var dx = x2-x1;
var dy = y2-y1;
var angle = Math.atan2(dy,dx);
return toDegrees(angle);
}
function getDistance(x1, y1, x2, y2) {
xdist = Math.round(x1 - x2);
ydist = Math.round(y1 - y2);
distanceFromThis = Math.sqrt((xdist*xdist) + (ydist*ydist));
return distanceFromThis;
}
function drawPingArrow() {
pingArrow._visible = true;
pingArrow._x = ball._x;
pingArrow._y = ball._y;
pingArrow._rotation = getAngleOf(ball._x, ball._y, _xmouse, _ymouse);
if(getDistance(ball._x, ball._y, _xmouse, _ymouse) <= 100){
pingArrow._xscale = getDistance(ball._x, ball._y, _xmouse, _ymouse);
pingArrow._yscale = getDistance(ball._x, ball._y, _xmouse, _ymouse);
} else {
pingArrow._xscale = 100;
pingArrow._yscale = 100;
}
}
function hidePingArrow() {
pingArrow._visible = false;
pingBar._visible = false;
}
function ballDied() {
ball._x = 200;
//ball._y =
}
function checkBorders(){
if(ball._x >= rightBorder - ballRadius){
TweenMax.killTweensOf(ball);
ball._x = (rightBorder - ballRadius)-4;
offTheWall = true;
//Bounce off
TweenMax.to(ball, 20, {physics2D:{velocity:(reboundVelocity/2), angle:180, gravity:gravity}, onUpdate:doChecks, motionBlur:{strength:mBStrength, quality:mBQuality}});
} else if (ball._x <= leftBorder + ballRadius){
TweenMax.killTweensOf(ball);
ball._x = leftBorder + ballRadius;
offTheWall = true;
//Bounce off
TweenMax.to(ball, 20, {physics2D:{velocity:(reboundVelocity/2), angle:0, gravity:gravity}, onUpdate:doChecks, motionBlur:{strength:mBStrength, quality:mBQuality}});
}
if(ball._y >= bottomBorder - ballRadius){
TweenMax.killTweensOf(ball);
ball._y = bottomBorder - ballRadius;
// Do death thing
TweenMax.killTweensOf(ball);
gameStatus = "gameover";
delete onEnterFrame;
gameOver();
}
}
function checkHit(targetMc, pegNum){
if(getDistance(ball._x, ball._y, targetMc._x, targetMc._y) <= collisionRadius){
// Add 500 to scroe
mainScore += 500;
TweenMax.killTweensOf(ball);
hitsNoClicks++;
//TweenLite.to(ball.hotSpot, 1, {_xscale:"10", _yscale:"10", ease:Quad.easeOut, overwrite:false});
//TweenLite.to(ball.snow_whirl, 1, {_xscale:"10", _yscale:"10", ease:Quad.easeOut, overwrite:false});
mainTL[targetMc + "hit"] = true;
// Remove deleted peg from array
//trace(targetMc);
activePegs.splice(pegNum, 1);
// Explode peg
targetMc.gotoAndPlay('explode');
if(hitsNoClicks >= 2){
drawHitGraphics(targetMc._x, targetMc._y, hitsNoClicks);
}
if(offTheWall == true){
offTheWall = false;
drawBonus("offTheWall")
mainScore += 500;
}
var hitAngle = getAngleOf(ball._x, ball._y, targetMc._x, targetMc._y);
TweenMax.to(ball, 20, {physics2D:{velocity:reboundVelocity, angle:hitAngle - 180, gravity:gravity}, onUpdate:doChecks, motionBlur:{strength:mBStrength, quality:mBQuality}});
}
}
function doChecks(){
checkBorders();
for(i=0; i checkHit(activePegs[i], i);
}
}
function drawHitGraphics(spawnX, spawnY, numHits) {
//trace(spawnX);
//trace(spawnY);
attachMovie("hitGraphic" + numHits, "dHit" + dHitNum, mainTL.getNextHighestDepth());
mainTL["dHit" + dHitNum]._xscale = 1;
mainTL["dHit" + dHitNum]._yscale = 1;
mainTL["dHit" + dHitNum]._x = spawnX;
mainTL["dHit" + dHitNum]._y = spawnY;
TweenLite.to(mainTL["dHit" + dHitNum], 0.5, {_xscale:100, _yscale:100, ease:Elastic.easeOut, overwrite:false});
mainScore += (1000*(numHits*0.5));
TweenLite.to(mainTL["dHit" + dHitNum], 0.5, {_alpha:0, overwrite:false, delay:1.5, onComplete:deleteIt, onCompleteParams:[mainTL["dHit" + dHitNum]]});
dHitNum++;
}
function drawBonus(tBonus){
attachMovie(tBonus, "bClip" + bNum, mainTL.getNextHighestDepth());
mainTL["bClip" + bNum]._xscale = 1;
mainTL["bClip" + bNum]._yscale = 1;
if(tBonus == "lastSecondSave"){
mainTL["bClip" + bNum]._x = ball._x;
mainTL["bClip" + bNum]._y = 570;
} else if (tBonus == "offTheWall"){
mainTL["bClip" + bNum]._x = ball._x;
mainTL["bClip" + bNum]._y = ball._y;
}
TweenLite.to(mainTL["bClip" + bNum], 0.5, {_xscale:100, _yscale:100, ease:Elastic.easeOut, overwrite:false});
TweenLite.to(mainTL["bClip" + bNum], 0.5, {_alpha:0, overwrite:false, delay:1.5, onComplete:deleteIt, onCompleteParams:[mainTL["bClip" + bNum]]});
bNum++;
}
function drawOffScreenMarker(){
offScreenMarker._x = ball._x
offScreenMarker._visible = true;
}
function hideOffScreenMarker(){
offScreenMarker._visible = false;
}
function gameOver() {
TweenMax.killTweensOf(gameOver2);
attachMovie("gameOver", "gameOver2", mainTL.getNextHighestDepth());
gameOver2._yscale = 1;
gameOver2._xscale = 1;
gameOver2._x = 500;
gameOver2._y = 300;
TweenLite.to(gameOver2, 0.5, {_xscale:100, _yscale:100, ease:Elastic.easeOut, overwrite:false});
TweenLite.to(gameOver2, 0.5, {_alpha:0, overwrite:false, delay:1.5, onComplete:gameOverDone});
}
function gameOverDone() {
deleteIt(gameOver2);
if(mainScore > myHighScore){
saveSharedData();
} else {
gotoAndStop('low_score');
}
}
function deleteIt(dTarget) {
//trace(dTarget);
//trace("del it");
removeMovieClip(dTarget);
}
onEnterFrame = function(){
guide_hitsNoClicks.text = hitsNoClicks;
collisionRadius = pegRadius + ballRadius;
ballRadius = (ball.hotSpot._width/2);
bottomBorder = Math.floor(Stage.height + (ballRadius*2) + 20);
//trace(bottomBorder);
mainScore_txt.text = "Score: " + mainScore;
//guideArray.text = activePegs;
// Draw ping arrow
if(ballPressed == true){
drawPingArrow();
} else {
hidePingArrow();
}
if (ball._y <= topBorder + ballRadius){
drawOffScreenMarker();
} else {
hideOffScreenMarker();
}
}