Project Code Start{"clazzes":[{"name":"Main","src":"Canvas world, world2, canvasPlayerHome, canvasPlayerStart, canvasPlayerShop;\ndouble speed;\nPlayer player;\nfinal int groundHeight = 2;\nint points = 0;\nint level = 1;\nint levelScore = 0;\nJImage[] activeObstacle;\nboolean pause = true;\nJFrame frStart, frHome, frLevel, frShop, frHelp, frFinished;\nJImage background, background2;\nint countTotalObstacles = 0;\nJLabel labelPointsHome, labelPointsShop, reachedPoints, information;\nRandom Rand = new Random(); // damit immer eine andere Zufallszahl genereiert wird \nItem [] items;\nLevel [] levelSettings; \nObstacle[] obstacle;\nStorage store = new Storage(\"AlfyStorage\");\nint score, highscore;\nint time;\nJLabel timeLabel;\nTimer timeTimer;\nString highscoreName=\"niemand\",name;\n\nvoid main (){\n defineItem();\n defineLevel();\n restore();\n createUIFinished();\n createUILevel();\n createUIHome();\n createUIShop();\n createUIHelp();\n createUIStart();\n frHome.setVisible(false);\n frLevel.setVisible(false);\n frShop.setVisible(false);\n frHelp.setVisible(false);\n frFinished.setVisible(false);\n Gamepad gp = new Gamepad();\n System.setNextFrameListener(()->{\n gameLoop(gp);\n });\n defineObstacle();\n lookForAppearanceChange();\n}\n\n// stellt alle gespeicherten Werte wieder her\nvoid restore () {\n if(store.hasKey(\"keyPoints\")) {\n String sPoints = store.load( \"keyPoints\" );\n points = Integer.parseInt ( sPoints );\n }\n if(store.hasKey(\"keyLevelScore\")) {\n String sLevelScore = store.load( \"keyLevelScore\" );\n levelScore = Integer.parseInt ( sLevelScore );\n }\n for (int i = 0; i < items.length; i++) {\n if(store.hasKey(items[i].asset)) {\n String sItem = store.load(items[i].asset);\n //if(sItem == \"true\") items[i].isBought = true;\n items[i].isBought = Boolean.parseBoolean(sItem);\n }\n }\n if (store.hasKey(\"highscore\")) {\n String[] hs=store.load(\"highscore\").split(\";\");\n highscore=Integer.parseInt(hs[1]);\n highscoreName=hs[0];\n }\n}\n\nvoid createUIHelp () {\n frHelp = new JFrame();\n frHelp.addCSSClass(\"frHelp\");\n JButton loadStart = new JButton(\"X\");\n loadStart.addActionListener((ev)->{\n frStart.setVisible(true);\n frHelp.setVisible(false);\n });\n frHelp.add(loadStart);\n loadStart.addCSSClass(\"helpButton\");\n JLabel text = new JLabel(\"
Hilfe
\");\n frHelp.add(text);\n text = new JLabel(\"Das Ziel des Spieles ist es, Santa zurück zu seinem Heimatplaneten zu bringen. Dafür kannst du ihm helfen, die verschiedenen Level durchzuspielen. Mit jedem Level kommt er einen Schritt näher zu seiner Heimat.
In jedem Level begegnen Santa Hindernisse, die er überwinden muss. Es gibt zwei Arten von Hindernissen:\");\n frHelp.add(text);\n JPanel p2 = new JPanel(\"2\");\n frHelp.add(p2);\n JImage image = new JImage(\"block1\");\n image.addCSSClass(\"image\");\n p2.add(image);\n text = new JLabel(\"
Blöcke:
Auf Blöcken kannst du gefahrlos laufen, aber vorsicht, wenn du gegen Blöcke läufst, dann musst du von neuem Anfangen.\");\n p2.add(text);\n p2 = new JPanel(\"2\");\n image = new JImage(\"spike1\");\n image.addCSSClass(\"image\");\n p2.add(image);\n text = new JLabel(\"
Spitze Gegenstände:
Spitze Gegenstände darfst du auf keinen Fall berühren. Wenn du etwas Spitzes berührst, dann musst du auch von neuem Anfangen.\"); \n p2.add(text);\n frHelp.add(p2);\n text = new JLabel(\"
Um Hindernissen ausweichen zu können, musst du nur auf der Tastatur den Pfeil nach oben drücken. Umso länger du den Pfeil drückst, umso höher kannst du springen.
Viel Spaß!\");\n frHelp.add(text);\n}\n\nvoid createUIStart (){\n frStart= new JFrame(\"1\");\n JLabel text = new JLabel(\"
Santas Abenteuer
\");\n frStart.add(text);\n JButton loadHelp = new JButton(\"?\");\n loadHelp.addActionListener((ev)->{\n frHelp.setVisible(true);\n frStart.setVisible(false);\n });\n loadHelp.addCSSClass(\"helpButton\");\n frStart.add(loadHelp);\n JPanel p2 = new JPanel(\"2\");\n frStart.add(p2);\n canvasPlayerStart = createCanvasPlayer ();\n p2.add(canvasPlayerStart);\n text = new JLabel(\"Hallo, ich bin Santa. Ich bin mit dem Schlitten abgestürzt und suche einen Weg zurück nach Hause zum Nordpol. Dafür brauche ich aber deine Hilfe. Hilfst du mir?\");\n p2.add(text);\n JButton loadHome = new JButton(\"Santa helfen\");\n loadHome.addActionListener((ev)->{\n frStart.setVisible(false);\n frHome.setVisible(true);\n });\n frStart.add(loadHome);\n}\n\nvoid createUIHome (){\n frHome = new JFrame();\n frHome.addCSSClass(\"frHome\");\n JButton loadStart = new JButton(\"Zurück zum Start\");\n loadStart.addCSSClass(\"loadStartButton\");\n loadStart.addActionListener((ev)->{\n frStart.setVisible(true);\n frHome.setVisible(false);\n });\n frHome.add(loadStart);\n canvasPlayerHome = createCanvasPlayer(); // Canvas zeigt Alfys aktuelles Ausehen\n frHome.add(canvasPlayerHome);\n labelPointsHome = new JLabel(\"Highscore: \"+ highscoreName+\": \"+ highscore);\n labelPointsHome.addActionListener((ev)->{\n boolean a=System.confirm(\"Wirklich Highscore löschen?\");\n if(!a) return;\n highscoreName=\"niemand\";\n highscore=0;\n store.remove(\"highscore\");\n labelPointsHome.setValue(\"keine Highscore\");\n });\n frHome.add(labelPointsHome);\n JButton loadShop = new JButton(\"Zum Shop\");\n loadShop.addCSSClass(\"loadShopButton\");\n loadShop.addActionListener((ev)->{\n frShop.setVisible(true);\n frHome.setVisible(false);\n });\n frHome.add(loadShop);\n \n JPanel pLevel = new JPanel(\"\");\n pLevel.addCSSClass(\"pLevel\");\n frHome.add(pLevel); \n\n pLevel.add(createImageLevel(0)); // bei mehr Levels kann eine for-Schleife verwendet werden\n pLevel.add(createImageLevel(1));\n pLevel.add(createImageLevel(2));\n pLevel.add(createImageLevel(3));\n updateOpacity();\n}\n\n// gibt ein Bild zurück, welches beim Klicken ein Level (levelNumber) öffnet.\nJImage createImageLevel (int levelNumber) {\n JImage imageLevel = new JImage(levelSettings[levelNumber].background);\n if(levelNumber > 1) {\n imageLevel.addActionListener((ev)->{\n if (levelScore >= levelNumber-1) { // LevelScore bestimmt, welches Level gespielt werden kann\n settingsForLevel(levelNumber);\n }\n });\n imageLevel.setStyle(\"opacity\", \"0.5\"); // Alle unspielbaren Level werden blass.\n } else { // Endlosmodus und Level 1\n imageLevel.addActionListener((ev)->{\n settingsForLevel(levelNumber);\n });\n }\n return imageLevel;\n}\n\n// Aktualisiert den Hintergrund für das Level\nvoid updateCreateUILevel () {\n // world.getChild(1) = JImage, dass den Hintergrund anzeigt\n world.getChild(1).setValue(levelSettings[level].background);\n world2.getChild(1).setValue(levelSettings[level].background);\n}\n\n// aktualisiert die Transperenz dem Fortschritt (levelScore) entsprechend\nvoid updateOpacity () {\n // frHome.getChild(4) = Panel mit der Levelauswahl\n JPanel pLevel = (JPanel)frHome.getChild(4);\n JImage levelImage;\n for (int i = 2; i <= levelScore+1; i++) { // i= 2 weil Endlosmodus(i=0) und Level 1 (i=1) nie transparent werden.\n if(pLevel.getChild(i)!= null) {\n levelImage = (JImage)pLevel.getChild(i);\n levelImage.setStyle(\"opacity\", \"1\"); // spielbare Levels werden farbig angezeigt\n }\n }\n}\n\nvoid createUIShop (){\n frShop = new JFrame(\"1fr 30%\");\n JPanel p4 = new JPanel(\"\");\n p4.addCSSClass(\"p4Shop\");\n frShop.add(p4);\n p4.add(createItemPanel(0)); // for-Schleife\n p4.add(createItemPanel(1));\n p4.add(createItemPanel(2));\n p4.add(createItemPanel(3));\n p4.add(createItemPanel(3));\n p4.add(createItemPanel(3));\n p4.add(createItemPanel(3));\n p4.add(createItemPanel(3));\n p4.add(createItemPanel(3));\n JPanel p1 = new JPanel(\"1\");\n frShop.add(p1);\n JButton loadHome = new JButton(\"Zurück Home\");\n loadHome.addActionListener((ev)->{\n frShop.setVisible(false);\n frHome.setVisible(true);\n });\n p1.add(loadHome);\n labelPointsShop = new JLabel(\"Punkte: \" + points);\n p1.add(labelPointsShop);\n canvasPlayerShop = createCanvasPlayer();\n p1.add(canvasPlayerShop);\n}\n\n// gibt ein JPanel mit Item und Preis zurück + Kauf beim Klicken des JPanels\nJPanel createItemPanel (int index) {\n JPanel p2 = new JPanel(\"\");\n p2.add(createItemLabel(index));\n p2.add(createItemImage(index));\n p2.addCSSClass(\"itemPanel\");\n p2.addActionListener((ev)->{\n if (!items[index].isBought && (items[index].price <= points)) { // wenn Item noch nicht gekauft wurde und genug Punkte (points) vorhanden sind\n buyItem(index);\n } else if (items[index].isBought){\n System.alert(\"Du hast das Item bereits gekauft.\");\n } else {\n System.alert(\"Dir fehlen noch Punkte. Spiel mehr Level, um mehr Punkte zu bekommen.\");\n }\n });\n return p2;\n}\n\n// gibt ein JLabel zurück, welches den Preis des Items (unter dem Index) anzeigt.\nJLabel createItemLabel (int index) {\n JLabel itemPrice = new JLabel(items[index].price +\" Punkte\");\n itemPrice.addCSSClass(\"itemLabel\");\n return itemPrice; // return (JLabel)(new JLabel(items[index].price +\" Punkte\")).addCSSClass(\"itemLabel\");\n}\n\n// gibt ein JImage zurück, welches das Bild des Items (unter dem Index) anzeigt.\nJImage createItemImage (int index) {\n JImage itemAppearance = new JImage(items[index].asset);\n itemAppearance.addCSSClass(\"itemImage\");\n return itemAppearance;\n}\n\n// setzt den Kauf des Items in Kraft\nvoid buyItem (int index){\n points -= items[index].price;\n updatePoints();\n items[index].isBought = true;\n saveItem(index);\n lookForAppearanceChange();\n}\n\n// speichert gekauften Zustand des gekauften Items\nvoid saveItem (int index) {\n store.save(items[index].asset, items[index].isBought + \"\");\n}\n\n// leitet die Aussehensveränderung von Alfy bei Items ein, die gekauft wurden\nvoid lookForAppearanceChange () {\n for (int i = 0; i < items.length; i++) {\n if (items[i].isBought) {\n player.add(changeAppearance(items[i]));\n canvasPlayerHome.add(changeAppearance(items[i]));\n canvasPlayerStart.add(changeAppearance(items[i]));\n canvasPlayerShop.add(changeAppearance(items[i]));\n }\n }\n}\n\n// gibt das JImage des Items zurück\nJImage changeAppearance (Item item) {\n JImage itemImage = new JImage(item.asset);\n item.setBounds(itemImage); // setzt die Bounds von itemImage dem Item entsprechend fest\n return itemImage;\n}\n\n// definiert Items, indem sie dem items Array hinzugefügt werden\nvoid defineItem () {\n items = new Item [4];\n items[0] = new Item(\"hat\", 1, false, new Bounds(4, 7, 2, 2));\n items[1] = new Item(\"star\", 2, false, new Bounds(1,1,2,2));\n items[2] = new Item(\"heart\", 20, false, new Bounds(4.5,5,1,1));\n items[3] = new Item(\"platzhalter\", 5, false, new Bounds(8,6,2,2));\n}\n\n// gibt ein Canvas mit Alfy(stehend) zurück\nCanvas createCanvasPlayer () {\n Canvas canvas = new Canvas(0, 10, 0, 10);\n JImage alfy = new JImage(\"playerstanding\");\n alfy.setBounds(0, 0, 10, 10);\n canvas.addCSSClass(\"image\");\n canvas.add(alfy);\n return canvas;\n }\n\nvoid createUIFinished () {\n frFinished = new JFrame(\"1\");\n frFinished.addCSSClass(\"achievedLevel\");\n JLabel heading = new JLabel(\"
Geschafft!
\");\n frFinished.add(heading);\n reachedPoints = new JLabel(\"leer\");\n frFinished.add(reachedPoints);\n information = new JLabel(\"leer\");\n frFinished.add(information);\n JButton loadHome2 = new JButton(\"Zurück Home\");\n loadHome2.addActionListener((ev)->{\n frHome.setVisible(true);\n frFinished.setVisible(false);\n resetLevel();\n });\n frFinished.add(loadHome2);\n}\n\nvoid createUILevel () {\n frLevel= new JFrame(\"1\");\n Canvas window = new Canvas(0, 10, 0, 10); // bleibendes Canvas\n window.setSizePolicy(\"stretch\");\n frLevel.add(window);\n \n world = new Canvas(0, 10, 0, 10); // bewegendes Canvas\n window.add(world); // bewegendes Canvas wird stehendem hinzugefügt\n world.setBounds(0, 0, 10, 10);\n\n world2 = new Canvas(0, 10, 0, 10); // bewegendes Canvas2\n window.add(world2); // bewegende Canvas wird stehendem hinzugefügt\n world2.setBounds(10, 0, 10, 10); //unterer linker Rand als Position anders als bei set Position, wo es der Mittelpunkt ist\n\n world.setSizePolicy(\"stretch\"); // Ermöglicht \"Stretching\"\n world2.setSizePolicy(\"stretch\");\n\n world.add(createBackgroundLevel());\n world2.add(createBackgroundLevel());\n\n player = new Player(\"player\",groundHeight); // player ist eine Art Canva\n player.setSize(1, 1.5);\n player.setPosition(2, groundHeight);\n window.add(player);\n player.setDirection(90);\n\n timeLabel=new JLabel(\"\");\n timeLabel.setStyle(\"color\", \"white\");\n timeLabel.setStyle(\"font-size\", \"6cqw\");\n timeLabel.setPosition(5,8.5);\n timeLabel.setSize(10, 2);\n window.add(timeLabel);\n \n JButton loadHome = new JButton(\"Zurück Home\");\n loadHome.addActionListener((ev)->{\n frHome.setVisible(true);\n frLevel.setVisible(false);\n pause = true;\n resetLevel();\n });\n loadHome.setBounds(0.5, 8.5, 2, 1);\n window.add(loadHome);\n\n JButton stopButton = new JButton(\"Stop\");\n stopButton.setBounds(8.5, 8.5, 1, 1);\n window.add(stopButton);\n stopButton.addActionListener((ev)->{\n pause = !pause;\n });\n \n timeTimer=new Timer(1000, (ev)->{\n if(pause) return;\n time++;\n if(time>highscore){\n highscoreName=name;\n highscore=time;\n }\n timeLabel.setValue(\"
\"+name+\": \" +time+\"
Highscore: \"+highscoreName+\": \"+highscore+\"
\");\n });\n timeTimer.start();\n}\n\n// definiert Werte zu den Levels, indem Level-Objekte zum levelSettings Array hinzugefügt werden\nvoid defineLevel (){\n levelSettings = new Level [4];\n levelSettings[0] = new Level(0, -0.06, \"space\", \"\");\n levelSettings[1] = new Level(10, -0.07, \"underwater\", \"Santa hat sich mutig durch die Unterwasserwelten gekämpft, nun kann er das Land erkunden.
Level 2 ist jetzt freigeschaltet.
\");\n levelSettings[2] = new Level(20, -0.09, \"land\", \"Santa hat sich gut durch die Landwelt geschlagen. Der Weg führt ihn nun in die Berge
Level 3 ist jetzt freigeschaltet.
\");\n levelSettings[3] = new Level(30, -0.11, \"hills\", \"Santa hat die gefährliche Welt der Berge überstanden.
Neue Level kommen bald.
\");\n}\n\n// gibt den Hintergrund des aktuellen Levels zurück\nJImage createBackgroundLevel () {\n JImage createBackgroundLevel = new JImage(levelSettings[level].background);\n createBackgroundLevel.setBounds(0, 0, 10, 10);\n return createBackgroundLevel;\n}\n\n// legt grundlegende Einstellung eines Levels fest\nvoid settingsForLevel (int activeLevel) {\n frLevel.setVisible(true);\n frHome.setVisible(false);\n if(activeLevel == 0){\n System.alert(\"Pssst! Santa träumt von seiner Reise durch den Weltraum. Helfe ihm den endlosen Weltraum zu erkunden.\");\n name=\"\";\n while(name.length()==0){\n name=System.prompt(\"Gib deinen Namen ein:\");\n name=name.trim();\n }\n \n }\n pause = false;\n level = activeLevel;\n updateCreateUILevel();\n speed = levelSettings [level].speed;\n}\n\n// überprüft Spielzustände\nvoid gameLoop (Gamepad gp){\n if(pause) return; // -> keine Bewegung\n moveWorlds();\n player.updatePlayer(gp); // Aufruf der \"gameloop\" der Klasse Player\n \n if(world.getX() == 15) {\n generateRandomObstacle();\n countTotalObstacles ++;\n player.getActiveObstacle(activeObstacle);\n }\n if (!player.isPlayerAlive()) {\n resetLevel();\n }\n if (level == 0) {\n speed *= 1.0001;\n return;\n }\n if(countTotalObstacles > 5) {\n levelAccomplished ();\n }\n}\n\n// setzt alle Einstellunge des Levels auf Anfang\nvoid resetLevel () {\n removeObstacle();\n world.setX(5);\n world2.setX(15);\n player.setPosition(2, 2);\n player.setPlayerAlive();\n countTotalObstacles = 0;\n frFinished.setVisible(false);\n if(level == 0) {\n speed = levelSettings[level].speed;\n }\n store.save(\"highscore\", highscoreName+\";\"+highscore);\n labelPointsHome.setValue(highscoreName+\": \"+highscore);\n time=0;\n}\n\n// bewegt die Canvas\nvoid moveWorlds (){\n world.move(speed);\n if(world.getX() <= -5) {\n removeObstacle();\n world.setX(15);\n }\n world2.move(speed);\n if(world2.getX() <= -5) {\n world2.setX(15);\n }\n}\n\n//Definition der Hindernisse, indem sie in das obstacle Array eingefügt werden\nvoid defineObstacle () {\n // B = Block; S= Spike; U = Up(eine Reihe nach oben und zur linken Seite des Hinderniss)\n obstacle = new Obstacle[14];\n obstacle[0]=new Obstacle(\" \", 1);\n obstacle[1]=new Obstacle(\"S S\", 1);\n obstacle[2]=new Obstacle(\"SS SS\", 1);\n obstacle[3]=new Obstacle(\"SSS\", 2);\n obstacle[4]=new Obstacle(\"BUS\", 2);\n obstacle[5]=new Obstacle(\"BBSB\", 2);\n obstacle[6]=new Obstacle(\"BBBBBBU S\", 2);\n obstacle[7]=new Obstacle(\"BBBU BBU B\", 3);\n obstacle[8]=new Obstacle(\"UUBBBBBB\", 2);\n obstacle[9]=new Obstacle(\"B B B BUB B B B\", 3);\n obstacle[10]=new Obstacle(\"BBBBBBU BBBBU BB\", 3);\n obstacle[11]=new Obstacle(\"B B\", 1);\n obstacle[12]=new Obstacle(\" SUUUB B\", 3); \n obstacle[13]=new Obstacle(\" SUUBBBBBB\", 2);\n}\n\n// wählt ein zufälliges Hindernis\nvoid generateRandomObstacle () {\n ArrayList
possibleObstacles = getObstaclesForCurrentLevel();\n \n int random = Rand.nextInt(possibleObstacles.size());\n Obstacle choosenObstacle = possibleObstacles.get( random );\n\n createActiveObstacle( findActiveObstacleLength( choosenObstacle.getDescription()) );\n readObstacleStructure( choosenObstacle.getDescription() );\n}\n\n// gibt eine zufällige Liste aller Hindernisse dem Level entsprechend zurück\nArrayList
getObstaclesForCurrentLevel () {\n ArrayList
possibleObstacles = new ArrayList
();\n for (int i = 0; i < obstacle.length; i++) {\n int diff = obstacle[i].getDifficulty();\n int probability = Rand.nextInt(100)+1;\n if(probability > setImprobability(diff)) {\n possibleObstacles.add(obstacle[i]);\n }\n }\n return possibleObstacles;\n}\n\n// legt die Wahrscheinlichkeit, ob das Hinderniss nicht ausgwählt werden darf dem Level entsprechend fest\nint setImprobability (int diff) {\n if (level == diff || level == 0) return 0;\n if (level < diff) return 101;\n if (level == 2 && diff == 1) return 60;\n if (level == 3 && diff == 1) return 80;\n if (level == 3 && diff == 2) return 40;\n return 0 ; // Rückfallwert\n}\n\n// Zählt die JImages(B und S), die plaziert werden müssen und gibt den Wert zurück (-> bestimmt die Länge des Arrays activeObstacle)\nint findActiveObstacleLength (String obstaclePattern) {\n int activeObstacleLength = 0;\n for (int i = 0; i < obstaclePattern.length();i++) {\n if(obstaclePattern.charAt(i)=='B') activeObstacleLength++;\n if(obstaclePattern.charAt(i)=='S') activeObstacleLength++;\n }\n return activeObstacleLength;\n}\n\n// liest die vorher ausgewählte, vordefinierte Struktur des Hindernisses\nvoid readObstacleStructure (String obstaclePattern) {\n //System.out.println(obstaclePattern);\n int xObstacle = 0;\n int yObstacle = 0;\n int countObstacle = 0;\n for (int i = 0; i < obstaclePattern.length(); i++) {\n char c = obstaclePattern.charAt(i);\n if(c=='B'){\n addStructureToActiveObstacle(xObstacle, yObstacle, \"block\", countObstacle);\n countObstacle++;\n \n } \n else if(c=='S') {\n addStructureToActiveObstacle(xObstacle, yObstacle, \"spike\", countObstacle);\n countObstacle++;\n } \n else if(c=='U'){\n yObstacle++;\n xObstacle=-1;\n }\n xObstacle++; // immer \n/*\n ////////////Switch als Alternative\n switch(c){\n case 'B':\n System.out.println( \"switch\" );\n addStructureToActiveObstacle(xObstacle, yObstacle, \"block\", countObstacle);\n countObstacle++;\n break;\n case 'S':\n addStructureToActiveObstacle(xObstacle, yObstacle, \"spike\", countObstacle);\n countObstacle++;\n break;\n case 'U':\n yObstacle++;\n xObstacle=-1;\n break;\n }\n*/ \n }\n placeObstacle();\n}\n\n// Hindernisteil mit wichtigen Werten wird dem Array activeObstacle hinzugefügt \nvoid addStructureToActiveObstacle (int x, int y, String type, int i) {\n int startObstacle = 1; // damit der Gegenstand weiter hinten erst anfängt\n x+=startObstacle;\n y+=groundHeight;\n if( type == \" \" ) return;\n type = specifyType( type );\n JImage obstacle = new JImage( type );\n obstacle.setSize( 1 , 1 );\n if(type == \"block\" + level) obstacle.setSize( 0.9 , 1); // Ermöglicht die Unterscheidung zu Spikes\n obstacle.setPosition( x , y);\n activeObstacle[i] = obstacle;\n}\n\n// verändert das Asset dem Level entsprechend\nString specifyType (String type) {\n return type + level;\n}\n\n// plaziert alle Hindernisse im Array activeObstacle\nvoid placeObstacle () {\n for (int i =0; i
{\n timerFunction();\n });\n timer.setRepeats(false); // damit der EV nur einmal nach 1,5 Sekunden ausgeführt wird\n }\n \n //liefert die aktuelle Y-Position des Spielers\n double getYCoordinate () {\n double yPos = getY();\n return yPos;\n }\n // übergibt der Klasse Player das activeObstacle aus der main-Methode\n void getActiveObstacle (JImage [] givenActiveObstacle) {\n activeObstacle = givenActiveObstacle;\n }\n\n //lässt den Spieler springen\n void jumping () {\n if(!isfalling) {\n move(jumpforce);\n isonground = false;\n isjumping = true;\n }\n }\n\n // lässt den Spieler fallen insofern kein Block im Weg ist\n void falling () {\n if(!updateOnGround() && !isjumping) {\n move(-jumpforce );\n isfalling = true;\n if(isCollidingBlock()){ \n isonground= true;\n isfalling = false;\n move(jumpforce );\n timer.stop();\n }\n }\n }\n // liefert einen boolean zurück, ob der Spieler auf dem Boden ist\n boolean updateOnGround () {\n if(getYCoordinate() > groundHeight) {\n isonground = false;\n } else {\n isonground = true;\n isfalling = false;\n }\n return isonground; \n }\n\n // gameloop für den Spieler\n void updatePlayer (Gamepad gamepad) {\n if (isCollidingWithAny(activeObstacle)) {\n isalive = false;\n }\n if(gamepad.isUpPressed()) {\n jumping();\n if(!timer.isRunning()){\n timer.start();\n } \n } else {\n timerFunction();\n }\n falling();\n if(!isPlayerAlive()) {\n gameOver.setVisible(true);\n Thread.sleep(400);\n gameOver.setVisible(false);\n }\n }\n\n // legt fest, was passiert wenn der Timer stopt\n void timerFunction () {\n isfalling = true;\n isjumping = false;\n if(timer.isRunning()) {\n timer.stop();\n }\n }\n \n // gibt boolean zurück, ob Spieler mit einem Block colliediert\n boolean isCollidingBlock () {\n for (int i = 0; i < activeObstacle.length; i++) {\n if (isCollidingWith(activeObstacle[i])) {\n if (activeObstacle[i].getWidth()<1) {\n return true;\n }\n }\n }\n return false;\n }\n\n // gibt den Zustand isalive zurück\n boolean isPlayerAlive () {\n return isalive;\n }\n\n // legt den Zustand isalive auf true\n void setPlayerAlive () {\n isalive = true;\n }\n}\n","isHidden":false,"isEditorShown":true},{"name":"Obstacle","src":"//was ein Hindernis ist\nclass Obstacle{\n private String description;\n private int difficulty;\n\n Obstacle(String description, int difficulty){\n this.description = description;\n this.difficulty = difficulty;\n }\n\n // gibt den Hindernisaufbau zurück\n String getDescription () {\n return description;\n }\n\n // gibt die Schwierigkeit zurück\n int getDifficulty () {\n return difficulty;\n }\n}\n","isHidden":false,"isEditorShown":true},{"name":"Level","src":"class Level{\n int levelPoints;\n String background;\n double speed;\n String information;\n\n Level(int levelPoints, double speed, String backround, String information) {\n this.levelPoints = levelPoints;\n this.speed = speed;\n this.background = backround;\n this.information = information;\n }\n}","isHidden":false,"isEditorShown":true},{"name":"Item","src":"class Item{\n String asset;\n int price;\n boolean isBought;\n Bounds bound;\n\n Item(String asset, int price, boolean isBought, Bounds bound) {\n this.asset = asset;\n this.price = price;\n this.isBought = isBought;\n this.bound = bound;\n }\n \n // legt die Bounds des Items img fest //\n void setBounds(JImage img){\n img.setBounds(bound.left, bound.bottom, bound.width, bound.height);\n }\n}","isHidden":false,"isEditorShown":true},{"name":"Bounds","src":"class Bounds{\n double left, bottom, width, height;\n \n Bounds(double left, double bottom, double width, double height){\n this.left=left;\n this.bottom=bottom;\n this.width=width;\n this.height=height;\n }\n}","isHidden":false,"isEditorShown":true}],"database":"","databaseInitCode":"","css":":root { \n --hintergrund-color: #d6f7e7;\n --text-color: #001e30;\n --akzent-color: #01aa9f;\n --akzent-2-color: #d46921;\n}\n\n* {\n /*color: var(--text-color);*/\n font-size: 3cqw;\n}\n\nh1, h2 {\n font-size: 5cqw;\n font-weight: bold;\n color: var(--akzent-color);\n text-align: center;\n margin-bottom: 1cqw;\n}\n\nh2 {\n font-size: 4cqw;\n}\n\nhtml {\n margin: 0;\n padding: 0;\n height: 100%;\n width: 100%;\n}\n\n.achievedLevel {\n text-align: center;\n font-size: 2.5cqw;\n background-color: var(--hintergrund-color);\n/*\n display: grid;\n grid-template-columns: 10% 1fr 10%;\n grid-template-rows: 10% 1fr 10%; */\n}\n.achievedLevel * {\n padding: 1%;\n}\n\n/*\n.fr_Shop {\n overflow: hidden;\n}\n*/\n.p4Shop {\n /*height: 200%; die höhe wird nicht größer als der Frame*/\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1cqw;\n overflow-y: scroll;\n max-height: 90cqw;\n overflow-x: hide;\n /*Das mit Grid und so funktioniert einfach nicht?????????????????????????*/\n}\n.p4Shop * {\n width: 1fr;\n height: 20cqw;\n border-radius: 5px;\n}\n\n.itemPanel {\n display: flex;\n border: 1px solid var(--akzent-color);\n flex-direction: column; /* Beschriftung über dem Bild */\n align-items: center;\n justify-content: center;\n height: 30cqw; /* Höhe pro Item */\n border-radius: 5px;\n box-shadow: 0 2px 6px rgba(0,0,0,0.2);\n}\n\n\n.itemImage {\n height: 20cqw;\n width: 20cqw;\n border-radius: 5px;\n}\n\n.itemLabel {\n height: 5cqw;\n}\n\nbutton,\n.achievedLevel button {\n background-color: var(--akzent-color);\n border: 0;\n border-radius: 5px;\n cursor: pointer;\n padding: 1%;\n box-shadow: 0 2px 6px rgba(0,0,0,0.2);\n overflow: hidden;\n}\n\nbutton:hover {\n background-color: var(--akzent-2-color);\n transition: 300ms ease;\n} \n\nbutton:active {\n transform: scale(0.97);\n}\n\n.frHome {\n display: grid;\n grid-template-columns: 1fr auto auto;\n grid-template-rows: 10% 1fr 40%;\n}\n\n.loadStartButton {\n grid-column: 1/4;\n}\n\n.loadShopButton {\n margin-top: 40%;\n margin-bottom: 40%;\n margin: auto;\n}\n\n.pLevel {\n grid-column:1/4;\n display: grid;\n grid-template-columns: 1fr 1fr 1fr 1fr;\n overflow-x: scroll;\n max-height: 100cqw;\n}\n\n.pLevel * {\n width: 30cqw;\n height: auto;\n}\n\n.helpButton {\n position: absolute;\n height: auto;\n top: 1cqw;\n right: 1cqw;\n background-color: transparent;\n color: var(--text-color);\n font-size: 3cqw;\n border: none;\n cursor: pointer;\n}\n\n.helpButton:hover{\n background-color: var(--akzent-color);\n transition: 300ms ease;\n}\n\n.image:hover,\n.itemPanel:hover {\n transform: scale(1.02);\n background-color: #e1fff1;\n border-radius: 10px;\n transition: 300ms ease;\n box-shadow: 0 4px 10px rgba(0,0,0,0.3);\n}\n\n.whiteBack {\n opacity: 0.5;\n width: 100%;\n height: 100%;\n z-index: 0;\n}\n.p4Shop::-webkit-scrollbar,\n.pLevel::-webkit-scrollbar {\n width: 0.7cqw;\n}\n\n.p4Shop::-webkit-scrollbar-thumb,\n.pLevel::-webkit-scrollbar-thumb {\n background: var(--akzent-2-color);\n border-radius: 5px;\n}\n\n.p4Shop::-webkit-scrollbar-thumb:hover,\n.pLevel::-webkit-scrollbar-thumb:hover {\n background-color: var(--akzent-color);\n transition: 300ms ease;\n}\n\n.frHelp *{\n line-height: 1.6;\n margin-bottom: 1cqw;\n max-width: 70ch;\n text-align: left;\n}\n\n/*Hintergrund normal {\n background-color: var(--hintergrund-color);\n} */\n\n","assets":true,"name":"Santas-Abenteuer","description":"","theme_color":"black","background_color":"e6e6e6","icon":"player","urls":["./"],"date":"2025-11-27T15:24:22.804Z","javaappVersion":"11.1.1"}Project Code Stop