Starling library - When I try and change cursor to image…it doesn't work (and a sprite element dissapears from stage)

こ雲淡風輕ζ 提交于 2019-12-20 06:38:12

问题


I am using Starling to make a really, really, really easy game - I am just trying to add a stationary sprite to the stage...and make it so that when the mouse touches the sprite...the game "stops" and a score is sent. I haven't tried implementing hitTest yet for the collision, but I have run into a sort of conflict problem where, when I comment out the line(s) that is supposed to change the cursor image (see Startup.as - stage.addEventListener(TouchEvent.TOUCH, touchHandler); and createCustomeCursor), the instance of AvatarEnemy (see enemy in Game.as) does what it should, and is placed in the center of the screen. When I comment in the line that is supposed to change the cursor: a). the cursor doesn't change, and b.) the enemy sprite disappears. When I comment out the same lines - the enemy sprite reappears (but obviously, the cursor doesn't work - not that it was working in the first place). Why is this happening? My code is below - someone mentioned something about not doing things before Starling is initialized here (a question I asked, which is a precursor to this one) - but I'm not sure what they meant because it at least seems like all my code is in the right place.

Game.as

package
{

import Classes.AvatarEnemy;

import starling.display.Sprite;

    public class Game extends Sprite
    {
        //private var juggler:Juggler = Starling.juggler;

        private var enemy:AvatarEnemy;

        public function Game() 
        {   
            enemy = new AvatarEnemy();
            addChild(enemy);
        }
    }
}

Startup.as

package 
{
    import flash.display.Bitmap;
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;
    import flash.geom.Point;

    import starling.core.Starling;
    import starling.events.Touch;
    import starling.events.TouchEvent;
    import starling.display.DisplayObject;
    import flash.display.BitmapData;
    import flash.ui.MouseCursorData;
    import flash.ui.Mouse;

    [SWF(width="500", height="500", frameRate="30", backgroundColor="#FFFFFF")]
    public class Startup extends Sprite
    {
        private var mStarling:Starling;

        [Embed(source="Classes/Avatarpic.png")]
        private const Cursor:Class;

        public var cursor:DisplayObject;

        public function Startup()
        {
            // Create a Starling instance that will run the "Game" class
            mStarling = new Starling(Game, stage);
            mStarling.start();

            // These settings are recommended to avoid problems with touch handling
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.align = StageAlign.TOP_LEFT;
            createCustomCursor();
            stage.addEventListener(TouchEvent.TOUCH, touchHandler);
        }

        private function touchHandler(event:TouchEvent):void
        {
            var touch:Touch = event.getTouch(cursor);
            if(touch.phase){
                {
                    var localPos:Point = touch.getLocation(cursor);
                    trace("Touched object at position: " + localPos);
                }
            }
        }

        public function createCustomCursor():void
        {
            var cursorBitmaps:Vector.<BitmapData> = new Vector.<BitmapData>();
            cursorBitmaps.push((new Cursor() as Bitmap).bitmapData);

            var mouseCursorData:MouseCursorData = new MouseCursorData();
            mouseCursorData.data        = cursorBitmaps;
            mouseCursorData.frameRate   = 30;
            mouseCursorData.hotSpot     = new Point(0, 0);

            Mouse.registerCursor("customCursor", mouseCursorData);
            Mouse.cursor = "customCursor";
        }
    }
}

Any help would be greatly appreciated (if you need a copy of the code (it's an Adobe Flash Builder 4.7 project - I have made a git repo - just comment if you want the link).

UPDATE

I realized I wasn't registering the image as the cursor - I updated my Startup.as file to reflect changes (take a look at createCustomCursor function) - the cursor still isn't working, and the sprite that is supposed to appear is still not appearing.

Also - just in case you want to see where AvatarEnemy is coming from:

AvatarEnemy.as

package Classes
{   
    import starling.display.Image;
    import starling.display.Sprite;
    import starling.textures.Texture;

    public class AvatarEnemy extends Sprite
    {
        [Embed(source='Enemypic.png')]
        private static var Enemypic:Class;

        private var texture:Texture = Texture.fromBitmap(new Enemypic());

        private var image:Image = new Image(texture);

        public function AvatarEnemy() 
        {               
            image.x = 0;
            image.y = 200;

            addChild(image);            
        }
    }
}

UPDATE

I resolved why the sprite was disappearing - I needed to put the starling initialize code (mStarling.start() and mStarling = new Starling(Game, stage);) above all the stage.something lines. I edited code to reflect what I did in Startup.as. I still need help with the cursor though.


回答1:


I have been practicing with your code and it all seems fine, but ive been using a different image, so that must be the problem.

Make sure the size of the image is below 32x32, thats the max size of an cursor image, otherwise the OS won't accept it.



来源:https://stackoverflow.com/questions/23784027/starling-library-when-i-try-and-change-cursor-to-image-it-doesnt-work-and

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!