[flash as3]2D版角色如線上遊戲點擊行走

摘要:[flash as3]2D版如線上遊戲點擊行走

這個project是我為了喜歡的配音員做的小遊戲,

算是某種另類的對於偶像的支持!

目前正在進行當中,

把一些教學寫給大家,也許可以讓大家再自由發揮!

此版本還無碰撞(撞到建築物)的判斷,就是讓大家自己思考~

先上flash:

https://googledrive.com/host/0B7hg_8WvMyfJRG9oRE5xajliS28

提醒:寫程式時,建議在畫面上加label偵測使用者點擊位置喔!

首先,將你的布局都排好(場景),

記得,有個叫bg的MovieClip,是用來偵測使用者走路的背景,

通常要比使用者看到的畫面還大(除非你只想做使用者看得到的畫面大小的遊戲場景)。

SV的場景大小是550X400

 

接著在第一frame寫程式碼:

var charArr:Array=new Array(front1,front2,left1,left2,right1,right2,back1,back2);
var bgArr:Array=new Array(bg,grass,rock,house1,house2,house3,other,bubble);
var bgX:Array=new Array(bg.x,grass.x,rock.x,house1.x,house2.x,house3.x,other.x,bubble.x);
var bgY:Array=new Array(bg.y,grass.y,rock.y,house1.y,house2.y,house3.y,other.y,bubble.y);
var ex:int=0;
var ey:int=0;
var moveX:int=0;
var moveY:int=0;
var isLeft:String="none";
var isFront:String="none";
var step:Boolean=false;
txTest.visible=false;
initGame();
function initGame(){
	for(var i:int=0;i<charArr.length;i++){
		if(i!=0) charArr[i].visible=false;
	}
}
function bgLeft(){
	if((bg.x+bg.width-5)<stage.stageWidth){
		for(var i:int=0;i<bgArr.length;i++){
			bgArr[i].x=bgX[i]-(bgX[0]+bgArr[0].width-stage.stageWidth);
		}
		moveX=0;
	}else{
		for(var j:int=0;j<bgArr.length;j++){
			bgArr[j].x-=5;
		}
		moveX-=5;
	}
}
function bgRight(){
	if(bg.x+5>0){
		for(var i:int=0;i<bgArr.length;i++){
			bgArr[i].x=bgX[i]+Math.abs(bgX[0]);
		}
		moveX=0;
	}else{
		for(var j:int=0;j<bgArr.length;j++){
			bgArr[j].x+=5;
		}
		moveX-=5;
	}
}
function bgFront(){
	if(bg.y+bg.height-5<stage.stageHeight){
		for(var i:int=0;i<bgArr.length;i++){
			bgArr[i].y=bgY[i]-Math.abs(bgY[0]+bgArr[0].height-stage.stageHeight);
		}
		moveY=0;
	}else{
		for(var j:int=0;j<bgArr.length;j++){
			bgArr[j].y-=5;
		}
		moveY-=5;
	}
}
function bgBack(){
	if(bg.y+5>0){
		for(var i:int=0;i<bgArr.length;i++){
			bgArr[i].y=bgY[i]+Math.abs(bgY[0]);
		}
		moveY=0;
	}else{
		for(var j:int=0;j<bgArr.length;j++){
			bgArr[j].y+=5;
		}
		moveY-=5;
	}
}
function goLeft(){
	if(front1.x-5<0){
		for(var i:int=0;i<charArr.length;i++){
			charArr[j].x=0;
		}
		moveX=0;
	}else{
		for(var j:int=0;j<charArr.length;j++){
			charArr[j].x-=5;
		}
		moveX-=5;
	}
}
function goRight(){
	if(front1.x+front1.width+5>stage.stageWidth){
		for(var i:int=0;i<charArr.length;i++){
			charArr[i].x=stage.stageWidth-charArr[i].width;
		}
		moveX=0;
	}else{
		for(var j:int=0;j<charArr.length;j++){
			charArr[j].x+=5;
		}
		moveX-=5;
	}
}
function goFront(){
	if(front1.y-5<0){
		for(var i:int=0;i<charArr.length;i++){
			charArr[i].y=0;
		}
		moveY=0;
	}else{
		for(var j:int=0;j<charArr.length;j++){
			charArr[j].y-=5;
		}
		moveY-=5;
	}
}
function goBack(){
	if(front1.y+front1.height+5>stage.stageHeight){
		for(var i:int=0;i<charArr.length;i++){
			charArr[i].y=stage.stageHeight-charArr[i].height;
		}
		moveY=0;
	}else{
		for(var j:int=0;j<charArr.length;j++){
			charArr[j].y+=5;
		}
		moveY-=5;
	}
}
function faceFront1(){
	for(var i:int=0;i<charArr.length;i++){
		if(i!=0) charArr[i].visible=false;
		else charArr[i].visible=true;
	}
}
function faceFront2(){
	for(var i:int=0;i<charArr.length;i++){
		if(i!=1) charArr[i].visible=false;
		else charArr[i].visible=true;
	}
}
function faceLeft1(){
	for(var i:int=0;i<charArr.length;i++){
		if(i!=2) charArr[i].visible=false;
		else charArr[i].visible=true;
	}
}
function faceLeft2(){
	for(var i:int=0;i<charArr.length;i++){
		if(i!=3) charArr[i].visible=false;
		else charArr[i].visible=true;
	}
}
function faceRight1(){
	for(var i:int=0;i<charArr.length;i++){
		if(i!=4) charArr[i].visible=false;
		else charArr[i].visible=true;
	}
}
function faceRight2(){
	for(var i:int=0;i<charArr.length;i++){
		if(i!=5) charArr[i].visible=false;
		else charArr[i].visible=true;
	}
}
function faceBack1(){
	for(var i:int=0;i<charArr.length;i++){
		if(i!=6) charArr[i].visible=false;
		else charArr[i].visible=true;
	}
}
function faceBack2(){
	for(var i:int=0;i<charArr.length;i++){
		if(i!=7) charArr[i].visible=false;
		else charArr[i].visible=true;
	}
}
// Click Background to move
bg.addEventListener(MouseEvent.CLICK,bgHandler);
function bgHandler(e:Event):void{
	moveing();
}
grass.addEventListener(MouseEvent.CLICK,grassHandler);
function grassHandler(e:Event):void{
	moveing();
}

function moveing(){
	ex=this.mouseX;
	ey=this.mouseY;
	moveX=Math.abs(front1.x-ex);
	moveY=Math.abs(front1.y-ey);
	if(ex>=front1.x+front1.width){ isLeft="false"; moveX-=right1.width; }
	else if(ex<front1.x) isLeft="true";
	else isLeft="none";
	if(ey>=front1.y+front1.height){ isFront="false"; moveY-=front1.height; }
	else if(ey<front1.y) isFront="true";
	else isFront="none";
	step=true;
	moveT2.stop();
	moveT.start();
	txTest.text=bg.x+","+bg.y;
}

// Moving Animation
var moveT:Timer = new Timer(50);
moveT.addEventListener(TimerEvent.TIMER, moveTHandler);
function moveTHandler(event:TimerEvent):void{
	if(isLeft=="true"){
		if(moveX>0){
			if(bg.x!=0&&front1.x<=290){
				bgRight();
			}else{
				goLeft();
			}
			if(step==true){ faceLeft1(); step=false; }
			else { faceLeft2(); step=true; }
		}else{
			moveT.stop();
			moveT2.start();
		}
	}else if(isLeft=="false"){
		if(moveX>0){
			if(bg.x+bg.width!=stage.stageWidth&&front1.x>=290){
				bgLeft();
			}else{
				goRight();
			}
			if(step==true){ faceRight1(); step=false; }
			else { faceRight2(); step=true; }
		}else{
			moveT.stop();
			moveT2.start();
		}
	}else moveT2.start();
}
var moveT2:Timer = new Timer(50);
moveT2.addEventListener(TimerEvent.TIMER, moveT2Handler);
function moveT2Handler(event:TimerEvent):void{
	if(isFront=="true"){
		if(moveY>0){
			if(bg.y!=0&&front1.y<=170){
				bgBack();
			}else{
				goFront();
			}
			if(step==true){ faceBack1(); step=false; }
			else { faceBack2(); step=true; }
		}else{
			moveT2.stop();
		}
	}else if(isFront=="false"){
		if(moveY>0){
			if(bg.y+bg.height!=stage.stageHeight&&front1.y>=170){
				bgFront();
			}else{
				goBack();
			}
			if(step==true){ faceFront1(); step=false; }
			else { faceFront2(); step=true; }
		}else{
			moveT2.stop();
		}
	}
}
stop();

 

一開始的陣列,charArr是代表你的角色,因為角色有八種圖片(上下左右各兩個,分別是左腳和右腳在改變),角色的動畫基本上是把這幾個圖片切換。

bgArr則是你的背景(只要不是玩家操控的東西都是,包括障礙物)。

bgX和bgY是所有背景的原始座標(用來做定位的,若自行想定位方式可以不需要這兩個陣列)。

ex和ey就是使用者點到的位置,moveX和moveY則是使用者需行走的距離。

isLeft和isFront是判斷使用者行走的方向,用string而非boolean是因為有三種情形:true/false/none,none就是沒有行走時。

step是用來切換角色的左右腳(讓角色不只是移動,還有腳走路的感覺)。

txTest是label,用來做測試用。

其他大概就像function的名稱那樣,

我是先走左右再處理前後,所以有兩個Timer。

我的角色起始位置是在(290,170),

然後我的移動以5px為單位喔!

附註:

你會發現角色會走在畫面中間,這道理就跟用鍵盤移動或者橫軸遊戲一樣的,

因為畫面很大,在走到底前,是把角色固定在中間,然後讓背景移動。

這是2D遊戲的設計技巧喔!