Heim  >  Artikel  >  Web-Frontend  >  HTML5-Spielframework cnGameJS-Entwicklungsaufzeichnungsspielszenenobjekt

HTML5-Spielframework cnGameJS-Entwicklungsaufzeichnungsspielszenenobjekt

黄舟
黄舟Original
2017-03-24 15:58:242177Durchsuche

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)

HTML5-Spielframework cnGameJS-Entwicklungsaufzeichnungsspielszenenobjekt


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(&#39;gameCanvas&#39;,{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;
            
        },
Der Fokus des Szenenobjekts liegt auf der Aktualisierungsmethode:

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]);
            }
        },
. Wenn es sich um eine Schleife handelt, setzen Sie die X-Koordinate des Hintergrunds und anderer Sprites zurück, nachdem Sie den Bewegungsbereich überschritten haben. Wenn es sich nicht um eine Schleife handelt, wird die Callback-Funktion onEnd aufgerufen, nachdem die Bewegung beendet ist. Wenn Sie den Player außerdem darauf beschränken müssen, sich immer innerhalb des Anzeigebereichs zu befinden, können Sie auch die inside

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn