Advertisement
Guest User

Untitled

a guest
May 27th, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.69 KB | None | 0 0
  1. public class Azure extends ScrollingActor //diese Klasse definiert die folgenden Methoden damit ich sie in meinem Projekt frei verwenden kann
  2. {
  3. private int vSpeed = 0;
  4. private int acceleration = 1;
  5. private boolean jumping;
  6. private int shootingCounter = 10;
  7. private int Counter = 1;
  8. private int regenHP = 200;
  9. boolean hitInv = false;
  10.  
  11. private static GreenfootImage[] rightAnim = new GreenfootImage[10]; // hier werden einzelne Sprites aus dem Speicher in das Program geladen damit ich sie animieren kann
  12. private static GreenfootImage[] leftAnim = new GreenfootImage[10];
  13. private static GreenfootImage[] standAnim = new GreenfootImage[9];
  14. private static GreenfootImage[] standLeftAnim = new GreenfootImage[9];
  15. private static GreenfootImage[] runAnim = new GreenfootImage[10];
  16. private static GreenfootImage[] runLeftAnim = new GreenfootImage[10];
  17. private static GreenfootImage[] runBAnim = new GreenfootImage[10];
  18. private static GreenfootImage[] runLeftBAnim = new GreenfootImage[10];
  19. private static GreenfootImage[] jumpAnim = new GreenfootImage[3];
  20. private static GreenfootImage[] jumpLeftAnim = new GreenfootImage[3];
  21. private static GreenfootImage[] standBAnim = new GreenfootImage[1];
  22. private static GreenfootImage[] standLeftBAnim = new GreenfootImage[1];
  23. private static GreenfootImage[] rightBAnim = new GreenfootImage[11];
  24. private static GreenfootImage[] leftBAnim = new GreenfootImage[11];
  25. private static GreenfootImage[] jumpBAnim = new GreenfootImage[4];
  26. private static GreenfootImage[] jumpLeftBAnim = new GreenfootImage[4];
  27. private static GreenfootImage[] exAnim = new GreenfootImage[7];
  28. private static GreenfootImage[] getHitAnim = new GreenfootImage[4];
  29. private static GreenfootImage[] getHitLeftAnim = new GreenfootImage[4];
  30.  
  31. static // hier werden die einzelnen Sprites zu einer Bildabfolge/Animation zusammengesetz
  32. {
  33. for (int i=0; i<standAnim.length; i++) standAnim[i] = new GreenfootImage("Stand_0"+(i+1)+".png");
  34. for (int i=0; i<standLeftAnim.length; i++) standLeftAnim[i] = new GreenfootImage("StandLeft_0"+(i+1)+".png");
  35. for (int i=0; i<rightAnim.length; i++) rightAnim[i] = new GreenfootImage("Walk-A_"+(i < 10 ? "0" : "")+(i+1)+".png");
  36. for (int i=0; i<leftAnim.length; i++) leftAnim[i] = new GreenfootImage("WalkLeft-A_"+(i < 10 ? "0" : "")+(i+1)+".png");
  37. for (int i=0; i<runAnim.length; i++) runAnim[i] = new GreenfootImage("Run_0"+(i+1)+".png");
  38. for (int i=0; i<runLeftAnim.length; i++) runLeftAnim[i] = new GreenfootImage("RunLeft_0"+(i+1)+".png");
  39. for (int i=0; i<runBAnim.length; i++) runBAnim[i] = new GreenfootImage("RunB_0"+(i+1)+".png");
  40. for (int i=0; i<runLeftBAnim.length; i++) runLeftBAnim[i] = new GreenfootImage("RunLeftB_0"+(i+1)+".png");
  41. for (int i=0; i<jumpAnim.length; i++) jumpAnim[i] = new GreenfootImage("Jump_0"+(i+1)+".png");
  42. for (int i=0; i<jumpLeftAnim.length; i++) jumpLeftAnim[i] = new GreenfootImage("JumpLeft_0"+(i+1)+".png");
  43. for (int i=0; i<standBAnim.length; i++) standBAnim[i] = new GreenfootImage("StandB_0"+(i+1)+".png");
  44. for (int i=0; i<standLeftBAnim.length; i++) standLeftBAnim[i] = new GreenfootImage("StandLeftB_0"+(i+1)+".png");
  45. for (int i=0; i<rightBAnim.length; i++) rightBAnim[i] = new GreenfootImage("WalkB_"+(i < 10 ? "0" : "")+(i+1)+".png");
  46. for (int i=0; i<leftBAnim.length; i++) leftBAnim[i] = new GreenfootImage("WalkLeftB_"+(i < 10 ? "0" : "")+(i+1)+".png");
  47. for (int i=0; i<jumpBAnim.length; i++) jumpBAnim[i] = new GreenfootImage("JumpB_0"+(i+1)+".png");
  48. for (int i=0; i<jumpLeftBAnim.length; i++) jumpLeftBAnim[i] = new GreenfootImage("JumpLeftB_0"+(i+1)+".png");
  49. for (int i=0; i<getHitAnim.length; i++) getHitAnim[i] = new GreenfootImage("Damage_0"+(i+1)+".png");
  50. for (int i=0; i<getHitLeftAnim.length; i++) getHitLeftAnim[i] = new GreenfootImage("DamageLeft_0"+(i+1)+".png");
  51. }
  52.  
  53. private int animCount;
  54. private int animDelay = 6;
  55.  
  56. private void setAnim(GreenfootImage[] anim, int frameRate)
  57. {
  58. animSet = anim;
  59. animCount = -1; // sorgt dafür das die animation richtig abläuft
  60. animDelay = frameRate;
  61. animate(); // ruft die animate() Methode auf um eine falls nötig eine neue Animation zu beginnen
  62.  
  63. }
  64.  
  65. private GreenfootImage[] animSet = standAnim; // die "default animation" ist die steh Animation
  66.  
  67. public void act() // Hier werden nacheinander die Methoden aufgerufen um den Spiel Character "spielbar" zu machen
  68. {
  69. animate();
  70. canMoveRight();
  71. canMoveLeft();
  72. horizontalMovement();
  73. checkFall();
  74. shootingCounter --;
  75. getHit();
  76. fallOutOfWorld();
  77. regenHP--;
  78. }
  79.  
  80. public void fall() // sorgt dafür das der Charakter zu Boden fällt
  81. {
  82. setLocation(getX(), getY() +vSpeed); // die Position wird abgefragt und die Vertikale Geschwindigkeit wird addiert
  83.  
  84. {
  85. vSpeed = vSpeed + acceleration; // der Charakter fällt schneller desto länger er in der Luft ist um die Schwerkraft zu simulieren
  86. }
  87. jumping = true; // ist der Charakter also in der Luft heißt das für das Spiel das der Charakter gerade Springt
  88. }
  89.  
  90. public boolean onGround()
  91. {
  92. int spriteHeight = getImage().getHeight(); // fragt die Charakter Ausmaße ab
  93. int lookForGround = (int) (spriteHeight/2-30); // setz den Charakter 30 Pixel in den Boden um einen pseudo 3d effekt zu erzeugen
  94.  
  95. Actor ground = getOneObjectAtOffset(0, lookForGround, Collider.class); //fragt ab ob die Ränder des Charakter den Boden berühren
  96.  
  97. if(ground == null)
  98. {
  99. jumping = true;
  100. return false;
  101. }
  102. else
  103. {
  104. moveToGround(ground); //falls ja, fällt der Charakter bis er den Boden berührt oder aus der Welt fällt und stirbt
  105. return true;
  106. }
  107.  
  108. }
  109.  
  110. public boolean ceiling()
  111. {
  112. int spriteHeight = getImage().getHeight(); //fragt erneut die Ausmaße ab aber diesmal für die Decke.
  113. int yDistance = (int) (spriteHeight/-2);
  114.  
  115. Actor ceiling = getOneObjectAtOffset(0, yDistance, Collider.class); //sorgt dafür das der Charakter aus der Decke raus geschoben wird
  116.  
  117. if(ceiling != null)
  118. {
  119. vSpeed =0;
  120. hitHead(ceiling);
  121. return true;
  122. }
  123. else
  124. {
  125.  
  126. return false;
  127. }
  128.  
  129. }
  130.  
  131. public void hitHead(Actor ceiling)
  132. {
  133. int ceilingHeight = ceiling.getImage().getHeight();
  134. int newY = ceiling.getY() + (ceilingHeight + getImage().getHeight())/2;
  135.  
  136. setLocation(getX(), newY);
  137.  
  138.  
  139. }
  140.  
  141. public boolean canMoveLeft() //fragt ab ob links vom Charakter eine Wand ist, falls nein, kann er sich nach links bewegen
  142. {
  143. boolean canMoveLeft = true;
  144.  
  145. int imageWidth = getImage().getWidth();
  146. int imageHeight = getImage().getHeight();
  147. if (getOneObjectAtOffset(imageWidth/-2 -3, imageHeight/-2, Collider.class) !=null ||
  148. getOneObjectAtOffset(imageWidth/-2 -3, imageHeight/2-35, Collider.class) !=null) // Hier wird die Kollision der Sprites für die Umgebungsobjekte angegeben und um ein paar Pixel nach innen gezogen, damit der Charakter nicht an der Wand kleben bleibt
  149. canMoveLeft = false;
  150.  
  151. return canMoveLeft;
  152.  
  153. }
  154.  
  155. public boolean canMoveRight() //gleich wie canMoveLeft
  156. {
  157. boolean canMoveRight = true;
  158.  
  159. int imageWidth = getImage().getWidth();
  160. int imageHeight = getImage().getHeight();
  161. if (getOneObjectAtOffset(imageWidth/2 +3, imageHeight/-2, Collider.class) !=null ||
  162. getOneObjectAtOffset(imageWidth/2 +3, imageHeight/2-35, Collider.class) !=null)
  163. canMoveRight = false;
  164.  
  165. return canMoveRight;
  166. }
  167.  
  168. public void moveToGround(Actor ground) // dies ist die Methode die dafür sorgt das der Charakter nicht im boden stecken bleibt
  169. {
  170. int groundHeight = ground.getImage().getHeight();
  171. int newY = ground.getY() - (groundHeight + getImage().getHeight())/2+30;
  172.  
  173. setLocation(getX(), newY);
  174. jumping = false;
  175.  
  176. }
  177.  
  178. public void checkFall() //hier werden die "Schwerkraft" Methoden abgefragt
  179. {
  180. if(onGround()) //ist er am boden wird die Fallgeschwindigkeit auf 0 gesetz
  181. {
  182. vSpeed = 0;
  183.  
  184. }
  185. else //ansonsten fällt der Charakter
  186. {
  187. fall();
  188. }
  189.  
  190. }
  191.  
  192. public void horizontalMovement() // Hier werden die Horizontallen Bewegungen des Charakter definiert
  193. {
  194. boolean onGround = false;
  195. int boost = 6;
  196.  
  197. int dir = 0;// Direction wird zu anfang auf 0 gesetzt da der Charakter sich ja noch nicht bewegt
  198. int vDir = (int)Math.signum(vSpeed);
  199.  
  200. if (Greenfoot.isKeyDown("left") && canMoveLeft()) dir--; // solange der Links knopf gedrück wird ist dir == -1
  201. if (Greenfoot.isKeyDown("right") && canMoveRight()) dir++; // solange der Rechts knopf gedrück wird ist dir == 1
  202.  
  203. setLocation(getX()+(8)*dir, getY()); //8 ist hier die Gehgeschwindigkeit
  204.  
  205. if(dir == -1)// jedes mal wenn entweder Links oder Rechts gedrückt wird ein weiterer Counter auf 0 oder 1 gesetzt, dies ist wichtig für die Animationen da es dem Programm sagt welcher Knopf als letztes gedrückt wurde
  206. {
  207. Counter = 0;
  208. }
  209. if(dir == 1)
  210. {
  211. Counter = 1;
  212. }
  213.  
  214. if (dash() == true)
  215. setLocation(getX()+(8+boost)*dir, getY()); // boost steht hier für die Laufgeschwindigkeit, die zur Gehgeschwingkeit addiert wird
  216.  
  217. if (jump() == true) //definiert die höhe des Sprungs
  218. setLocation(getX(), getY() - 20);
  219.  
  220. if (vDir > 0) onGround = true;
  221.  
  222. //im folgenden werden alle animationen den einzelnen Tastaturbefehlen zugewiesen damit sich die animationen nicht überlappen und immer nur eine zur zeit abgespielt wird
  223. if (dir == -1 && animSet != leftAnim && dash() == false && shooting() == false && vSpeed <= 0 ) setAnim(leftAnim, 3);
  224. else if (dir == 1 && animSet != rightAnim && dash() == false && shooting() == false && vSpeed <= 0) setAnim(rightAnim, 3);
  225.  
  226. else if (dir == 0 && animSet != standLeftAnim && shooting() == false && vSpeed <= 0 && Counter == 0) setAnim( standLeftAnim, 6);
  227. else if (dir == 0 && animSet != standAnim && shooting() == false && vSpeed <= 0 && Counter == 1) setAnim( standAnim, 6);
  228.  
  229. else if (dir == 1 && animSet != jumpAnim && jump() == true && shooting() == false ) setAnim(jumpAnim, 16);
  230. else if (dir == -1 && animSet != jumpLeftAnim && jump() == true && shooting() == false ) setAnim(jumpLeftAnim, 16);
  231.  
  232. else if (dir == 0 && animSet != jumpLeftAnim && jump() == true && shooting() == false && Counter == 0) setAnim(jumpLeftAnim, 6);
  233. else if (dir == 0 && animSet != jumpAnim && jump() == true && shooting() == false && Counter == 1) setAnim(jumpAnim, 6);
  234.  
  235. else if ( dir == 1 && dash() == true && animSet != runAnim && jump() == false && shooting() == false && vSpeed <= 0 )setAnim(runAnim,2);
  236. else if ( dir == -1 && dash() == true && animSet != runLeftAnim && jump() == false && shooting() == false && vSpeed <= 0 )setAnim(runLeftAnim,2);
  237.  
  238. else if ( dir == 1 && dash() == true && animSet != runBAnim && jump() == false && shooting() == true && vSpeed <= 0 )setAnim(runBAnim,2);
  239. else if ( dir == -1 && dash() == true && animSet != runLeftBAnim && jump() == false && shooting() == true && vSpeed <= 0 )setAnim(runLeftBAnim,2);
  240.  
  241. else if (dir == 0 && animSet != standLeftBAnim && jump() == false && shooting() == true && vSpeed <= 0 && Counter == 0) setAnim(standLeftBAnim, 6);
  242. else if (dir == 0 && animSet != standBAnim && jump() == false && shooting() == true && vSpeed <= 0 && Counter == 1) setAnim(standBAnim, 6);
  243.  
  244. else if (dir == 1 && animSet != leftBAnim && dash() == false && shooting() == true && vSpeed <= 0 ) setAnim(leftBAnim, 3);
  245. else if (dir == -1 && animSet != rightBAnim && dash() == false && shooting() == true && vSpeed <= 0 ) setAnim(rightBAnim, 3);
  246.  
  247. else if (dir == -1 && animSet != jumpBAnim && jump() == true && shooting() == true ) setAnim(jumpBAnim, 8);
  248. else if (dir == 1 && animSet != jumpLeftBAnim && jump() == true && shooting() == true ) setAnim(jumpLeftBAnim, 8);
  249.  
  250. else if (dir == 0 && animSet != jumpBAnim && jump() == true && shooting() == true && Counter == 0) setAnim(jumpBAnim, 8);
  251. else if (dir == 0 && animSet != jumpLeftBAnim && jump() == true && shooting() == true && Counter == 1) setAnim(jumpLeftBAnim, 8);
  252.  
  253. if(dir == 1 && shooting() == true && shootingCounter <=0 )
  254. {
  255. getWorld().addObject(new PlasmaShot(), getX()+90, getY()-34); //hier wird ein neus Objekt zum Charakter hinzugefügt um einen Schuss darzustellen
  256. shootingCounter = 10; //wie lange der Charakter warten muss bis er wieder schießen kann
  257. Greenfoot.playSound("Laser.mp3");
  258. }
  259. else if(dir == -1 && shooting() == true && shootingCounter <=0 )
  260. {
  261. getWorld().addObject(new PlasmaShotLeft(), getX()-90, getY()-34);
  262. shootingCounter = 10;
  263. Greenfoot.playSound("Laser.mp3");
  264. }
  265. else if (dir == 0 && (animSet == jumpLeftBAnim || animSet == standBAnim ) && shooting() == true && shootingCounter <=0 )//weitere animationen für springen und schießen
  266. {
  267. getWorld().addObject(new PlasmaShot(), getX()+90, getY()-34);
  268. shootingCounter = 10;
  269. Greenfoot.playSound("Laser.mp3");
  270. }
  271. else if (dir == 0 && (animSet == jumpBAnim || animSet == standLeftBAnim) && shooting() == true && shootingCounter <=0 )
  272. {
  273. getWorld().addObject(new PlasmaShotLeft(), getX()-90, getY()-34);
  274. shootingCounter = 10;
  275. Greenfoot.playSound("Laser.mp3");
  276. }
  277. else if ((dir == 1 || dir == 0) && animSet != getHitAnim && hitInv == true) setAnim(getHitAnim,2);
  278.  
  279. else if (dir == -1 && animSet != getHitLeftAnim && hitInv == true) setAnim(getHitLeftAnim,2);
  280. }
  281.  
  282. public boolean jump()//hier werden die einzelnen Tastaturbefehle vom Programm aufgenommen
  283. {
  284. if (Greenfoot.isKeyDown("space"))
  285. {
  286. return true;
  287. }
  288. else
  289. {
  290. return false;
  291. }
  292. }
  293.  
  294. public boolean dash()
  295. {
  296. if (Greenfoot.isKeyDown("s"))
  297. {
  298. return true;
  299. }
  300. else
  301. {
  302. return false;
  303. }
  304. }
  305.  
  306. public boolean shooting()
  307. {
  308. if (Greenfoot.isKeyDown("d"))
  309. {
  310. return true;
  311.  
  312. }
  313. else
  314. {
  315. return false;
  316. }
  317. }
  318.  
  319. public void getHit() // überlappen sich die Sprites eines Gegners und des Charakters bekommt der Charakter schaden
  320. {
  321. Actor Enemy = getOneIntersectingObject(Enemy.class);
  322. World myWorld = getWorld();
  323. AzureWorld azureworld = (AzureWorld)myWorld;
  324. HP healthbar = azureworld.getHP();
  325. if(Enemy != null)
  326. {
  327.  
  328.  
  329. if (hitInv == false)
  330. {
  331. healthbar.loseHealth();
  332. hitInv = true;
  333.  
  334.  
  335. if(healthbar.health <=0) // hat der Charakter kein Leben mehr, stirbt er und ein "GAME OVER" erscheint
  336. {
  337. GameOver gameover = new GameOver();
  338. myWorld.addObject(gameover, myWorld.getWidth()/2,myWorld.getHeight()/2);
  339. myWorld.removeObject(this);
  340. }
  341.  
  342. }
  343.  
  344. }
  345. else if(regenHP <= 0) //der Charakter kann Leben Regenerieren
  346. {
  347. healthbar.regeneration();
  348. regenHP = 200;
  349. }
  350. else
  351. {
  352. hitInv = false;
  353. }
  354. }
  355.  
  356. public void fallOutOfWorld() //fällt der Charakter aus der Welt stirbt er ebenfalls
  357. {
  358. if (getWorld() == null) return;
  359. World myWorld = getWorld();
  360. AzureWorld azureworld = (AzureWorld)myWorld;
  361. if (getY()>300)
  362. {
  363. GameOver gameover = new GameOver();
  364. getWorld().removeObject(this);
  365.  
  366. myWorld.addObject(gameover, myWorld.getWidth()/2,myWorld.getHeight()/2);
  367. }
  368. }
  369.  
  370. private void animate()
  371. {
  372. animCount = (animCount+1)%(animSet.length*animDelay);
  373. if (animCount%animDelay == 0) setImage(animSet[animCount/animDelay]);
  374. }
  375. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement