ページ 11

Action Scriptについて

Posted: 2014年10月22日(水) 11:42
by けんけん
adbeFb という環境を使い、Action Script言語しようでゲーム開発を
行っているですが、実際にソースコードを入力しビルドしてみると

僕が予想していたのは、真ん中から四方八方に黒い玉が打ち出されると言うものでしたが

実際には、黒い点が画面の真ん中に表示されるのみで、思っていたのとはかけ離れていました。

このコードの問題点は何でしょうか?

コード:


package{
	
	import flash.display.Sprite;
	import flash.events.Event;
	
	public class Main extends Sprite{
		
		private var bullets : Array;
		private const MAX:int = 100;
		
		public function Main(){
			
			bullets = new Array();
			
			//MAXbulletに回読み込む
			for( var degree:int = 0; degree < 360; degree++ ){
				var bullet:Bullet = new Bullet( 0x0, 5, 232, 232, Math.cos(degree * Math.PI / 180), Math.sin( degree * Math.PI / 180 ));
				addChild( bullet );
				bullets.push( bullet );
			}
			
			addEventListener( Event.ENTER_FRAME, onEnterFrame );
		}
			
		//毎フレーム更新
		private function onEnterFrame( event:Event ):void{
			
			for( var i:int = 0; i < bullets.lenght; i++ ){
				bullets[i].move();
			 	if( bullets[i].check()){//もし指定範囲からはみ出てたら
					 removeChild( bullets[i] );
					 bullets.splice( i--, 1 );//bulletsを消し、同時に配列も消す
				}
			}
		}	
	}
}

import flash.display.Sprite;

//bulletを継承
class Bullet extends Sprite{
	
	private var _x:Number = 0;
	private var _y:Number = 0;
	private var vx:Number;
	private var vy:Number;
	
	override public function get x():Number { return _x }
	override public function get y():Number { return _y }
	
	override public function set x( value:Number ):void{
		
		super.x = _x = value;
		
	}
	
	override public function set y( value:Number ):void{
		
		super.y = _y = value;
		
	}
	
	public function Bullet( color:int, radius:int, x:int, y:int, vx:Number, vy:Number ){

		graphics.beginFill( color );
		graphics.drawCircle( 0,0,radius );
		graphics.endFill();
	
		this.x = x;
		this.y = y;
		this.vx = vx;
		this.vy = vy;
	
	}	
	
	public function move() : void{
		
		this.x += vx;
		this.y += vy;
		
	}
	
	//正(true)か負(false)の値を返す関数:Boolean
	public function check() : Boolean{
		if( x < -50 || stage.stageWidth + 50 < x || y < -50 || stage.stageHeight + 50 < y ){
			return true;
		}
		
		return false;
	}
}




Re: Action Scriptについて

Posted: 2014年10月22日(水) 15:40
by LL
Action Scriptはよく分からないのですが、弾自体は描画されているのですよね?それならば見た感じ68行目の
graphics.drawCircle( 0,0,radius );
が何か怪しい気配を感じます。
drawということは描画という予想が出来、
その後に続く引数はおそらく座標と回転角と予想しました。
そう仮定すると(0,0,radius)で座標を0で固定しているからその場でジッと動いていないのではないのでしょうか?
もしかしたら
graphics.drawCircle( this.x, this.y, radius );
で動くのではないのかなと思います。
まったく見当違いの回答であったら申し訳ございません。

あと、よく初心者で何かしら動く物を描画するとき、そのオブジェクトの座標を指定する部分で固定値(10、10)(x:y)とか
打ち込んでしまって動かない。変なところに描画されるということがよくあるので注意してください(個人経験です(汗))

今回は動くべきオブジェクトが動かないということでそこから、座標更新、もしくはオブジェクトの座標を入力する箇所が怪しいと予想できます。
デバックというのはこういうような情報からいくつか仮説を予想してそこを調べていくと見た目ですぐわかるような内容は案外解決できますよ。
(バッファオーバーランとかポインタで滅茶苦茶やってたとなると話は別ですが・・・)

Re: Action Scriptについて

Posted: 2014年10月22日(水) 19:02
by けんけん
LLさん
自分もいじり立てなので、よく間違えてしまいます。

このDraw関数は描画の部分なので、LLさんの言う通り、this.x this.y にしてみたところ
表示座標値は変わりませんでした。

なので 100,100, としてみたところ、実行結果がえられたので、問題はDraw関数部ではなく

毎フレームごとの更新ができてない可能性が高いです、、、。

Re: Action Scriptについて

Posted: 2014年10月24日(金) 00:34
by ISLe()
Bulletクラスのコンストラクタで描画してますけど、毎フレーム呼び出されるmoveメソッドでは描画してませんね。

moveメソッドで描画すれば更新した座標で表示されるのではないでしょうか。
そしてコンストラクタでの描画は不要かと。