Java – die neusten Beiträge

Pygame Vampire Survivors?

Hallo ich programmiere gerade ein Spiel in Pygame das dem Spiel Vampire Survivors ähnelt ich habe aktuell das problem das Problem das wenn der spieler auf die Gegner hinzu läuft die Gegener nach hinten verschoben werden staat nach vorn weil.

Also aktuell wenn ich stehe laufen die Gegner auf mich zu.

Und wenn ich von den Gegnern weg laufe werden sie aus dem Screen geschoben.

Aber wenn ich auf sie zu laufe werden sie auch aus dem Screen geschoben.

Obwohl sie dann normal laufen sollen als ob der spieler steth hier der wichtige code:   def update(self, dt, player, screen_width, screen_height):

    if not self.collided_with_enemy and self.is_visible:

      dx = player.x - self.x

      dy = player.y - self.y

      distance = max(1, pygame.math.Vector2(dx, dy).length())

      direction = pygame.math.Vector2(-dx / distance, -dy / distance)

      player_rect = pygame.Rect(player.x, player.y, player.hitbox_width, player.hitbox_height)

      enemy_rect = pygame.Rect(self.x, self.y, self.hitbox_width, self.hitbox_height)

      if player_rect.colliderect(enemy_rect):

        player.handle_collision()

        self.speed = 0

        return

      if dx != 0 and dy != 0:

        dx = 0

        dy = 0

      speed_multiplier = self.speed * dt

      if player.is_moving:

        speed_multiplier *= 0.5

      # Anpassung der Bewegungsrichtung basierend auf dem Spielerstatus

      if player.is_moving:

        self.x -= direction.x * speed_multiplier

        self.y -= direction.y * speed_multiplier

      else:

        self.x += direction.x * speed_multiplier

        self.y += direction.y * speed_multiplier

      self.x = max(-self.hitbox_width, min(self.x, screen_width))

      self.y = max(-self.hitbox_height, min(self.y, screen_height))

      self.animation_timer += dt

      if self.animation_timer >= self.animation_speed:

        self.animation_timer = 0

        self.current_frame = (self.current_frame + 1) % self.animation_frames

      # Anpassung der Geschwindigkeit basierend auf der Bewegungsrichtung des Spielers

      player_direction = pygame.math.Vector2(player.x - self.x, player.y - self.y)

      player_distance = max(1, player_direction.length())

      player_direction = player_direction.normalize()

      dot_product = player_direction.dot(direction)

      if dot_product > 0.5:

        # Spieler bewegt sich dem Gegner entgegen

        self.speed = self.original_speed + 100

      else:

        # Spieler bewegt sich vom Gegner weg

        self.speed = self.original_speed - 100

    else:

      self.x += self.direction * self.speed * dt

      self.collided_with_enemy = False

    for enemy in enemies:

      if check_enemy_collision(player, enemy):

        break

Java, JavaScript, Minecraft, C Sharp, Programmiersprache, Python, Python 3, Unity, Pygame

Pinball-Game / JavaScript: Wie kann ich die Kollisionserkennung implementieren?

Hallo zusammen,

ich muss für die Uni ein kleines Single Page 2D-Spiel entwickeln. Die Backend REST-API mit Python, das Frontend mit HTML/CSS, die Logik mit JavaScript. Die Animationen sollen wir selbst entwickeln und nicht z.B. von canvas-Objekten übernehmen.

Ich versuche zurzeit ein Pinball-Spiel (Flipper-Automaten) und habe das Grundgerüst mit CSS gebaut. Nur habe ich mir die Kollisionserkennung deutlich leichter vorgestellt, als sie wahrscheinlich ist.

So sieht das Spielfeld momentan aus:

Die JavaScript-Logik sodass der Ball im Spielfeld bleibt, ist ja recht simpel:

  var ball = document.getElementById('ball');
  var playArea = document.getElementById('play-area');
  var ballRadius = 10;
  var playAreaWidth = playArea.offsetWidth; // 600
  var playAreaHeight = playArea.offsetHeight; // 820
  var ballX = playAreaWidth / 2; // Startposition des Balls in der Mitte des Spielfelds
  var ballY = playAreaHeight / 2; // X = 300, Y = 410
  var ballSpeedX = 3; // Geschwindigkeit des Balls in horizontaler Richtung
  var ballSpeedY = 3; // Geschwindigkeit des Balls in vertikaler Richtung
  
  function updateBallPosition() {
    // Aktualisiere die Position des Balls basierend auf der aktuellen Geschwindigkeit
    ballX += ballSpeedX;
    ballY += ballSpeedY;
  
    if (ballX + ballRadius > playAreaWidth || ballX - ballRadius < 0) {
      ballSpeedX *= -1; // Richtungswechsel in der horizontalen Richtung
    }
  
    if (ballY + ballRadius > playAreaHeight || ballY - ballRadius < 0) {
      ballSpeedY *= -1; // Richtungswechsel in der vertikalen Richtung
    }
  
    // Setze die neue Position des Balls
    ball.style.left = ballX + 'px';
    ball.style.top = ballY + 'px';
  }
  
  // Aktualisiere die Position des Balls alle 16 Millisekunden (ca. 60 Frames pro Sekunde)
  setInterval(updateBallPosition, 16);
}

Aber wie man es implementiert, sodass der Ball von den Hindernissen und Banden richtig abprallt, sodass ein Richtungswechsel entsteht, habe ich noch nicht wirklich verstanden. Hätte da jemand eine Idee oder Erfahrung, wie man hier an die Kollisionserkennung herangehen könnte?

LG und danke im Voraus. :)

Bild zum Beitrag
HTML, CSS, Java, JavaScript, HTML5, Informatik, Programmiersprache, Webentwicklung

Eclipse fehler beim installieren?

hallo ich habe vor kurzem meinen pc upgegradet und alles neu installier inclusive windows 10...nur habe ich jetzt das problem dass ich mir Eclipse nicht merh herunterladen kann da ich die ganze zeit eine fehler meldung bekomme...kann mir jemand helfen???

Ende des Log files:
(ganz viele andere Dowlnloads...)

[2023-06-04 19:09:15] Downloading org.eclipse.mylyn.wikitext.asciidoc

[2023-06-04 19:09:15] Collected 467 artifacts for https://download.eclipse.org/releases/2023-03/202303151000 in 0.259s

[2023-06-04 19:09:15] An error was detected while performing the engine operation and the changes are being rolled back. See the log for details.

[2023-06-04 19:09:15] ERROR: org.eclipse.equinox.p2.engine code=4 An error occurred while collecting items to be installed

 at org.eclipse.oomph.util.OomphPlugin.coreException(OomphPlugin.java:296)

 at org.eclipse.oomph.p2.internal.core.ProfileTransactionImpl$3.commit(ProfileTransactionImpl.java:578)

 at org.eclipse.oomph.p2.internal.core.ProfileTransactionImpl.commit(ProfileTransactionImpl.java:359)

 at org.eclipse.oomph.setup.p2.impl.P2TaskImpl.perform(P2TaskImpl.java:904)

 at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer.doPerformNeededSetupTasks(SetupTaskPerformer.java:3864)

 at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer.performNeededSetupTasks(SetupTaskPerformer.java:3792)

 at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer.performTriggeredSetupTasks(SetupTaskPerformer.java:3773)

 at org.eclipse.oomph.setup.internal.core.SetupTaskPerformer.perform(SetupTaskPerformer.java:3651)

 at org.eclipse.oomph.setup.internal.installer.SimpleVariablePage.installPerform(SimpleVariablePage.java:1353)

 at org.eclipse.oomph.setup.internal.installer.SimpleVariablePage$20.run(SimpleVariablePage.java:1165)

 ERROR: org.eclipse.equinox.p2.engine code=0 session context was:(profile=C__Users_Noni_eclipse_java-2023-03_eclipse, phase=org.eclipse.equinox.internal.p2.engine.phases.Collect, operand=, action=).

 ERROR: org.eclipse.equinox.p2.artifact.repository code=1003 Unable to write to repository: file:/C:/Users/Noni/Downloads/%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00.

 java.io.IOException: Failed to create directory C:\Users\Noni\Downloads\

Java, Eclipse, Softwareproblem, eclipse java

Buttons postion Anpassen java?

hallo, ich würde gerne buttons, die ich erzeugt habe in der Position ändern, wie mach ich das ?

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class CopyOftextapp2 extends JFrame implements ActionListener {

    private JTextField inputField;
    private JTextArea outputArea;
    private JButton submitButton;
    private JButton submitButton2;
 


    

    public CopyOftextapp2() {
        
       
        
      
        JLabel inputLabel = new JLabel("Bitte geben Sie eine Zahl ein:");
        inputField = new JTextField(10);
        
        submitButton = new JButton("Eingabe");
        submitButton.addActionListener(this);
        
        
         submitButton2= new JButton("Beenden");
         submitButton2.addActionListener(this);
         
   

         
        
        outputArea = new JTextArea(100, 160);
        JScrollPane outputPane = new JScrollPane(outputArea);
       

        Container container = getContentPane();
        container.setLayout(new FlowLayout());
        container.add(inputLabel);
        container.add(inputField);
        container.add(submitButton);
        container.add(submitButton2);
      

        container.add(outputPane);
        setSize( Toolkit.getDefaultToolkit().getScreenSize() );
        
        submitButton13.setBounds( 100, 100, 600, 250 );
        setBounds( 20, 20, 70, 100 );
        
        
        


       GraphicsDevice device;
             device=GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()[0];
             setUndecorated( true );
             device.setFullScreenWindow(this);
 
        
       
        
        setTitle("Text App");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }
 
 public static void main(String[] args) {
        CopyOftextapp2 app = new CopyOftextapp2();
    }
    public void actionPerformed(ActionEvent e) {
      // Neue Parameter hinzugefügt
      if(e.getSource() == this.submitButton){
        int inputNumber = Integer.parseInt(inputField.getText());
      
         switch ( inputNumber ) {
       
         case 1:
         String text = "Sie haben die Zahl 1 eingegeben.";
         outputArea.setText(text);
         break;
        
         case 2:
         String text2 = "Sie haben die Zahl 2 eingegeben.";
         outputArea.setText(text2);
         break;
        
         default:
         String text3 = "Sie haben die falsche Zahl eingegeben.";
         outputArea.setText(text3);
        
       }
   }
   else if(e.getSource() == this.submitButton2){
     

     int result = JOptionPane.showConfirmDialog(null,"Wollen sie das Programm wirklich beenden", "Programm beenden", JOptionPane.YES_NO_OPTION);
     switch(result){
     case JOptionPane.YES_OPTION:
     System.exit(0);
     case JOptionPane.NO_OPTION:


     }
   }
}
}
Java, Programmiersprache

Hintergrund in Java GUI?

Heyho,

Ich möchte gerne in meiner GUI einen Hintergrund einfügen, da es sonst so trostlos wirkt. Es soll das Bild "GameBackground.jpg" genutzt werden.

Hier ist der Code:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*; 
import ch.aplu.turtle.*;

/**
 *
 * Ein Spiel mit GUI
 *
 * @version 1.0 vom 19.05.2023
 * @abraham_oez 
 */

public class frame extends JFrame {
  private Button bSpielstarten1 = new Button();
  // Anfang Attribute
  private Button bHowtoplay1 = new Button();
  private Button bCopyright1 = new Button();
    private JMenu jMenuBar1_File = new JMenu("Spiel");
      private JMenu jMenuBar1_File_New = new JMenu("Neues Spiel");
  
  private JLabel Label1 = new JLabel();
  // Ende Attribute
  public frame() { 
    // Frame init
    super();
    setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
    int frameWidth = 746; 
    int frameHeight = 562;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setTitle("Games by Abie D. Tate");
    setResizable(false);
    Container cp = getContentPane();
    cp.setLayout(null);
    setUndecorated(false);
    cp.setBackground(new Color(0xC0C0C0));
    // Anfang Komponenten
    
    bSpielstarten1.setBounds(288, 104, 176, 48);
    bSpielstarten1.setLabel("Spiel starten");
    bSpielstarten1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        bSpielstarten1_ActionPerformed(evt);
      }
    });
    cp.add(bSpielstarten1);
    bHowtoplay1.setBounds(285, 224, 176, 48);
    bHowtoplay1.setLabel("How to play");
    bHowtoplay1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        bHowtoplay1_ActionPerformed(evt);
      }
    });
    cp.add(bHowtoplay1);
    bCopyright1.setBounds(288, 352, 176, 48);
    bCopyright1.setLabel("Lizenzen");
    bCopyright1.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent evt) { 
        bCopyright1_ActionPerformed(evt);
      }
    });
    cp.add(bCopyright1);

    // Ende Komponenten
    setVisible(true);
  }  
  
  
  
  public static void main(String[] args) {
    new frame();
  }  
  
  // Anfang Methoden
  public void bSpielstarten1_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
    
  } 

  public void bHowtoplay1_ActionPerformed(ActionEvent evt) {
    // TODO hier Quelltext einfügen
    
  }  
  
  //Nachdem der Button 'Copyright' gedrueckt wurde, wird die Klasse 'CopyrightFrame' geoeffnet in einem neuen Fenster
  public void bCopyright1_ActionPerformed(ActionEvent evt) {
    
    if (evt.getSource() == bCopyright1) {
      CopyrightFrame copyrightFrame = new CopyrightFrame();
    } 
    
  }  

} 

Java, Programmiersprache, Swing, Java Swing

Division in Assembly. Zeichen sind in ASCII gespeichert?

section .text
global main

main:
  mov esi, 10           ; ESI holds current number
  mov eax, 0           ; EAX holds sum of numbers
  push 10             ; Line feed for end of line (Stack is first in, last out -> Line feed will be last char)
  mov edi, 10           ; Divisor of 10 for seperating digits of number (used in divisionLoop)



; Sum numbers 1 through 10
sumLoop:
  add eax, esi          ; Add number to sum
  dec esi             ; Next number
  jnz sumLoop           ; Loop until 0



; Seperate eax into its digits, by dividing by 10 multiple times,
; where in each division the remainder will be a single digit 
; and the quotient will be the remaining digits used as dividend in next loop run
divisionLoop:
  mov edx, 0           ; Make sure edx is empty, as it is used as upper half of dividend
  div edi             ; Divide eax by edi (= 10) => quotient is in eax (= Rest of digits for next loop), remainder in edx (= Single digit)
  add edx, 48           ; Make edx (digit) a char representing its value by adding '0' to it
  push edx            ; Push char to stack for usage in print later

  cmp eax, 0           ; Loop until quotient is 0 (=> no more digits left)
  jne divisionLoop



; Print digits from Stack one by one
printLoop:
  mov eax, 4
  mov ebx, 1
  mov ecx, esp          ; Print top of stack (esp always points to top of stack)
  mov edx, 1           ; Length of 1 byte (= 1 char)
  int 80h

  pop esi             ; Remove top of stack
  cmp esi, 10           ; Loop until Line feed is reached
  jne printLoop


exit:
  mov eax, 1
  mov ebx, 0           ; Exit code 0
  int 80h

Hallo,

hier steht ein Programm in Assembler, dass die Zahlen von 1 bis 10 addiert.

Die 55 durch 10 teilt und die Reste der Division dann in einem Stack speichert.

push....

Am Ende wird alles über den Standardkanal ausgegeben auf der Konsole.

Wenn ich 55 / 10 teile ergibt das Quotient 5 steht in Register eax und der Rest hier auch 5 in edx Register. Bevor ich jetzt den Rest auf den Stack lege wird die Zahl mit 48 addiert. ergbit 53 ist das char Zeichen 5 im ASCII Code.

Heißt das jetzt, dass die Ergebnisse bei einer ganzzahligen Division im Assembler-Code immer in ASCII-Zeichen gespeichert sind?

Computer, Mathematik, Java, Assembler, Informatik, Programmiersprache

Ist das beeindruckend, einen Bot programmiert zu haben?

Seid gegrüßt liebe GuteFrage.net-Community,

es gab vor kurzem auf dem Minecraft-Server "GommeHD.net" ein r/place Event, bei welchem man alle 20 Sekunden einen Block platzieren kann. Nun gab es da eine gewisse Community, welcher ich angehöre, die ein bestimmtes Bild erschaffen möchte. Dieses Bild wurde mit den einzelnen Blöcken (jeweils 16x16 Pixel ein Block) hochgeladen. Jedoch wollte ich nicht meine ganze Abende damit verbringen, Blöcke zu platzieren und pro Block 20 Sekunden nichts zu machen.

So entschied ich mich einen Bot/Mod (was nicht erlaubt ist) zu programmieren, welcher das Bild analysiert und die einzelnen Blöcke mit den Minecraft-Texturen vergleicht, um den Block zu erhalten, welcher an die jeweilige Position (wo der Bot gerade steht) platziert werden muss. Der Bot läuft dann also im Spiel jeden Block ab und schaut, ob es schon der richtige ist und, wenn nicht, dann platziert er den richtigen. Somit brauchte ich nicht anwesend zu sein, um das Bild zu vervollständigen. Nach knapp über 500 Blöcken wurde ich dann (zurecht permanent) gebannt.

Nichtsdestotrotz habe ich von vielen (Nicht-Programmierern) gehört, dass sie das schon sehr beeindruckend finden, was ich da programmiert habe (hat "nur" 3 lange Nächte gedauert, den Mod zu programmieren, aber noch kürzer, wenn ich nicht so RELATIV perfektionistisch wäre; dafür ist der Code aber auch Quick and Dirty).

Was meint ihr? Ist das eine starke Leistung meinerseits oder hätte das jeder machen können? Für mich war es ein schönes Kurzprojekt, um einen Sinn meines Hobbys zu erkennen

Beeindruckend 85%
Ich hasse Sie aus vielerlei Hinsicht 15%
Nicht beeindruckend 0%
Server, Mods, Programmierer, programmieren, Java, Minecraft, Minecraft Mods, Minecraft Server, fabric, Minecraft Java Edition, Fabric Mod

Meistgelesene Beiträge zum Thema Java