0

私は単純な Box2D ゲーム ( http://iwanttobeacircle.com ) を作成しています。このゲームでは、三角形として開始し、大きな形状を跳ね返して辺を獲得します。

壁に奇妙なバグがあります...両方とも同じクラスから作成されていますが、左側は機能し、右側は機能しません。正しいものだけを追加すると機能しますが、何らかの理由で両方を追加するとどこかで問題が発生するようです。

WallSegment クラスは以下のとおりです。

    package com.carmstrong.iwanttobeacircle {

 import flash.display.DisplayObjectContainer;
 import flash.display.Sprite;
 import flash.display.Shape;
 import Box2D.Collision.Shapes.*;
 import Box2D.Dynamics.*;
 import Box2D.Common.Math.b2Vec2;

 import com.carmstrong.iwanttobeacircle.Config;

 public class WallSegment extends Actor {

  private var _shape:Sprite;
  private var _shapeBody:b2Body;
  private var _colour:uint = 0x666666;

  private var prevEdge:int;
  private var thisEdge:int;
  private var side:Number;

  private var name:String;

  private var _pathWidth:int;
  private var _parent:DisplayObjectContainer;

  public function WallSegment(Width:int, Position:String, Parent:DisplayObjectContainer) {
   name = "Wall";
   _pathWidth = Width;
   _parent = Parent;

   if(Position == "left") {
    side = 1;
    prevEdge = (Config.WIDTH - Config.PREV_WIDTH)/2;
    thisEdge = (Config.WIDTH-_pathWidth)/2;
   } else {
    side = -1;
    prevEdge = Config.WIDTH-(Config.WIDTH - Config.PREV_WIDTH)/2;
    thisEdge = Config.WIDTH-(Config.WIDTH-_pathWidth)/2;
   }// check if its left or right wall


   //Create the costume
   drawShape();
   drawBody();

   super(_shapeBody, _shape);
  }//DynamicWall

  private function drawShape():void {
   //Draw visual
   _shape = new Sprite();

   var left:Sprite = new Sprite();

   left.graphics.beginFill(_colour, 0.5);
   left.graphics.moveTo(prevEdge, Config.HEIGHT/2);
   left.graphics.lineTo(prevEdge-Config.WIDTH*side, Config.HEIGHT/2);
   left.graphics.lineTo(thisEdge-Config.WIDTH*side, -Config.HEIGHT/2);
   left.graphics.lineTo(thisEdge, -Config.HEIGHT/2);
   left.graphics.endFill();
   _shape.addChild(left);

   _parent.addChild(_shape);
  }//drawShape

  private function drawBody():void {
   //Create the shape definition
   var shapeDef:b2PolygonDef = new b2PolygonDef();
   shapeDef.vertexCount = 4;
   b2Vec2(shapeDef.vertices[0]).Set(prevEdge/Config.RATIO, Config.HEIGHT/2/Config.RATIO);
   b2Vec2(shapeDef.vertices[1]).Set((prevEdge-Config.WIDTH*side)/Config.RATIO, Config.HEIGHT/2/Config.RATIO);
   b2Vec2(shapeDef.vertices[2]).Set((thisEdge-Config.WIDTH*side)/Config.RATIO, -Config.HEIGHT/2/Config.RATIO);
   b2Vec2(shapeDef.vertices[3]).Set(thisEdge/Config.RATIO, -Config.HEIGHT/2/Config.RATIO);
   shapeDef.density = 0;
   shapeDef.friction = 10;
   shapeDef.restitution = 0.45;

   //Create the body definition (specify location here)
   var shapeBodyDef:b2BodyDef = new b2BodyDef();
   shapeBodyDef.position.Set(0, -Config.HEIGHT*(Config.CURRENT_SEGMENT+1)/Config.RATIO);

   //Create the body
   _shapeBody = Config.world.CreateBody(shapeBodyDef);

   //Create the shape
   _shapeBody.CreateShape(shapeDef);

  }//drawBody

 }//class

    }//package

レベルを動的に保つために、壁は次のコードを使用して、メイン クラスで毎回プレーヤー オブジェクトのすぐ前に描画されます。

private function addWall(Width:int) {      
   Config.CURRENT_SEGMENT++;

   //addWalls
   var leftWall:WallSegment = new WallSegment(Width, "left",camera);
   var rightWall:WallSegment = new WallSegment(Width, "right",camera);

   Config.PREV_WIDTH = Width;
  }//addWall

次のエラーが表示されます。

TypeError: エラー #1010: 用語が定義されておらず、プロパティがありません。com.carmstrong.iwanttobeacircle::GameContactListener/Add() で Box2D.Dynamics.Contacts::b2CircleContact/Evaluate() で Box2D.Dynamics.Contacts::b2Contact/Update() で Box2D.Dynamics::b2ContactManager/Collide() Box2D.Dynamics::b2World/Step() で com.carmstrong.iwanttobeacircle::IWantToBeACircle/everyFrame() で

以下に示すように、GameContactListener クラスを参照します (add 関数は一番下にあります)。

    package com.carmstrong.iwanttobeacircle {

 import Box2D.Collision.b2ContactPoint;
 import Box2D.Dynamics.b2ContactListener;

 public class GameContactListener extends b2ContactListener {

  public function GameContactListener() {

  }//GameContactListener  

  override public function Add(point:b2ContactPoint):void {

   if (point.shape1.GetBody().GetUserData() is ShapeActor && point.shape2.GetBody().GetUserData() is ShapeActor) {
    //trace("Two shapes collided: Shape 1 has "+ point.shape1.GetBody().GetUserData().sides + " sides and Shape 2 has " + point.shape2.GetBody().GetUserData().sides + " sides");

    if (point.shape1.GetBody().GetUserData().sides > point.shape2.GetBody().GetUserData().sides) {
     //remove side from shape 1 and add side to shape 2
     point.shape1.GetBody().GetUserData().sides--;
     point.shape2.GetBody().GetUserData().sides++;
     //point.shape2.GetBody().GetUserData().updateColour;
    } else if (point.shape1.GetBody().GetUserData().sides < point.shape2.GetBody().GetUserData().sides) {
     //remove side from shape 2 and add side to shape 1
     point.shape1.GetBody().GetUserData().sides++;
     point.shape2.GetBody().GetUserData().sides--;
     //point.shape2.GetBody().GetUserData().updateColour;
    }// add side to smaller shape and take away from larger shape

    if(point.shape1.GetBody().GetUserData().name == "player" || point.shape2.GetBody().GetUserData().name == "player") {


     if(point.shape1.GetBody().GetUserData().name == "player" && point.shape2.GetBody().GetUserData().sides <= point.shape1.GetBody().GetUserData().sides) {
      Config.FULFILLMENT++;
      Config.SOUNDS[3+Math.ceil(Math.random()*5)][1].play();
      trace(Config.FULFILLMENT);
     } else if (point.shape2.GetBody().GetUserData().name == "player" && point.shape1.GetBody().GetUserData().sides <= point.shape2.GetBody().GetUserData().sides) {
      Config.FULFILLMENT++;
      Config.SOUNDS[Math.ceil(Math.random()*5)][1].play();
      trace(Config.FULFILLMENT);
     } else {
      Config.SOUNDS[Math.ceil(Math.random()*3)][1].play();
      Config.FULFILLMENT = int(Config.FULFILLMENT - 5);
      trace(Config.FULFILLMENT);
     }//if other shape is less than or equal to player
    }//if one of the shapes is player
   }// if both collider objects are shapes

   super.Add(point);

  }// override Add

 }//class 

    }//package

考えやアイデアをいただければ幸いです。また、Box2D を初めて使用するので、コードをより効率的にするためのヒントをいただければ幸いです。

前もって感謝します

4

1 に答える 1

0

あなたはここで2つの質問をしています

  1. 左右の壁衝突検出が機能しないのはなぜですか?
  2. GameContactListener/Add() メソッドでエラーが発生するのはなぜですか?

彼らは同じ根本的な問題を抱えているようです。「カメラ」の子として壁セグメントを追加しているようです (この追加がどこで行われているかを追跡する必要がありました... オブジェクトのコンストラクターに「カメラ」の参照を渡します)。

i.e.    var leftWall:WallSegment = new WallSegment(Width, "left",camera);

そこに、そのオブジェクトの子として leftWall を追加します。しかし、「カメラ」が何なのかよくわかりません... これはあなたのゲーム ワールド オブジェクトの一部ですか?

また、point.shape1 と point.shape2 のトレース ステートメントは何ですか? 衝突している 2 つのオブジェクトは何ですか?

于 2010-12-27T06:28:07.267 に答える