将动画gif指定给玩家功能

时间:2017-10-16 19:05:33

标签: javascript html5 canvas sketch.js

我正在创建一个无限的sidescroller运行游戏。尝试将图像应用到我的播放器图标时,我遇到了麻烦 - (function Player当前是红色方块) - 这导致游戏传递错误:Uncaught TypeError: This is.css is not a function

到目前为止,我试图实现的一些想法是:

  • this.background
  • ctx.drawImage()
  • this.return
  • img.src

思考?并提前感谢您的任何帮助。

注意:根据您的屏幕尺寸,运行以下代码可能需要整页才能查看。

var i = 0;

function random( min, max ) {
  return Math.round( min + ( Math.random() * ( max - min ) ) );
}

function randomChoice(array){
  return array[ Math.round( random( 0, array.length - 1 ) ) ];
}

var InfiniteRunner = Sketch.create({
  fullscreen: false,
  width: 640,
  height: 400 ,
  container: document.getElementById('container')
});

/*******************/
/*****VECTOR2*******/
/*******************/

function Vector2(x, y, width, height){
  this.x = x;
  this.y = y;
  this.width = width;
  this.height = height;
  this.previousX = 0;
  this.previousY = 0;
};

Vector2.prototype.setPosition = function(x, y) {

  this.previousX = this.x;
  this.previousY = this.y;

  this.x = x;
  this.y = y;

};

Vector2.prototype.setX = function(x) {

  this.previousX = this.x;
  this.x = x;

};

Vector2.prototype.setY = function(y) {

  this.previousY = this.y;
  this.y = y;

};


Vector2.prototype.insercects = function(obj){

  if(obj.x < this.x + this.width && obj.y < this.y + this.height &&
     obj.x + obj.width > this.x && obj.y + obj.height > this.y ){
    return true;
  }

  return false;
};

Vector2.prototype.insercectsLeft = function(obj){

  if(obj.x < this.x + this.width && obj.y < this.y + this.height ){
    return true;
  }

  return false;
};

/****************/
/*****PLAYER*****/
/****************/

function Player(options){

  this.setPosition(options.x, options.y);
  this.width = options.width;
  this.height = options.height;
  this.velocityX = 0;
  this.velocityY = 0;
  this.jumpSize = -13;
  this.color = 'rgba(245,44,22,1)';
}

Player.prototype = new Vector2;

Player.prototype.update = function() {
  this.velocityY += 1;
  this.setPosition(this.x + this.velocityX, this.y + this.velocityY);

  if(this.y > InfiniteRunner.height || this.x + this.width < 0){
    this.x = 150;
    this.y = 50;
    this.velocityX = 0;
    this.velocityY = 0;
    InfiniteRunner.jumpCount = 0;
    InfiniteRunner.aceleration = 0;
    InfiniteRunner.acelerationTweening = 0;
    InfiniteRunner.scoreColor = '#ffffff';
    InfiniteRunner.platformManager.maxDistanceBetween = 350;
    InfiniteRunner.platformManager.updateWhenLose();
  }

  if((InfiniteRunner.keys.UP || InfiniteRunner.keys.SPACE || InfiniteRunner.keys.W || InfiniteRunner.dragging) && this.velocityY < -8){
    this.velocityY += -0.75;
  }

};

Player.prototype.draw = function() {
  InfiniteRunner.fillStyle = this.color;
  InfiniteRunner.fillRect(this.x, this.y, this.width, this.height);
};

/*******************/
/*****platform****/
/******************/

function Platform(options){
  this.x = options.x;
  this.y = options.y;
  this.width = options.width;
  this.height = options.height;
  this.previousX = 0;
  this.previousY = 0;
  this.color = options.color;
}

Platform.prototype = new Vector2;

Platform.prototype.draw = function() {
  InfiniteRunner.fillStyle = this.color;
  InfiniteRunner.fillRect(this.x, this.y, this.width, this.height);
};

/*******************PLATFORM MANAGER*************/

function PlatformManager(){
  this.maxDistanceBetween = 300;
  this.colors = ['#006494', '#247ba0', '#1b98e0', '#e8f1f2'];

  this.first = new Platform({x: 300, y: InfiniteRunner.width / 2, width: 400, height: 70})
  this.second = new Platform({x: (this.first.x + this.first.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween), y: random(this.first.y - 128, InfiniteRunner.height - 80), width: 400, height: 70})
  this.third = new Platform({x: (this.second.x + this.second.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween), y: random(this.second.y - 128, InfiniteRunner.height - 80), width: 400, height: 70})

  this.first.height = this.first.y + InfiniteRunner.height;
  this.second.height = this.second.y + InfiniteRunner.height;
  this.third.height = this.third.y + InfiniteRunner.height;
  this.first.color = randomChoice(this.colors);
  this.second.color = randomChoice(this.colors);
  this.third.color = randomChoice(this.colors);

  this.colliding = false;

  this.platforms = [this.first, this.second, this.third];
}

PlatformManager.prototype.update = function() {

  this.first.x -= 3 + InfiniteRunner.aceleration;
  if(this.first.x + this.first.width < 0 ){
    this.first.width = random(450, InfiniteRunner.width + 200);
    this.first.x = (this.third.x + this.third.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween);
    this.first.y = random(this.third.y - 32, InfiniteRunner.height - 80);
    this.first.height = this.first.y + InfiniteRunner.height + 10;
    this.first.color = randomChoice(this.colors);
  }

  this.second.x -= 3 + InfiniteRunner.aceleration;
  if(this.second.x + this.second.width < 0 ){
    this.second.width = random(450, InfiniteRunner.width + 200);
    this.second.x = (this.first.x + this.first.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween);
    this.second.y = random(this.first.y - 32, InfiniteRunner.height - 80);
    this.second.height = this.second.y + InfiniteRunner.height + 10;
    this.second.color = randomChoice(this.colors);
  }

  this.third.x -= 3 + InfiniteRunner.aceleration;
  if(this.third.x + this.third.width < 0 ){
    this.third.width = random(450, InfiniteRunner.width + 200);
    this.third.x = (this.second.x + this.second.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween);
    this.third.y = random(this.second.y - 32, InfiniteRunner.height - 80);
    this.third.height = this.third.y + InfiniteRunner.height + 10;
    this.third.color = randomChoice(this.colors);
  }

};

PlatformManager.prototype.updateWhenLose = function() {

  this.first.x = 300;
  this.first.color = randomChoice(this.colors);
  this.first.y = InfiniteRunner.width / random(2,3);
  this.second.x = (this.first.x + this.first.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween);
  this.third.x = (this.second.x + this.second.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween);

};

/*******************PARTICLE SYSTEM*************/

function Particle(options){
  this.x = options.x;
  this.y = options.y;
  this.size = 10;
  this.velocityX = options.velocityX || random(-(InfiniteRunner.aceleration * 3) + -8,-(InfiniteRunner.aceleration * 3));
  this.velocityY = options.velocityY || random(-(InfiniteRunner.aceleration * 3) + -8,-(InfiniteRunner.aceleration * 3));
  this.color = options.color;
}

Particle.prototype.update = function() {
  this.x += this.velocityX;
  this.y += this.velocityY;
  this.size *= 0.89;
};

Particle.prototype.draw = function() {
  InfiniteRunner.fillStyle = this.color;
  InfiniteRunner.fillRect(this.x, this.y, this.size, this.size);
};

/************************************************/

InfiniteRunner.setup = function () {

  this.jumpCount = 0;
  this.aceleration = 0;
  this.acelerationTweening = 0;

  this.player = new Player({x: 150, y: 30, width: 32, height: 32});

  this.platformManager = new PlatformManager();

  this.particles = [];
  this.particlesIndex = 0;
  this.particlesMax = 2000;
  this.collidedPlatform = null;
  this.scoreColor = '#ffffff';
  this.jumpCountRecord = 0;

};

InfiniteRunner.update = function() {

  this.player.update();

  switch(this.jumpCount){
    case 10:
      this.acelerationTweening = 1;
      this.platformManager.maxDistanceBetween = 430;
      this.scoreColor = '#ffffff';
      break;
    case 25:
      this.acelerationTweening = 2;
      this.platformManager.maxDistanceBetween = 530;
      this.scoreColor = '#ffffff';
      break;
    case 40:
      this.acelerationTweening = 3;
      this.platformManager.maxDistanceBetween = 580;
      this.scoreColor = '#ffffff';
      break;
  }

  this.aceleration += (this.acelerationTweening - this.aceleration) * 0.01;

  for (i = 0; i < this.platformManager.platforms.length; i++) {
    if(this.player.insercects(this.platformManager.platforms[i])){
      this.collidedPlatform = this.platformManager.platforms[i];
      if (this.player.y < this.platformManager.platforms[i].y) {
        this.player.y = this.platformManager.platforms[i].y;
        this.player.velocityY = 0;
      }

      this.player.x = this.player.previousX;
      this.player.y = this.player.previousY;

      this.particles[(this.particlesIndex++)%this.particlesMax] = new Particle({
        x: this.player.x,
        y: this.player.y + this.player.height,
        color: this.collidedPlatform.color
      });

      if(this.player.insercectsLeft(this.platformManager.platforms[i])){
        this.player.x = this.collidedPlatform.x - 64;
        for (i = 0; i < 10; i++) {
          this.particles[(this.particlesIndex++)%this.particlesMax] = new Particle({
            x: this.player.x + this.player.width,
            y: random(this.player.y, this.player.y + this.player.height),
            velocityY: random(-30,30),
            color: randomChoice(['#ffffff','#ffffff', this.collidedPlatform.color])
          });
        };
        this.player.velocityY = -10 + -(this.aceleration * 4);
        this.player.velocityX = -20 + -(this.aceleration * 4);
        // this.jumpCount = 0;
        // this.aceleration = 0;
        // this.acelerationTweening = 0;
        // this.scoreColor = '#181818';
        // this.platformManager.maxDistanceBetween = 350;
        // this.platformManager.updateWhenLose();


      } else {

        if(this.dragging || this.keys.SPACE || this.keys.UP || this.keys.W){
          this.player.velocityY = this.player.jumpSize;
          this.jumpCount++;
          if(this.jumpCount > this.jumpCountRecord){
            this.jumpCountRecord = this.jumpCount;
          }
        }

      }

    }
  };

  for (i = 0; i < this.platformManager.platforms.length; i++) {
    this.platformManager.update();
  };

  for (i = 0; i < this.particles.length; i++) {
    this.particles[i].update();
  };

};

InfiniteRunner.draw = function(){
  this.player.draw();

  for (i = 0; i < this.platformManager.platforms.length; i++) {
    this.platformManager.platforms[i].draw();
  };

  for (i = 0; i < this.particles.length; i++) {
    this.particles[i].draw();
  };

  this.font = '12pt Arial';
  this.fillStyle = '#ffffff';
  this.fillText('RECORD: '+this.jumpCountRecord, this.width - (150 + (this.aceleration * 4)), 33 - (this.aceleration * 4));
  this.fillStyle = this.scoreColor;
  this.font = (12 + (this.aceleration * 3))+'pt Arial';
  this.fillText('JUMPS: '+this.jumpCount, this.width - (150 + (this.aceleration * 4)), 50);

};

InfiniteRunner.resize = function() {

};
body{
  background: rgb(227,227,227);
  overflow: hidden;
  margin: 0;
  padding: 0;
  text-align: center;
}

#container{
  margin-top: 1%;
  display: inline-block;
}

canvas{
  background: rgb(19,41,61);
  border: 1px solid rgb(0,0,0);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/sketch.js/1.0.0/sketch.min.js"></script>
<script src="https://s.codepen.io/assets/libs/modernizr.js"></script>
<div id="container"></div>
<div class="controls"></div>

1 个答案:

答案 0 :(得分:1)

您必须使用画布的drawImage方法。

但是你需要先加载图像(一种方法是在DOM中添加元素以便加载另一种方法是在内存中创建图像并加载你想要的文件

我更新了您的代码以支持将img DOM元素传递给Player构造函数,该构造函数将用作精灵并更新draw方法以使用drawImage

InfiniteRunner.drawImage(this.sprite, this.x, this.y, this.width, this.height);

更新了代码

var i = 0;

function random( min, max ) {
  return Math.round( min + ( Math.random() * ( max - min ) ) );
}

function randomChoice(array){
  return array[ Math.round( random( 0, array.length - 1 ) ) ];
}

var InfiniteRunner = Sketch.create({
  fullscreen: false,
  width: 640,
  height: 400 ,
  container: document.getElementById('container')
});

/*******************/
/*****VECTOR2*******/
/*******************/

function Vector2(x, y, width, height){
  this.x = x;
  this.y = y;
  this.width = width;
  this.height = height;
  this.previousX = 0;
  this.previousY = 0;
};

Vector2.prototype.setPosition = function(x, y) {

  this.previousX = this.x;
  this.previousY = this.y;

  this.x = x;
  this.y = y;

};

Vector2.prototype.setX = function(x) {

  this.previousX = this.x;
  this.x = x;

};

Vector2.prototype.setY = function(y) {

  this.previousY = this.y;
  this.y = y;

};


Vector2.prototype.insercects = function(obj){

  if(obj.x < this.x + this.width && obj.y < this.y + this.height &&
     obj.x + obj.width > this.x && obj.y + obj.height > this.y ){
    return true;
  }

  return false;
};

Vector2.prototype.insercectsLeft = function(obj){

  if(obj.x < this.x + this.width && obj.y < this.y + this.height ){
    return true;
  }

  return false;
};

/****************/
/*****PLAYER*****/
/****************/

function Player(options){

  this.setPosition(options.x, options.y);
  this.width = options.width;
  this.height = options.height;
  this.sprite = options.sprite;
  this.velocityX = 0;
  this.velocityY = 0;
  this.jumpSize = -13;
  this.color = 'rgba(245,44,22,1)';
}

Player.prototype = new Vector2;

Player.prototype.update = function() {
  this.velocityY += 1;
  this.setPosition(this.x + this.velocityX, this.y + this.velocityY);

  if(this.y > InfiniteRunner.height || this.x + this.width < 0){
    this.x = 150;
    this.y = 50;
    this.velocityX = 0;
    this.velocityY = 0;
    InfiniteRunner.jumpCount = 0;
    InfiniteRunner.aceleration = 0;
    InfiniteRunner.acelerationTweening = 0;
    InfiniteRunner.scoreColor = '#ffffff';
    InfiniteRunner.platformManager.maxDistanceBetween = 350;
    InfiniteRunner.platformManager.updateWhenLose();
  }

  if((InfiniteRunner.keys.UP || InfiniteRunner.keys.SPACE || InfiniteRunner.keys.W || InfiniteRunner.dragging) && this.velocityY < -8){
    this.velocityY += -0.75;
  }

};

Player.prototype.draw = function() {
  InfiniteRunner.fillStyle = this.color;
  //InfiniteRunner.fillRect(this.x, this.y, this.width, this.height);
  InfiniteRunner.drawImage(this.sprite, this.x, this.y, this.width, this.height);
};

/*******************/
/*****platform****/
/******************/

function Platform(options){
  this.x = options.x;
  this.y = options.y;
  this.width = options.width;
  this.height = options.height;
  this.previousX = 0;
  this.previousY = 0;
  this.color = options.color;
}

Platform.prototype = new Vector2;

Platform.prototype.draw = function() {
  InfiniteRunner.fillStyle = this.color;
  InfiniteRunner.fillRect(this.x, this.y, this.width, this.height);
};

/*******************PLATFORM MANAGER*************/

function PlatformManager(){
  this.maxDistanceBetween = 300;
  this.colors = ['#006494', '#247ba0', '#1b98e0', '#e8f1f2'];

  this.first = new Platform({x: 300, y: InfiniteRunner.width / 2, width: 400, height: 70})
  this.second = new Platform({x: (this.first.x + this.first.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween), y: random(this.first.y - 128, InfiniteRunner.height - 80), width: 400, height: 70})
  this.third = new Platform({x: (this.second.x + this.second.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween), y: random(this.second.y - 128, InfiniteRunner.height - 80), width: 400, height: 70})

  this.first.height = this.first.y + InfiniteRunner.height;
  this.second.height = this.second.y + InfiniteRunner.height;
  this.third.height = this.third.y + InfiniteRunner.height;
  this.first.color = randomChoice(this.colors);
  this.second.color = randomChoice(this.colors);
  this.third.color = randomChoice(this.colors);

  this.colliding = false;

  this.platforms = [this.first, this.second, this.third];
}

PlatformManager.prototype.update = function() {

  this.first.x -= 3 + InfiniteRunner.aceleration;
  if(this.first.x + this.first.width < 0 ){
    this.first.width = random(450, InfiniteRunner.width + 200);
    this.first.x = (this.third.x + this.third.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween);
    this.first.y = random(this.third.y - 32, InfiniteRunner.height - 80);
    this.first.height = this.first.y + InfiniteRunner.height + 10;
    this.first.color = randomChoice(this.colors);
  }

  this.second.x -= 3 + InfiniteRunner.aceleration;
  if(this.second.x + this.second.width < 0 ){
    this.second.width = random(450, InfiniteRunner.width + 200);
    this.second.x = (this.first.x + this.first.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween);
    this.second.y = random(this.first.y - 32, InfiniteRunner.height - 80);
    this.second.height = this.second.y + InfiniteRunner.height + 10;
    this.second.color = randomChoice(this.colors);
  }

  this.third.x -= 3 + InfiniteRunner.aceleration;
  if(this.third.x + this.third.width < 0 ){
    this.third.width = random(450, InfiniteRunner.width + 200);
    this.third.x = (this.second.x + this.second.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween);
    this.third.y = random(this.second.y - 32, InfiniteRunner.height - 80);
    this.third.height = this.third.y + InfiniteRunner.height + 10;
    this.third.color = randomChoice(this.colors);
  }

};

PlatformManager.prototype.updateWhenLose = function() {

  this.first.x = 300;
  this.first.color = randomChoice(this.colors);
  this.first.y = InfiniteRunner.width / random(2,3);
  this.second.x = (this.first.x + this.first.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween);
  this.third.x = (this.second.x + this.second.width) + random(this.maxDistanceBetween - 150, this.maxDistanceBetween);

};

/*******************PARTICLE SYSTEM*************/

function Particle(options){
  this.x = options.x;
  this.y = options.y;
  this.size = 10;
  this.velocityX = options.velocityX || random(-(InfiniteRunner.aceleration * 3) + -8,-(InfiniteRunner.aceleration * 3));
  this.velocityY = options.velocityY || random(-(InfiniteRunner.aceleration * 3) + -8,-(InfiniteRunner.aceleration * 3));
  this.color = options.color;
}

Particle.prototype.update = function() {
  this.x += this.velocityX;
  this.y += this.velocityY;
  this.size *= 0.89;
};

Particle.prototype.draw = function() {
  InfiniteRunner.fillStyle = this.color;
  InfiniteRunner.fillRect(this.x, this.y, this.size, this.size);
};

/************************************************/

InfiniteRunner.setup = function () {

  this.jumpCount = 0;
  this.aceleration = 0;
  this.acelerationTweening = 0;

  this.player = new Player({x: 150, y: 30, width: 32, height: 32, sprite: document.getElementById('sprite-player')});

  this.platformManager = new PlatformManager();

  this.particles = [];
  this.particlesIndex = 0;
  this.particlesMax = 2000;
  this.collidedPlatform = null;
  this.scoreColor = '#ffffff';
  this.jumpCountRecord = 0;

};

InfiniteRunner.update = function() {

  this.player.update();

  switch(this.jumpCount){
    case 10:
      this.acelerationTweening = 1;
      this.platformManager.maxDistanceBetween = 430;
      this.scoreColor = '#ffffff';
      break;
    case 25:
      this.acelerationTweening = 2;
      this.platformManager.maxDistanceBetween = 530;
      this.scoreColor = '#ffffff';
      break;
    case 40:
      this.acelerationTweening = 3;
      this.platformManager.maxDistanceBetween = 580;
      this.scoreColor = '#ffffff';
      break;
  }

  this.aceleration += (this.acelerationTweening - this.aceleration) * 0.01;

  for (i = 0; i < this.platformManager.platforms.length; i++) {
    if(this.player.insercects(this.platformManager.platforms[i])){
      this.collidedPlatform = this.platformManager.platforms[i];
      if (this.player.y < this.platformManager.platforms[i].y) {
        this.player.y = this.platformManager.platforms[i].y;
        this.player.velocityY = 0;
      }

      this.player.x = this.player.previousX;
      this.player.y = this.player.previousY;

      this.particles[(this.particlesIndex++)%this.particlesMax] = new Particle({
        x: this.player.x,
        y: this.player.y + this.player.height,
        color: this.collidedPlatform.color
      });

      if(this.player.insercectsLeft(this.platformManager.platforms[i])){
        this.player.x = this.collidedPlatform.x - 64;
        for (i = 0; i < 10; i++) {
          this.particles[(this.particlesIndex++)%this.particlesMax] = new Particle({
            x: this.player.x + this.player.width,
            y: random(this.player.y, this.player.y + this.player.height),
            velocityY: random(-30,30),
            color: randomChoice(['#ffffff','#ffffff', this.collidedPlatform.color])
          });
        };
        this.player.velocityY = -10 + -(this.aceleration * 4);
        this.player.velocityX = -20 + -(this.aceleration * 4);
        // this.jumpCount = 0;
        // this.aceleration = 0;
        // this.acelerationTweening = 0;
        // this.scoreColor = '#181818';
        // this.platformManager.maxDistanceBetween = 350;
        // this.platformManager.updateWhenLose();


      } else {

        if(this.dragging || this.keys.SPACE || this.keys.UP || this.keys.W){
          this.player.velocityY = this.player.jumpSize;
          this.jumpCount++;
          if(this.jumpCount > this.jumpCountRecord){
            this.jumpCountRecord = this.jumpCount;
          }
        }

      }

    }
  };

  for (i = 0; i < this.platformManager.platforms.length; i++) {
    this.platformManager.update();
  };

  for (i = 0; i < this.particles.length; i++) {
    this.particles[i].update();
  };

};

InfiniteRunner.draw = function(){
  this.player.draw();

  for (i = 0; i < this.platformManager.platforms.length; i++) {
    this.platformManager.platforms[i].draw();
  };

  for (i = 0; i < this.particles.length; i++) {
    this.particles[i].draw();
  };

  this.font = '12pt Arial';
  this.fillStyle = '#ffffff';
  this.fillText('RECORD: '+this.jumpCountRecord, this.width - (150 + (this.aceleration * 4)), 33 - (this.aceleration * 4));
  this.fillStyle = this.scoreColor;
  this.font = (12 + (this.aceleration * 3))+'pt Arial';
  this.fillText('JUMPS: '+this.jumpCount, this.width - (150 + (this.aceleration * 4)), 50);

};

InfiniteRunner.resize = function() {

};
body{
  background: rgb(227,227,227);
  overflow: hidden;
  margin: 0;
  padding: 0;
  text-align: center;
}

#container{
  margin-top: 1%;
  display: inline-block;
}

canvas{
  background: rgb(19,41,61);
  border: 1px solid rgb(0,0,0);
}

.sprites{width:0;height:0;overflow:hidden;}
<script src="https://cdnjs.cloudflare.com/ajax/libs/sketch.js/1.0.0/sketch.min.js"></script>
<script src="https://s.codepen.io/assets/libs/modernizr.js"></script>
<div class="sprites">
  <img src="https://cdn.kastatic.org/images/avatars/orange-juice-squid.png" id="sprite-player">
</div>
<div id="container"></div>
<div class="controls"></div>