Jump n' Run 2D Geometrie und Kollisionsabfrage?

ulrich1992

Neues Mitglied
Hallo ich überlege ob ich mich an am Programmieren eines Jump N' Run Spiels im Mario Stil versuche.

Ich bin mir nicht sicher wie ich die aktuelle Position von Elementen speichern/ändern soll.
Ich habe gehört, das man dazu Vektorrechnung braucht, aber ich bin absoluter Feind von höherer Mathematik.
Muss ich in einem Array Position x und y jedes Elements sowie Höhe und Breite speichern oder gibt es spezielle Klassen für 2D Geometrie und Kollisionsabfrage?
Die Kollisionsabfrage kann eine Bounding Rects sein, muss also nicht so präzise sein daher ich eh dann GIF Grafiken Grafiken verwende.
 

Runtime

Top Contributor
Da dieser Mario ja nicht umfällt, kannst du einfach ein Rectangle nehmen und damit die Kollision testen und die Position speichern. Dann brauchst du nur noch die Fallbeschleuigung und das wärs ja schon :).
 

Empire Phoenix

Top Contributor
Vectorrechnung ist keine höhere Mathematik.
Ansonsten wie der Vorredner schon sagte, ansonsten gibt es noch die 2d engine für java, weiß aber gerade den namen nicht
 

Runtime

Top Contributor
Phys2d und Box2d, aber da fällt Mario um, wenn er auf ne Kante springt. Ausserdem wird da viel zu viel berechnet. Die Richtung und Geschwindigkeit kann man mit Pixel/Sekunden berechnen. Wenn x positiv ist, dann geht er nach rechts, sonst nach links. Ähnlich geht das mit y.
 

Quaxli

Top Contributor
Und? Ist AffineTransform kaputt? :D
Außerdem muß es nicht zwingend sein, daß das Bild gedreht wird, nur weil die Figur umfällt.
 

Anhänge

  • bsp.JPG
    bsp.JPG
    3,1 KB · Aufrufe: 89

Quaxli

Top Contributor
Unfug!
Wenn ich mir für die verschiedenen Bewegungsrichtungen sowieso ein TileSet bauen muß, warum sollte ich mir dann das Leben schwer machen und nicht alle notwendigen Bewegungsabläufe erfassen?
Und was das mit Rectangle zu tun hat, weiß ich immer noch nicht.
 

Anhänge

  • copter1.gif
    copter1.gif
    21,1 KB · Aufrufe: 45

Marco13

Top Contributor
Naja, spätestens wenn man (nur als Beispiel) ein Autofahr-Spiel machen will, dann würde man das Auto in der Draufsicht von oben als Rectangle beschreiben, aber wenn es gedreht ist, sollte auch das Rectangle gedreht sein (und nicht ein größeres, Achsenparalleles Rectangle). Ich denke, das hängt auch stark davon ab, wie Rund das Objekt ist (bzw. wie gut es durch ein Rechteck angenähert werden kann oder durch ein gedrehtes Rechteck angenähert werden könnte)
 

Runtime

Top Contributor
Ich hab ein Beispiel gemacht. Der source ist zwar ein bisschen unleserchlich.:oops:
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package boxadventures;

/**
 *
 * @author Cyrill
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        new MainFrame();
    }

}
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package boxadventures;

import java.awt.Dimension;
import java.awt.Point;
import java.awt.geom.Path2D;

/**
 *
 * @author Cyrill
 */
public class Level {

    public Path2D getFloor() {
        return floor;
    }

    public void setFloor(Path2D floor) {
        this.floor = floor;
    }

    public Point getStart() {
        return start;
    }

    public void setStart(Point start) {
        this.start = start;
    }

    public Dimension getRectSize() {
        return rectSize;
    }

    public void setRectSize(Dimension rectSize) {
        this.rectSize = rectSize;
    }

    private Path2D floor;
    private Point start;
    private Dimension rectSize;

}
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package boxadventures;

import java.awt.geom.Path2D;
import java.awt.geom.Rectangle2D;
import java.util.TimerTask;

/**
 *
 * @author Cyrill
 */
public class GravitationTask extends TimerTask {

    public GravitationTask(Rectangle2D rect, Path2D floor) {
        this.rect = rect;
        this.floor = floor;
    }

    public void jump() {
         if(floor.intersects(rect)) {
            y = -2f;
            rect.setRect(rect.getX(), rect.getY() + y, rect.getWidth(), rect.getHeight());
        }
    }

    private void interpolate() {
        if (y < 0) {
            y *= 0.97f;
            if (y < 0f && y > -0.2f) {
                y = 0f;
            }
        } else {
            if (y == 0f) {
                y = 0.3f;
            }
            y *= 1.04f;
        }
    }

    @Override
    public void run() {
        if (!floor.intersects(rect)) {
            interpolate();
            rect.setRect(rect.getX(), rect.getY() + y, rect.getWidth(), rect.getHeight());
        } else {
            y = 0;
        }
    }

    private Rectangle2D rect;
    private Path2D floor;
    private float y;

}
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package boxadventures;

import java.awt.geom.Path2D;
import java.awt.geom.Rectangle2D;
import java.util.TimerTask;

/**
 *
 * @author Cyrill
 */
public class RectangleMover extends TimerTask {

    public RectangleMover(Rectangle2D rect, float x, Path2D floor) {
        this.rect = rect;
        this.floor = floor;
        this.x = x;
    }

    @Override
    public void run() {
        Rectangle2D rect2 = rect.getBounds2D();
        rect2.setRect(rect2.getX() + x, rect2.getY() - 4,
                rect2.getWidth(), rect2.getHeight());
        if(!floor.intersects(rect2))
            rect.setRect(rect.getX() + x, rect.getY(), rect.getWidth(), rect.getHeight());
    }

    public void setX(float x) {
        this.x = x;
    }

    private float x;
    private Rectangle2D rect;
    private Path2D floor;

}
Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package boxadventures;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.GeneralPath;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferStrategy;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JFrame;

/**
 *
 * @author Cyrill
 */
class MainFrame extends JFrame implements KeyListener {

    public MainFrame() {
        setSize(600, 400);
        setLocationRelativeTo(null);
        setVisible(true);
        setIgnoreRepaint(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        timer = new Timer();
        level = getLevel();
        rect = new Rectangle2D.Float(level.getStart().x,
                level.getStart().y,
                level.getRectSize().width,
                level.getRectSize().height);
        gravitationTask = new GravitationTask(rect, level.getFloor());
        createBufferStrategy(2);
        addKeyListener(this);
        mover = new RectangleMover(rect, 0, level.getFloor());
        timer.schedule(mover, 0, 1);
        timer.schedule(gravitationTask, 0, 10);
        timer.schedule(new RepaintTask(), 0, 1);
    }

    private void paint(BufferStrategy strategy) {
        Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
        g.setColor(Color.white);
        g.fillRect(0, 0, getWidth(), getHeight());
        int x = getWidth() / 2 - (int) rect.getX();
        int y = getHeight() / 2 - (int) rect.getY();
        g.translate(x, y);
        g.setColor(Color.black);
        g.draw(level.getFloor());
        g.setColor(new Color(0, 0, 200));
        g.fill(rect);
        strategy.show();
    }

    private Level getLevel() {
        Level lvl = new Level();
        GeneralPath path = new GeneralPath();
        path.moveTo(0, 100);
        path.lineTo(500, 100);
        path.lineTo(500, 50);
        path.lineTo(600, 50);
        path.lineTo(600, 100);
        path.lineTo(700, 100);
        path.lineTo(800, 200);
        path.closePath();
        lvl.setFloor(path);
        lvl.setStart(new Point(10, 10));
        lvl.setRectSize(new Dimension(20, 20));
        return lvl;
    }

    public void keyTyped(KeyEvent e) {
        if(e.getKeyChar() == ' ') {
            gravitationTask.jump();
        }
    }

    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_D)
            mover.setX(-3);
        if(e.getKeyCode() == KeyEvent.VK_RIGHT || e.getKeyCode() == KeyEvent.VK_A)
            mover.setX(3);
    }

    public void keyReleased(KeyEvent e) {
        mover.setX(0);
    }

    private class RepaintTask extends TimerTask {

        @Override
        public void run() {
            paint(getBufferStrategy());
        }

    }

    private Level level;
    private Rectangle2D rect;
    private Timer timer;
    private GravitationTask gravitationTask;
    private RectangleMover mover;

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Mein Jump and Run charakter bewegt sich nicht mehr rückwärts... Spiele- und Multimedia-Programmierung 0
E Möchte Jump and Run programmieren Spiele- und Multimedia-Programmierung 2
N Jump and run Spiel - wo anfangen / weitermachen? Spiele- und Multimedia-Programmierung 11
F Jump'n Run Background wiederholen Spiele- und Multimedia-Programmierung 3
E Java Jump and Run Map zu groß Spiele- und Multimedia-Programmierung 14
S Jump 'n' Run-Spiel Kollisionserkennung Spiele- und Multimedia-Programmierung 3
Finalspace Entwicklung eines Jump & Run Spiels Video-Tutorial Spiele- und Multimedia-Programmierung 12
C Doodle Jump Sprung Physik? Spiele- und Multimedia-Programmierung 4
M Jump 'n' Run Game - Blöcke? Spiele- und Multimedia-Programmierung 7
N Problem mit Kollisionsabfrage beim Fallen Jump & Run Spiele- und Multimedia-Programmierung 5
M Empfehlungen für ein 2D-Jump'n'run Spiele- und Multimedia-Programmierung 4
W Doodle Jump Spiele- und Multimedia-Programmierung 6
H Jump&Run Tutorial Spiele- und Multimedia-Programmierung 3
D Jump'n'run Kollision bei Blöcken Spiele- und Multimedia-Programmierung 10
K Jump'N'Run Hügel Spiele- und Multimedia-Programmierung 11
T Jump and Run - Unklarheiten Spiele- und Multimedia-Programmierung 5
Arcus Jump and Run etwas komplizierter - Benötige Starthilfe Spiele- und Multimedia-Programmierung 12
T Ist meine Jump and Run Engine zu genau? Spiele- und Multimedia-Programmierung 4
N Grundlagen für ein Jump&Run Spiele- und Multimedia-Programmierung 3
F "Doodle Jump" Projekt Spiele- und Multimedia-Programmierung 8
L Jump-n-Run Auslastung verringern Spiele- und Multimedia-Programmierung 16
Apo Kollisionserkennung bei Jump'n'Run Spiele- und Multimedia-Programmierung 69
F jump and run idee Spiele- und Multimedia-Programmierung 2
T Umsetzung eines 2D Jump and Runs Spiele- und Multimedia-Programmierung 7
K Jump n Run Keylistener und Schleifen Spiele- und Multimedia-Programmierung 8
F DJADD Jump and Run Spiele- und Multimedia-Programmierung 10
D Jump 'n run die 2. [spielerbewegen mit zeit] Spiele- und Multimedia-Programmierung 6
D Jump and Run Game -- Kollisionsabfrage Spiele- und Multimedia-Programmierung 30
S Kollisionsprob bei Jump&Run Spiele- und Multimedia-Programmierung 9
S Jump'n'Run: Probleme mit Kollision Spiele- und Multimedia-Programmierung 13
B analytische 2D Geometrie Spiele- und Multimedia-Programmierung 14
egrath [Java3D] Keine Darstellung trotz Geometrie und Licht Spiele- und Multimedia-Programmierung 6
F Fehlermeldung(Picking)Shape3D: nocapability to get geometrie Spiele- und Multimedia-Programmierung 7
B Einiges zur Geometrie (Punkte, Vektoren, Geraden) Spiele- und Multimedia-Programmierung 8
A DoodleJump programmieren: Kollisionsabfrage Spiele- und Multimedia-Programmierung 6
T Problem bei Kollisionsabfrage Spiele- und Multimedia-Programmierung 4
S Polygon Kollisionsabfrage Spiele- und Multimedia-Programmierung 2
RalleYTN Erweiterte Kollisionsabfrage Spiele- und Multimedia-Programmierung 7
S Kollisionsabfrage zwischen Rechteck und Polygon Spiele- und Multimedia-Programmierung 1
J Java Kollisionsabfrage Spiele- und Multimedia-Programmierung 21
kaoZ Kollisionsabfrage implementieren Spiele- und Multimedia-Programmierung 63
T Problem mit Kollisionsabfrage der NPC Spiele- und Multimedia-Programmierung 1
F Kollisionsabfrage bei schnellen Objekten Spiele- und Multimedia-Programmierung 2
J Problem bei pixelgenauer Kollisionsabfrage Spiele- und Multimedia-Programmierung 10
M Kollisionsabfrage Spiele- und Multimedia-Programmierung 7
N Quake - Kollisionsabfrage Spiele- und Multimedia-Programmierung 21
R Kollisionsabfrage haut nicht hin Spiele- und Multimedia-Programmierung 15
Gossi Quaxlis 2D Tutorial....Probleme nach hinzufügen der Kollisionsabfrage Spiele- und Multimedia-Programmierung 16
baddestpoet Problem mit Kollisionsabfrage Spiele- und Multimedia-Programmierung 18
D Kollisionsabfrage von 2 Autos Spiele- und Multimedia-Programmierung 2
G Kollisionsabfrage (Mario klon) Spiele- und Multimedia-Programmierung 6
gieser Buggy Kollisionsabfrage Spiele- und Multimedia-Programmierung 4
masta // thomas Kollisionsabfrage - inspiriert durch "pixelgenaue Kolli Spiele- und Multimedia-Programmierung 13
gieser pixelgenaue Kollisionsabfrage der Kreise Spiele- und Multimedia-Programmierung 9
T Kollisionsabfrage von einem Stein mit einem Ball Spiele- und Multimedia-Programmierung 5
N Kollisionsabfrage Spiele- und Multimedia-Programmierung 6
J Kollisionsabfrage Ball <-> Paddle Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben