• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Phaser, iteracja po grupie

VPS Starter Arubacloud
0 głosów
170 wizyt
pytanie zadane 1 stycznia 2019 w JavaScript przez ptaku19 Użytkownik (800 p.)
Witam, piszę klona Flappy Bird w Phaser i chciałbym zrobić dodawanie punktu po ominięciu pary rurek. W jaki sposób mogę iterować po grupie, aby otrzymać z niej pierwszy element? Próbowałem tak jak w czystym JS, ale nie działa.   

Drugie pytanie to w jaki sposób mogę wyłączyć kolizję z dolną częścią ekranu gry? Chcę, aby postać blokowała się na górze, a na dole spadała po za ekran. Próbowałem ustawiać checkWorldBounds i checkCollisionDown ustawiać na false, ale wyłącza to tylko kolizję z rurami.

Proszę o pomoc :D
komentarz 1 stycznia 2019 przez ScriptyChris Mędrzec (190,190 p.)

Pokażesz kod? Trudno cokolwiek wywnioskować z tego co napisałeś. Czy w konsoli są jakieś błędy?

komentarz 1 stycznia 2019 przez ptaku19 Użytkownik (800 p.)
for(var i=0; i <PipeGroup.length;i++){
  console.log(PipeGroup[i]);
}

W konsoli daje undefined.

PS Rurki dodaję co 1600ms

 game.time.events.loop(PipePushTime,addPipes,this)

 

komentarz 1 stycznia 2019 przez ScriptyChris Mędrzec (190,190 p.)
Co jest w zmiennej PipedGroup zanim po niej iterujesz?
komentarz 1 stycznia 2019 przez ptaku19 Użytkownik (800 p.)
function addPipes(){
    var hole = 150;
  var UpPipeHeight = game.math.between(0,SH-hole);
  var DownPipeHeight = hole+UpPipeHeight

 upPipe = new Pipes(game,pipe.startX,UpPipeHeight,1)
  game.add.existing(upPipe)
  PipeGroup.add(upPipe);

  upPipe.anchor.setTo(0,1);

   downPipe = new Pipes(game, pipe.startX, DownPipeHeight,0)
  game.add.existing(downPipe)
  PipeGroup.add(downPipe);

};

Rury :P

komentarz 1 stycznia 2019 przez ScriptyChris Mędrzec (190,190 p.)

Jeśli pętla się nie wykonuje, albo loguje same undefined, to albo PipedGroup jest puste, albo wypełnione pustymi wartościami. Czy funkcja addPipes prawidłowo uzupełnia PipedGroup? W ogóle, czym jest ta zmienna, bo skoro dodajesz do niej elementy jakąś metodą add(..), to nie jest to zwykła tablica. Możliwe więc, że źle zabierasz się za odczyt wartości - jeśli opierasz się na strukturze danych wspomnianej w pytaniu biblioteki Phaser, to doczytaj w dokumentacji jak obchodzić się z jej strukturami danych.

komentarz 1 stycznia 2019 przez ptaku19 Użytkownik (800 p.)

PipeGroup.length i total ciągle rośnie, na ekranie normalnie się one pojawiają. Działa też z nimi kolizja :

this.physics.arcade.collide(bird, PipeGroup,bird.gameOver,null,this);

Nie wiem co może być przyczyną ;/

Zmienne są zadeklarowane w pierwszych linijkach dokumentu.

var downPipe;

var upPipe;

komentarz 1 stycznia 2019 przez ScriptyChris Mędrzec (190,190 p.)

Wyświetl w konsoli zmienną PipedGroup przed tą pętlą, która pokazuje undefined, i pokaż co tam jest (screenshot). Póki co umieszczasz kawałki kodu, które nic nie mówią (przynajmniej mi). Jeśli to nie problem, to najlepiej by było, gdybyś pokazał cały kod tutaj w bloczku, albo jeśli jest tego więcej niż kilkadziesiąt linijek to wrzuć na GitHub i podlinkuj.

Poza tym, naucz się debugować kod. Sam lepiej wiesz co napisałeś, co się nie zgadza i jak reprodukować problem.

komentarz 1 stycznia 2019 przez ptaku19 Użytkownik (800 p.)

playState = {
 create:create,
 update:update
}

var bird;
var spaceKey;
var PipePushTime = 1600;
var PipeGroup;
var pipe;
var tutorial;
var upPipe;
var downPipe;
var firstPipe;

  function create(){
    game.physics.startSystem(Phaser.Physics.ARCADE);
  var background =  game.add.sprite(-1,0,'background')

     PipeGroup = game.add.group();
     bird = new Bird(game);
     pipe = new Pipes(game);

     addPipes()
     help();

 game.time.events.loop(PipePushTime,addPipes,this)

 bird.body.onWorldBounds = new Phaser.Signal();
 bird.body.onWorldBounds.add(bird.gameOver, this);


};

function update(){
this.physics.arcade.collide(bird, PipeGroup,bird.gameOver,null,this);


};



function Bird(game, x= 200, y=game.world.centerX){

Phaser.Sprite.call(this, game, x ,y ,'bird')
game.add.existing(this);

  this.scale.setTo(0.13,0.17);
  this.anchor.setTo(-0.2,0.5);
  game.physics.enable(this);
 this.body.gravity.y = 0;
  this.jumpPower = 500;
 this.body.collideWorldBounds = true;
//   this.body.checkCollision.up =false;


  this.jump = function(){
    this.body.velocity.y = -this.jumpPower;
     game.add.tween(this).to({angle: -20},150).start();
    this.body.gravity.y = 1700;
    game.add.tween(tutorial).to({alpha:0},800).start();
  }

  this.gameOver = function(){
    game.state.start('FlappyBird')
  }

};

Bird.prototype = Object.create(Phaser.Sprite.prototype);
Bird.prototype.constructor = Bird;

Bird.prototype.update= function(){
bird.jumping()

};

Bird.prototype.jumping = function(){
  spaceKey = game.input.keyboard.addKey(Phaser.Keyboard.SPACEBAR);
 spaceKey.onDown.add(this.jump, this);

 if(this.angle == -20 ){
   game.add.tween(this).to({angle:0},150).start();
 }
}
Bird.prototype.score = function (){


};


///////////
function Pipes(game, x, y, index){
Phaser.Sprite.call(this, game, x, y,'pipes',index)

this.scale.setTo(1.7,1)
game.physics.enable(this)
this.speed = -200;
this.startX = SW + 200;

this.body.immovable = true;
this.checkWorldBounds = true;

  //this.body.checkCollision.right =false;
 //this.outOfBoundsKill = true;


this.move = function(){
  this.body.velocity.x = this.speed
}
};

Pipes.prototype = Object.create(Phaser.Sprite.prototype);
Pipes.prototype.constructor = Pipes;

Pipes.prototype.update = function(){
  this.move();

};


function addPipes(){
    var hole = 150;
  var UpPipeHeight = game.math.between(0,SH-hole);
  var DownPipeHeight = hole+UpPipeHeight

 upPipe = new Pipes(game,pipe.startX,UpPipeHeight,1)
  game.add.existing(upPipe)
  PipeGroup.add(upPipe);

  upPipe.anchor.setTo(0,1);

   downPipe = new Pipes(game, pipe.startX, DownPipeHeight,0)
  game.add.existing(downPipe)
  PipeGroup.add(downPipe);

};

function help(){
  tutorial =  game.add.text(SW/2,SH/2,'Press Space to Jump!')
tutorial.anchor.setTo(0.5,0)
}

 

komentarz 1 stycznia 2019 przez ScriptyChris Mędrzec (190,190 p.)

Czy ten kod jest pełny? Pojawia się błąd "Uncaught TypeError: Cannot read property 'prototype' of undefined" dla linijki:

Bird.prototype = Object.create(Phaser.Sprite.prototype);

Nie widzę w kodzie żebyś tworzył i dodawał metodę Sprite do obiektu Phaser. Korzystasz jeszcze z jakiejś biblioteki, albo masz więcej skryptów zależnych? Nie podałeś wersji libki Phaser, z której korzystasz - podpiąłem testowo najnowszą, może tam brakuje metody Phaser.Sprite dlatego mi nie działa (nie wiem, strzelam). Nie ma w tym kodzie pętli, z którą masz problem. Nie pokazałeś stanu zmiennej przed pętlą. Nie napisałeś jak to uruchomić. W skrócie - nie ułatwiasz sobie pomocy.

komentarz 1 stycznia 2019 przez ptaku19 Użytkownik (800 p.)
Cała gra ma 6 skryptów. W jaki sposób je wkleić?

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 137 wizyt
pytanie zadane 5 stycznia 2023 w JavaScript przez xTMx3 Obywatel (1,560 p.)
0 głosów
1 odpowiedź 146 wizyt
pytanie zadane 30 grudnia 2022 w JavaScript przez xTMx3 Obywatel (1,560 p.)
0 głosów
0 odpowiedzi 115 wizyt
pytanie zadane 26 grudnia 2022 w JavaScript przez xTMx3 Obywatel (1,560 p.)

92,830 zapytań

141,771 odpowiedzi

320,817 komentarzy

62,159 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...