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

Phaser, iteracja po grupie

Aruba Cloud - Virtual Private Server VPS
0 głosów
261 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 51 wizyt
pytanie zadane 27 stycznia w JavaScript przez RufinB Bywalec (2,020 p.)
0 głosów
0 odpowiedzi 165 wizyt
pytanie zadane 5 stycznia 2023 w JavaScript przez xTMx3 Obywatel (1,560 p.)
0 głosów
1 odpowiedź 238 wizyt
pytanie zadane 30 grudnia 2022 w JavaScript przez xTMx3 Obywatel (1,560 p.)

93,331 zapytań

142,323 odpowiedzi

322,400 komentarzy

62,667 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...