1. Wann wird das Szenenobjekt benötigt?
Szenenobjekte unterscheiden sich von den im vorherigen Artikel vorgestellten Kartenobjekten. Sie werden in verschiedenen Arten von Spielen verwendet. Frühere Kartenobjekte wurden in Gitterspielen wie Sokoban und Tank Battle verwendet. Die in diesem Abschnitt vorgestellten Szenenobjekte eignen sich für Spiele mit bestimmten Szenen wie Super Mario, Dinosaur Kombat usw. Diese Art von Spiel steuert normalerweise ein Spielerobjekt in einer 2D-Szene. Wenn sich der Spieler bewegt, bewegt sich die Szene mit.2. Szenenbeispiel:
Effekt: (linke und rechte Taste steuern die Bewegung von Super Mario)
Code:
<body> <div><canvas id="gameCanvas">请使用支持canvas的浏览器查看</canvas></div> </body> <script src="cnGame_v1.0.js"></script> <script> var Src="http://images.cnblogs.com/cnblogs_com/Cson/290336/o_player.png"; var background="background.png"; /* 初始化 */ cnGame.init('gameCanvas',{width:500,height:400}); var floorY=cnGame.height-40; var gameObj=(function(){ /* 玩家对象 */ var player=function(options){ this.init(options); this.speedX=0; this.moveDir; this.isJump=false; } cnGame.core.inherit(player,cnGame.Sprite); player.prototype.initialize=function(){ this.addAnimation(new cnGame.SpriteSheet("playerRight",Src,{frameSize:[50,60],loop:true,width:150,height:60})); this.addAnimation(new cnGame.SpriteSheet("playerLeft",Src,{frameSize:[50,60],loop:true,width:150,height:120,beginY:60})); } player.prototype.moveRight=function(){ if(cnGame.core.isUndefined(this.moveDir)||this.moveDir!="right"){ this.moveDir="right"; this.speedX<0&&(this.speedX=0); this.setMovement({aX:10,maxSpeedX:15}); this.setCurrentAnimation("playerRight"); } } player.prototype.moveLeft=function(){ if(cnGame.core.isUndefined(this.moveDir)||this.moveDir!="left"){ this.moveDir="left"; this.speedX>0&&(this.speedX=0); this.setMovement({aX:-10,maxSpeedX:15}); this.setCurrentAnimation("playerLeft"); } } player.prototype.stopMove=function(){ if(this.speedX<0){ this.setCurrentImage(Src,0,60); } else if(this.speedX>0){ this.setCurrentImage(Src); } this.moveDir=undefined; this.resetMovement(); } player.prototype.update=function(){ player.prototype.parent.prototype.update.call(this);//调用父类update if(cnGame.input.isPressed("right")){ this.moveRight(); } else if(cnGame.input.isPressed("left")){ this.moveLeft(); } else{ this.stopMove(); } } return { initialize:function(){ cnGame.input.preventDefault(["left","right","up","down"]); this.player=new player({src:Src,width:50,height:60,x:0,y:floorY-60}); this.player.initialize(); this.background=new cnGame.View({src:background,player:this.player,imgWidth:2301}); this.background.centerPlayer(true); this.background.insideView(this.player,"x"); }, update:function(){ this.player.update(); this.background.update([this.player]); }, draw:function(){ this.background.draw(); this.player.draw(); } }; })(); cnGame.loader.start([Src,background],gameObj); </script>
3 . Code-Implementierung: Um eine Szene zu erstellen, benötigen Sie zunächst ein ausreichend breites Hintergrundbild
. Wenn sich der Spieler nach rechts bewegt, befindet er sich immer in der Mitte des Hintergrunds , und die Geschwindigkeit des Spielers wird in die Bewegungsrichtung des Hintergrunds umgewandelt. Schauen Sie sich zunächst die Initialisierungsfunktion an: Zusätzlich zu xy und Größe verfügen die vom Benutzer übergebenen Parameter auch über drei Parameter, mit denen festgelegt wird, ob die platziert werden sollen Spielerobjekt in der Mitte Verschiebt den Hintergrund, ohne den Spieler zu bewegen. Wenn Sie den oben genannten Hintergrundbewegungseffekt erzielen möchten, muss dieser Parameter auf true gesetzt werden. Ein weiterer Parameter besteht darin, festzulegen, ob eine Schleife ausgeführt werden soll. Bei der Einstellung „Schleife“ kehrt der Hintergrund, nachdem er sich zum äußersten Punkt bewegt hat, an die ursprüngliche Position zurück. Der letzte Parameter ist onEnd. Wenn er auf azyklisch eingestellt ist, wird die Rückruffunktion ausgelöst, nachdem der Hintergrund das Extrem erreicht hat.
/** *初始化 **/ init:function(options){ /** *默认对象 **/ var defaultObj={ width:cg.width, height:cg.height, imgWidth:cg.width, imgHeight:cg.height, x:0, y:0 } options=options||{}; options=cg.core.extend(defaultObj,options); this.player=options.player; this.width=options.width; this.height=options.height; this.imgWidth=options.imgWidth; this.imgHeight=options.imgHeight; this.centerX=this.width/2; this.src=options.src; this.x=options.x; this.y=options.y; this.insideArr=[]; this.isLoop=false;; this.isCenterPlayer=false; this.onEnd=options.onEnd; },
Diese Methode
ermittelt zunächst, ob das Player-Objekt die Mitte der Szene überschritten hat. Berechnen Sie den überschrittenen Abstand, und der Spieler wird in der Mitte der Szene fixiert, und der überschüssige Abstand wird auf den Abstand zwischen dem Hintergrund, der sich in die entgegengesetzte Richtung bewegt, und dem Abstand eingestellt, in dem sich andere Sprites außer dem Spieler in die entgegengesetzte Richtung bewegen In diesem Fall bewegen sich nur der Hintergrund und andere Sprite-Objekte, und der Player ist fixiert/** *背景移动时的更新 **/ update:function(spritelist){//传入所有sprite的数组 if(this.isCenterPlayer){ if(this.player.x>this.centerX){ if(this.x<this.imgWidth-this.width){ var marginX=this.player.x-this.centerX; this.x+=marginX; if(spritelist){ for(var i=0,len=spritelist.length;i<len;i++){ if(spritelist[i]==this.player){ spritelist[i].x=this.centerX; } else{ spritelist[i].x-=marginX; } } } } else if(this.isLoop){ if(spritelist){ for(var i=0,len=spritelist.length;i<len;i++){ if(spritelist[i]!=this.player){ spritelist[i].move(this.imgWidth-this.width); } } } this.x=0; } else{ this.onEnd&&this.onEnd(); } } } for(var i=0,len=this.insideArr.length;i<len;i++){ inside.call(this,this.insideArr[i]); } },
View-Methode aufrufen. Fügen Sie alle Codes des Szenenobjekts hinzu:
Das obige ist der detaillierte Inhalt vonHTML5-Spielframework cnGameJS-Entwicklungsaufzeichnungsspielszenenobjekt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!