Skip to main content
Inspiring
January 1, 2023
Answered

ok why does my button stop getting the little hand or mouseover effects as soon as I connect a class

  • January 1, 2023
  • 1 reply
  • 344 views

Hey team,

So when I create a new html5 canvas and make one button with a roll over colour, a down colour and a hit area.

If I just press cntl+enter from animate it works fine.

If I use the web server and open the project from the index.file - the button is still there - its still working or showing the down colour when you click but the cursor doesnt change to a little hand anymore and there is no roll over change?

Do you have to mouseEnable or something from the class.js file?    (the only code in there so far is the constructor)

class Game
{
    constructor(root, lib)
    {
        this.root = root;
        this.stage = this.root.stage;
        this.lib = lib;
        this.init();
    }
    
    init()
    {
        
    }
}
    This topic has been closed for replies.
    Correct answer Bundaberg North5E42

    Hey I am not trying to dis on this tutorial either - a bad workman blames the tools - its fine, its just that I want to be able to make something from scratch (and so will my students) 

     

    index
    
    <!DOCTYPE html>
    <!--
    	NOTES:
    	1. All tokens are represented by '$' sign in the template.
    	2. You can write your code only wherever mentioned.
    	3. All occurrences of existing tokens will be replaced by their appropriate values.
    	4. Blank lines will be removed automatically.
    	5. Remove unnecessary comments before creating your template.
    -->
    <html>
    <head>
    <meta charset="UTF-8">
    <meta name="authoring-tool" content="Adobe_Animate_CC">
    <title>XXXX</title>
    <!-- write your code here -->
    <style>
      #animation_container {
    	position:absolute;
    	margin:auto;
    	left:0;right:0;
    	top:0;bottom:0;
      }
    </style>
    <script src="https://code.createjs.com/createjs-2015.11.26.min.js"></script>
    <script src="rhino.js"></script>
    <script src="game.js"></script>
    <script>
    var canvas, stage, exportRoot, anim_container, dom_overlay_container, fnStartAnimation, game;
    function init() {
    	canvas = document.getElementById("canvas");
    	anim_container = document.getElementById("animation_container");
    	dom_overlay_container = document.getElementById("dom_overlay_container");
    	var comp=AdobeAn.getComposition("F67AF913B7324C5E921F85667DB56F67");
    	var lib=comp.getLibrary();
    	var loader = new createjs.LoadQueue(false);
    	loader.addEventListener("fileload", function(evt){handleFileLoad(evt,comp)});
    	loader.addEventListener("complete", function(evt){handleComplete(evt,comp)});
    	var lib=comp.getLibrary();
    	loader.loadManifest(lib.properties.manifest);
    }
    function handleFileLoad(evt, comp) {
    	var images=comp.getImages();	
    	if (evt && (evt.item.type == "image")) { images[evt.item.id] = evt.result; }	
    }
    function handleComplete(evt,comp) {
    	//This function is always called, irrespective of the content. You can use the variable "stage" after it is created in token create_stage.
    	var lib=comp.getLibrary();
    	var ss=comp.getSpriteSheet();
    	var queue = evt.target;
    	var ssMetadata = lib.ssMetadata;
    	for(i=0; i<ssMetadata.length; i++) {
    		ss[ssMetadata[i].name] = new createjs.SpriteSheet( {"images": [queue.getResult(ssMetadata[i].name)], "frames": ssMetadata[i].frames} )
    	}
    	exportRoot = new lib.Rhino();
    	stage = new lib.Stage(canvas);
    	stage.enableMouseOver();
        
    	//Registers the "tick" event listener.
    	fnStartAnimation = function() {
    		stage.addChild(exportRoot);
    		createjs.Ticker.setFPS(lib.properties.fps);
    		createjs.Ticker.addEventListener("tick", stage)
    		stage.addEventListener("tick", handleTick)
    		function getProjectionMatrix(container, totalDepth) {
    			var focalLength = 528.25;
    			var projectionCenter = { x : lib.properties.width/2, y : lib.properties.height/2 };
    			var scale = (totalDepth + focalLength)/focalLength;
    			var scaleMat = new createjs.Matrix2D;
    			scaleMat.a = 1/scale;
    			scaleMat.d = 1/scale;
    			var projMat = new createjs.Matrix2D;
    			projMat.tx = -projectionCenter.x;
    			projMat.ty = -projectionCenter.y;
    			projMat = projMat.prependMatrix(scaleMat);
    			projMat.tx += projectionCenter.x;
    			projMat.ty += projectionCenter.y;
    			return projMat;
    		}
    		function handleTick(event) {
                if (game === undefined) game = new Game(exportRoot, stage);
    			var cameraInstance = exportRoot.___camera___instance;
    			if(cameraInstance !== undefined && cameraInstance.pinToObject !== undefined)
    			{
    				cameraInstance.x = cameraInstance.pinToObject.x + cameraInstance.pinToObject.pinOffsetX;
    				cameraInstance.y = cameraInstance.pinToObject.y + cameraInstance.pinToObject.pinOffsetY;
    				if(cameraInstance.pinToObject.parent !== undefined && cameraInstance.pinToObject.parent.depth !== undefined)
    				cameraInstance.depth = cameraInstance.pinToObject.parent.depth + cameraInstance.pinToObject.pinOffsetZ;
    			}
    			applyLayerZDepth(exportRoot);
    		}
    		function applyLayerZDepth(parent)
    		{
    			var cameraInstance = parent.___camera___instance;
    			var focalLength = 528.25;
    			var projectionCenter = { 'x' : 0, 'y' : 0};
    			if(parent === exportRoot)
    			{
    				var stageCenter = { 'x' : lib.properties.width/2, 'y' : lib.properties.height/2 };
    				projectionCenter.x = stageCenter.x;
    				projectionCenter.y = stageCenter.y;
    			}
    			for(child in parent.children)
    			{
    				var layerObj = parent.children[child];
    				if(layerObj == cameraInstance)
    					continue;
    				applyLayerZDepth(layerObj, cameraInstance);
    				if(layerObj.layerDepth === undefined)
    					continue;
    				if(layerObj.currentFrame != layerObj.parent.currentFrame)
    				{
    					layerObj.gotoAndPlay(layerObj.parent.currentFrame);
    				}
    				var matToApply = new createjs.Matrix2D;
    				var cameraMat = new createjs.Matrix2D;
    				var totalDepth = layerObj.layerDepth ? layerObj.layerDepth : 0;
    				var cameraDepth = 0;
    				if(cameraInstance && !layerObj.isAttachedToCamera)
    				{
    					var mat = cameraInstance.getMatrix();
    					mat.tx -= projectionCenter.x;
    					mat.ty -= projectionCenter.y;
    					cameraMat = mat.invert();
    					cameraMat.prependTransform(projectionCenter.x, projectionCenter.y, 1, 1, 0, 0, 0, 0, 0);
    					cameraMat.appendTransform(-projectionCenter.x, -projectionCenter.y, 1, 1, 0, 0, 0, 0, 0);
    					if(cameraInstance.depth)
    						cameraDepth = cameraInstance.depth;
    				}
    				if(layerObj.depth)
    				{
    					totalDepth = layerObj.depth;
    				}
    				//Offset by camera depth
    				totalDepth -= cameraDepth;
    				if(totalDepth < -focalLength)
    				{
    					matToApply.a = 0;
    					matToApply.d = 0;
    				}
    				else
    				{
    					if(layerObj.layerDepth)
    					{
    						var sizeLockedMat = getProjectionMatrix(parent, layerObj.layerDepth);
    						if(sizeLockedMat)
    						{
    							sizeLockedMat.invert();
    							matToApply.prependMatrix(sizeLockedMat);
    						}
    					}
    					matToApply.prependMatrix(cameraMat);
    					var projMat = getProjectionMatrix(parent, totalDepth);
    					if(projMat)
    					{
    						matToApply.prependMatrix(projMat);
    					}
    				}
    				layerObj.transformMatrix = matToApply;
    			}
    		}
    	}	    
    	//Code to support hidpi screens and responsive scaling.
    	function makeResponsive(isResp, respDim, isScale, scaleType) {		
    		var lastW, lastH, lastS=1;		
    		window.addEventListener('resize', resizeCanvas);		
    		resizeCanvas();		
    		function resizeCanvas() {			
    			var w = lib.properties.width, h = lib.properties.height;			
    			var iw = window.innerWidth, ih=window.innerHeight;			
    			var pRatio = window.devicePixelRatio || 1, xRatio=iw/w, yRatio=ih/h, sRatio=1;			
    			if(isResp) {                
    				if((respDim=='width'&&lastW==iw) || (respDim=='height'&&lastH==ih)) {                    
    					sRatio = lastS;                
    				}				
    				else if(!isScale) {					
    					if(iw<w || ih<h)						
    						sRatio = Math.min(xRatio, yRatio);				
    				}				
    				else if(scaleType==1) {					
    					sRatio = Math.min(xRatio, yRatio);				
    				}				
    				else if(scaleType==2) {					
    					sRatio = Math.max(xRatio, yRatio);				
    				}			
    			}			
    			canvas.width = w*pRatio*sRatio;			
    			canvas.height = h*pRatio*sRatio;
    			canvas.style.width = dom_overlay_container.style.width = anim_container.style.width =  w*sRatio+'px';				
    			canvas.style.height = anim_container.style.height = dom_overlay_container.style.height = h*sRatio+'px';
    			stage.scaleX = pRatio*sRatio;			
    			stage.scaleY = pRatio*sRatio;			
    			lastW = iw; lastH = ih; lastS = sRatio;            
    			stage.tickOnUpdate = false;            
    			stage.update();            
    			stage.tickOnUpdate = true;		
    		}
    	}
    	makeResponsive(true,'both',true,1);	
    	AdobeAn.compositionLoaded(lib.properties.id);
    	fnStartAnimation();
    }
    </script>
    <!-- write your code here -->
    </head>
    <body onload="init();" style="margin:0px;">
    	<div id="animation_container" style="background-color:rgba(255, 255, 255, 1.00); width:960px; height:640px">
    		<canvas id="canvas" width="960" height="640" style="position: absolute; display: block; background-color:rgba(255, 255, 255, 1.00);"></canvas>
    		<div id="dom_overlay_container" style="pointer-events:none; overflow:hidden; width:960px; height:640px; position: absolute; left: 0px; top: 0px; display: block;">
    		</div>
    	</div>
    </body>
    </html>

     

    I have taken out the title of this project - again really not trying to flame anybody or say its bad - jsut asking about it

    When I create a new animate file and publish the project1.html has about 55 lines- this one is full of stuff that I dont know where it came from.  I know that if you dont have anything moving on the timeline that your .html wont have the handletick event built in because there is nothing moving on the timeline - but everyting else I dont know- I am only posting this to see if it clears up the Lib statement for you (or any other things that are going wrong)

    Like the differences in the constructor method that I asked about earlier in this thread.

    Does this make anything more clear?


    so I dont know - I have gone back, started again and recreated this simple test - 

    and now it is working  - here is the code in the external class

    class Game{
        constructor(exportRoot, stage){
            this.root = exportRoot;
            this.stage = stage;
            this.str1 = "start";
            this.init();
            this.setstate;
        }
        
        init(){
            const game = this;
        this.main_Txt = this.root.main_Txt;
            this.root.start_bt.on("click", function(){ game.update(); })
               this.setstate = 0;
            };
    update(){
        if(this.setstate == 0){
        this.str1 = "this is setstate 0"
        }
        this.setText();
    }
        setText(){
        this.main_Txt.text = this.str1;
        }
        }

    :). mouse effects working and text box loading

    1 reply

    kglad
    Community Expert
    Community Expert
    January 1, 2023

    stage.enableMouseOver()

    Inspiring
    January 1, 2023

    Sorry kglad that didnt work, but I did notice this

    you are putting the constructor (root, lib)

    the other guy is saying contstructor (exportRoot, stage)   ?

    kglad
    Community Expert
    Community Expert
    January 1, 2023

    i just copied your code while fixing this.stage.

     

    lib i didn't understand and questioned it in your thread where you posted the issue about loading failing to appear.