login  Naam:   Wachtwoord: 
Registreer je!
 Forum

as3 flash game problemen. (Opgelost)

Offline lolll - 27/08/2010 09:37 (laatste wijziging 27/08/2010 09:39)
Avatar van lolllLid Ik ben bezig aan een nieuwe flash game, een ruimtespel waarin je vijandelijke schepen en meteorieten moet kapot schieten enz. Ik heb nu een basisruimteschip gemaakt dat al kan schieten, maar ik wil voor de volgende dingen zorgen:
1. Als ik nu op spatie blijf drukken, blijft hij kogels schieten, ik zou willen dat er pas om de seconde een kogel mag geschoten worden.

2. Als ik nu op pijltje naar onder en pijltje naar links druk, gaat hij maar in 1 van de twee richtingen. Hoe moet ik ervoor zorgen dat hij ook schuin kan gaan ?

3. Mijn kogel bestaat uit 2 delen, de kogel zelf en een lange staart (met vuur in de ruimte). Nu zou ik willen dat als ik vijandelijke ruimteschepen toevoeg, dat die alleen kapot mogen gaan als de kogel zelf hen raakt, niet de staart (ook al is de staart recht, als iets lang ronddraait en het komt tegen de staart, mag het niet kapot gaan.).

Hopelijk zijn mijn problemen een beetje duidelijk uitgelegd. Dit is de code:
  1. stop();
  2.  
  3. stage.addEventListener(KeyboardEvent.KEY_DOWN, chkDownkey);
  4. function chkDownkey(e:KeyboardEvent):void{
  5. var key=e.keyCode;
  6. var step=5;
  7. switch (key) {
  8. case Keyboard.LEFT :
  9. if(spaceship.x > 27){
  10. spaceship.x -= step;
  11. }
  12. break;
  13. case Keyboard.RIGHT :
  14. if(spaceship.x < 650){
  15. spaceship.x += step;
  16. }
  17. break;
  18. case Keyboard.UP :
  19. if(spaceship.y > 25){
  20. spaceship.y -= step;
  21. }
  22. break;
  23. case Keyboard.DOWN :
  24. if(spaceship.y < 432){
  25. spaceship.y += step;
  26. }
  27. break;
  28. case Keyboard.SPACE :
  29. var kogel:kogel_total_mc=new kogel_total_mc();
  30. kogel.x=spaceship.x + 33;
  31. kogel.y=spaceship.y;
  32. addChild(kogel);
  33. break;
  34. }
  35. }

En voor de zekerheid zet ik hier ook maar de code van de kogel, voor moest iemand daar iets aan willen toevoegen.
  1. stop();
  2. this.parent.removeChild(this);// staat in de laatste frame om de kogel terug van de stage te verwijderen.


Grt,Lolll

8 antwoorden

Gesponsorde links
Offline Maarten - 27/08/2010 09:46
Avatar van Maarten Erelid Antwoord op punt 1: normaal wordt de handler constant aangeroepen. Je zou hier kunnen de laatste execution tijd bijhouden, en dan pas verdergaan als deze meer dan een seconde geleden is.

Voor punt drie komt het er op neer dat je een hittest moet doen op enkel de kop, niet de staart, en somehow opvragen WAAR de hittest zich juist voordoet.. misschien kan je nog een apart stuk toevoegen aan je "raket" in de vorm van de raakpunten, en daarop de hittest doen.
Bedankt door: lolll
Offline lolll - 27/08/2010 09:49
Avatar van lolll Lid ok de oplossing voor punt 3 snap ik, voor 1 moet ik dus een timer instellen en controleren of die is afgelopen ?
Offline Maarten - 27/08/2010 09:56 (laatste wijziging 27/08/2010 09:56)
Avatar van Maarten Erelid Nee, zoiets (pseudo):

lastSpaceBarHandlerTime = null

  1. handlerVoorspatiebalk() {
  2. if(lastspacebarhandlertime is meer dan 1 seconde geleden) {
  3. uitvoeren
  4. lastSpaceBarHandlerTime = nu
  5. }
  6.  
  7. }
Offline lolll - 27/08/2010 10:01
Avatar van lolll Lid euhm, kan je dat een beetje verduidelijken hoe ik dat moet doen, zoiets ken ik nl. nog niet.
Offline Maarten - 27/08/2010 10:24 (laatste wijziging 27/08/2010 10:24)
Avatar van Maarten Erelid
  1. stop();
  2.  
  3. stage.addEventListener(KeyboardEvent.KEY_DOWN, chkDownkey);
  4.  
  5. // HIER DEFINIEER JE EEN DATUM OBJECT, DAARIN STOP JE DE DATUM VAN VANDAAG
  6. var lastSpaceBarHandlerTime = [NU - AS is mijn ding niet, dus zoek dat zelf maar]
  7.  
  8. function chkDownkey(e:KeyboardEvent):void{
  9. var key=e.keyCode;
  10. var step=5;
  11. switch (key) {
  12. case Keyboard.LEFT :
  13. if(spaceship.x > 27){
  14. spaceship.x -= step;
  15. }
  16. break;
  17. case Keyboard.RIGHT :
  18. if(spaceship.x < 650){
  19. spaceship.x += step;
  20. }
  21. break;
  22. case Keyboard.UP :
  23. if(spaceship.y > 25){
  24. spaceship.y -= step;
  25. }
  26. break;
  27. case Keyboard.DOWN :
  28. if(spaceship.y < 432){
  29. spaceship.y += step;
  30. }
  31. break;
  32. case Keyboard.SPACE :
  33. // HIER CHECK JE OF HET AL EEN SECONDE GELEDEN IS DAT ER EEN DING IS AFGEVUURD
  34. if([VERSCHIL TUSSEN NU EN lastSpaceBarHandlerTime IN SECONDEN] >= 1) {
  35. var kogel:kogel_total_mc=new kogel_total_mc();
  36. kogel.x=spaceship.x + 33;
  37. kogel.y=spaceship.y;
  38. addChild(kogel);
  39. lastSpaceBarHandlerTime = [NU];
  40. }
  41. break;
  42. }
  43. }

Het enige wat je nu dus nog moet doen is kijken hoe datums werken in Flash, en hoe je het verschil tussen twee datums in seconden te weten komt. Thankyoucomegain.
Offline lolll - 27/08/2010 11:57
Avatar van lolll Lid Het is gelukt! thx. Dit is nu de code ( ik heb het maar in een apparte functie gezet. )

  1. stop();
  2.  
  3. stage.addEventListener(KeyboardEvent.KEY_DOWN, chkDownkey);
  4.  
  5. var lastshoot:Date=new Date();
  6.  
  7. function chkDownkey(e:KeyboardEvent):void{
  8. var key=e.keyCode;
  9. var step=5;
  10. switch (key) {
  11. case Keyboard.LEFT :
  12. if(spaceship.x > 27){
  13. spaceship.x -= step;
  14. }
  15. break;
  16. case Keyboard.RIGHT :
  17. if(spaceship.x < 650){
  18. spaceship.x += step;
  19. }
  20. break;
  21. case Keyboard.UP :
  22. if(spaceship.y > 25){
  23. spaceship.y -= step;
  24. }
  25. break;
  26. case Keyboard.DOWN :
  27. if(spaceship.y < 432){
  28. spaceship.y += step;
  29. }
  30. break;
  31. case Keyboard.SPACE :
  32. shoot();
  33. break;
  34. }
  35. }
  36. function shoot():void{
  37. if((new Date().getTime()) - (lastshoot.getTime()) >= 1000){
  38. var kogel:kogel_total_mc=new kogel_total_mc();
  39. kogel.x=spaceship.x + 33;
  40. kogel.y=spaceship.y;
  41. addChild(kogel);
  42. lastshoot=new Date();
  43. }
  44. }


Nu zou ik alleen nog een oplossing moeten hebben voor mijn 2de probleem.

Grt,Lolll
Offline Maarten - 27/08/2010 12:52
Avatar van Maarten Erelid http://www.axel...onscript-3/
Offline lolll - 27/08/2010 16:08 (laatste wijziging 28/08/2010 14:12)
Avatar van lolll Lid ok, ik vind het idee wel goed, maar het is een hele hoop code, ik had gedacht dat dat iets eenvoudiger kon. Weet iemand anders mss nog iets om dit eenvoudiger op te lossen. Ik zal nu beginnen om jouw code uit te proberen.

Grt,Lolll

Edit: ik ben niet echt geslaagd, ik weet echt niet hoe ik dat in mijn script moet invoegen, ik heb ook al op google gezocht, maar ik vind alleen maar ingewikkelde classes.

EDIT EDIT: Het schuin gaan heb ik even achterwegen gelaten, maar het lukt me niet om een juiste hittest uit te voeren. Ik heb nu al vijandige schepen, maar ik weet niet hoe ik daarop nu die hittest moet uitvoeren, kan iemand me hier even bij helpen ?
/*Dit is de code :*/
EDIT EDIT EDIT: Met het volgende script wordt het eerste object verwijderd, maar daarna krijg ik foutmeldingen en verwijderd het niets meer :

  1. stop();
  2.  
  3. stage.addEventListener(KeyboardEvent.KEY_DOWN, chkDownkey);
  4.  
  5. var lastshoot:Date=new Date();
  6.  
  7. function chkDownkey(e:KeyboardEvent):void{
  8. var key=e.keyCode;
  9. var step=5;
  10. switch (key) {
  11. case Keyboard.LEFT :
  12. if(spaceship.x > 27){
  13. spaceship.x -= step;
  14. }
  15. break;
  16. case Keyboard.RIGHT :
  17. if(spaceship.x < 650){
  18. spaceship.x += step;
  19. }
  20. break;
  21. case Keyboard.UP :
  22. if(spaceship.y > 25){
  23. spaceship.y -= step;
  24. }
  25. break;
  26. case Keyboard.DOWN :
  27. if(spaceship.y < 432){
  28. spaceship.y += step;
  29. }
  30. break;
  31. case Keyboard.SPACE :
  32. shoot();
  33. break;
  34. }
  35. }
  36. function shoot():void{
  37. if((new Date().getTime()) - (lastshoot.getTime()) >= 1000){
  38. var kogel:kogel_total_mc=new kogel_total_mc();
  39. kogel.x=spaceship.x + 33;
  40. kogel.y=spaceship.y;
  41. kogel.name="kogel";
  42. kogel.addEventListener(Event.ENTER_FRAME, kogelenterframe);
  43. addChild(kogel);
  44. lastshoot=new Date();
  45. }
  46. }
  47. for(var i:int=0; i<5; i++){
  48. var vijand:vijand_mc=new vijand_mc();
  49. vijand.name="vijand" + i;
  50. vijand.x=750;
  51. vijand.y=Math.random() * 460;
  52. vijand.addEventListener(Event.ENTER_FRAME, vijandenterframe);
  53. vijand.snelheid=Math.random() * 5 + 2;
  54. addChild(vijand);
  55. }
  56. function vijandenterframe(e:Event):void{
  57. e.currentTarget.x = e.currentTarget.x - e.currentTarget.snelheid;
  58. if(e.currentTarget.x<-25){
  59. reset(e);
  60. }
  61. }
  62. function kogelenterframe(e:Event):void{
  63. for (i = 0; i < 5; i++)
  64. {
  65. if (e.currentTarget.hitTestObject(getChildByName("vijand" + i))){
  66. removeChild(getChildByName("vijand" + i));
  67. e.currentTarget.parent.removeChild(e.currentTarget);
  68. }
  69. }
  70. }
  71. function reset(e:Event):void{
  72. e.currentTarget.x = 750;
  73. e.currentTarget.y = Math.random() * 460;
  74. e.currentTarget.snelheid=Math.random() * 5 + 2;
  75. }
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.203s