2017-02-20 18 views
12

Tôi đang lập trình một trò chơi trên bàn trong Starling (Action Script 3). Phiên bản Starling mà tôi đang sử dụng có một lớp được gọi là Sprite3D, cho phép tôi dễ dàng và dễ dàng mã hóa việc lật các thẻ được sử dụng trong trò chơi này. Tôi gặp rắc rối bởi thực tế là thẻ của tôi thay đổi kích thước khi lật, và tôi không thể tìm thấy nguồn gốc của sự thay đổi.Điều gì khiến thẻ này thay đổi kích thước? [Video & Code]

Tất cả trợ giúp đều được đánh giá cao.

Sự cố có thể được xem trên this youtube video.

Mã có thể được xem đầy đủ trên github tại this github page.

Tôi sẽ tiếp tục ở đây với nhiều chi tiết hơn ... Tất cả thông tin sau được đề cập trong video.

Lớp Thẻ không chứa thông tin trực quan. Nó là một lớp điều khiển. Nó giữ hai sprites. Một sprite lấp đầy khuôn mặt phía trước, và sprite khác lấp đầy mặt sau. Lớp Card cũng có một mặt nạ được áp dụng và các thuộc tính kích thước để các khuôn mặt sẽ có kích thước và hình dạng bằng nhau.

Lớp Thẻ cũng giữ mã hoạt ảnh. Mã để tạo hiệu ứng cho thẻ rất giống với mã được sử dụng trong video được tìm thấy trên blog đầy sao cho biết cách sử dụng Stage3D trong trò chơi Bộ nhớ 2D rất nhanh chóng và dễ dàng. Lớp Thẻ làm hoạt hình xoay vòng bằng cách sử dụng tween để thay đổi thuộc tính rotationY của thẻ từ 0 thành PI và từ PI thành 0 trên các sự kiện chạm. Lỗi xảy ra trong quá trình lật, vì vậy tôi sẽ bao gồm mã lật ở đây:

public function flip() : void { 
    _state = !(this._state); 
    if(this.animations){ 
     var tween : starling.animation.Tween = new Tween(this, 2, starling.animation.Transitions.EASE_OUT_BOUNCE); 
     var card : Card = this; 
     var didFlip : Boolean = false; 
     tween.animate("rotationY", this._state == Card.FACE_UP ? Math.PI : 0); 
     tween.onUpdate = updateVisibility; 
     Starling.juggler.add(tween); 
    } 
} 
private function updateVisibility():void 
{ 
    var sHelper:Vector3D = new Vector3D(); 
    var card : Card = this; 
    stage.getCameraPosition(card, sHelper); 
    if(sHelper){ 
     this._front_face.visible = sHelper.z < 0; 
     this._back_face.visible = sHelper.z >= 0; 
    } 
} 

Lớp FrontFace và BackFace đều xuất phát từ lớp CardFace. Lớp CardFace lấy một thẻ làm tham chiếu và đặt một mặt nạ bằng kích thước và hình dạng của mặt nạ của thẻ. Điều này có thể dư thừa, vì mặt nạ của thẻ sẽ che dấu tất cả các DisplayObject của trẻ em, nhưng chúng ta vẫn làm điều đó.

BackFace có văn bản, biểu trưng, ​​kết cấu và màu sắc.

FrontFace không làm gì cả. Nó được phân lớp với các hành vi cụ thể và sẽ chuyển đổi một đối tượng dữ liệu thành bố cục hiển thị.

Trong trường hợp này, chúng tôi đang phân lớp FrontFace bằng ProfileFrontFace. ProfileFrontFace lấy đối tượng thẻ và một đối tượng dữ liệu hồ sơ làm đối số hàm tạo. Đối tượng thẻ được chuyển tới CardFace qua các cuộc gọi super() và đối tượng hồ sơ được lưu để sử dụng sau này.

Khi ProfileFrontFace được thêm vào vùng hiển thị, lớp sẽ trích xuất tiêu đề, thu nhập và chi phí từ đối tượng dữ liệu hồ sơ. Nó tạo ra các trường văn bản cho từng mục này. Nó cũng tính toán một dòng tiền và tạo ra một trường văn bản cho giá trị này. Một nền được tạo ra bằng cách sử dụng một kết cấu PNG, đó là một hình vuông màu trắng đơn giản, được kéo dài trên toàn bộ khuôn mặt của kích thước của thẻ. Trên hình vuông màu trắng này, chúng tôi áp dụng một kết cấu màu. Sau khi được tạo, hình nền không bị thay đổi. Mã xuất hiện như sau:

//we remove the event listener so this function code is only executed once 
this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
var width : int = this.cardWidth; /* 400 */ 
var height : int = this.cardHeight; /* 300 */ 
var bg : Image = new Image(Game.assets.getTexture("blank")); 
/* start the background in the top left */ 
bg.x = 0; 
bg.y = 0; 
/* have the background fill the card dimension space */ 
bg.width = width; 
bg.height = height; 
/* apply a color so that the background is not pure white */ 
bg.color = ColorScheme.OPAL; 
/* add the background to the stage */ 
this.addChild(bg); 

Trong phần còn lại của hàm, chúng tôi tạo văn bản và hiển thị văn bản. Tôi không bao gồm mã đó ở đây để đơn giản. Trong thử nghiệm, tôi đã loại bỏ mã đó và thấy rằng nó không có tác động đến hành vi đặc biệt làm thay đổi kích thước của thẻ khi lật sang mặt trước.

Có ai nhìn thấy một trường hợp mặt nạ trên Sprite3D không hoạt động như mặt nạ không?

Có ai nhìn thấy trường hợp mặt nạ không thực hiện trên đối tượng Sprite thông thường không?

Phương pháp Tween.animate() có thể gây ra hành vi lạ khi Tween được sử dụng để thay đổi giá trị của "rotationY" trên một đối tượng?

Bất kỳ và tất cả câu trả lời đều sẽ hữu ích. Cảm ơn bạn!

Trả lời

5

CỐ ĐỊNH !!!!! Tôi tìm thấy nó!

Tôi phát hiện ra rằng vấn đề không phải là mặt trước. Tôi đã áp dụng một mặt nạ cho chính thẻ, đó là đối tượng Sprite3D. Mặt nạ đó gây ra vấn đề. Khi tôi gỡ bỏ nó, các BackFace (một đối tượng Sprite) mở rộng đến kích thước tương tự như mặt trước, và bây giờ khi tôi thiết lập kích thước thẻ, cả hai khuôn mặt có kích thước bằng nhau.

Tôi đã cập nhật kích thước thẻ thành 400x250 để khớp với bố cục BackFace ban đầu và giờ đây mọi thứ hoạt động tốt.

Mẹo: Đặt mặt nạ của bạn trên các đối tượng Sprite chứ không phải đối tượng Sprite3D, khi có thể. Điều đó giữ cho thao tác 2D trên các đối tượng 2D.

Các vấn đề liên quan