Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

22.01.2017, 12:21

[Java] Tile Based Map Render Problem

Hallo!

Ich habe ein Problem beim Rendern meiner Tile Based Map.
Die Karte hat eine Größe von 463 x 36 Kacheln mit einer
Kachelgröße von 100 x 100 Pixeln. Um den Renderprozess
zu optimieren wird bereits immer nur der Ausschnitt
gezeichnet, der auf dem Bildschirm sichtbar ist.
Gezeichnet wird auf einem doppelgepufferten JPanel.

Jetzt zum Problem:

Beim Rendern entstehen für ein Frame lang an zufälligen
Stellen kleine Lücken zwischen den Kacheln durch die man
für einen kurzen Moment den Hintergrund durchsehen kann.
Wie kann ich das verhindern? Alle Kacheln 1% größer
zeichnen damit sie sich überlappen ist keine Lösung! ^^

Danke!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

22.01.2017, 12:51

Rechnest du irgendwo mit Fließkommazahlen, die du dann abrundest? Das könnte zu solchen Ungenauigkeiten führen.

3

22.01.2017, 13:11

Rechnest du irgendwo mit Fließkommazahlen, die du dann abrundest? Das könnte zu solchen Ungenauigkeiten führen.


Danke für deine Antwort! Die Karte wird beim scrollen immer um den Wert scroll_X verschoben. Das ist ein int.
Möglich wäre aber, dass es mit der Sprungphysik vom Spieler zusammenhängt. Als ich es grade nocheinmal getestet
habe ist das immer nur eingetreten wenn der Spieler gesprungen ist. Der Spieler wird physikalisch richtig
beschleunigt, dafür brauche ich Fließkommazahlen. Kann das das Problem sein? Wenn ja wie kann ich es umgehen Danke

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

22.01.2017, 13:33

Runde die zum Zeichnen verwendete Position des Spielers.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

22.01.2017, 13:40

Runde die zum Zeichnen verwendete Position des Spielers.


Bevor die Karte gezeichnet wird die Position vom Spieler bereits gerundet. Das hat leider nichts geholfen

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

22.01.2017, 14:09

Wird auch die Kameraposition gerundet?

7

22.01.2017, 15:35

Wird auch die Kameraposition gerundet?


Ja die Kameraposition wird auch gerundet das ist auch ein int Wert

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

22.01.2017, 15:53

Hmm, dann kommen wir wohl nicht drum herum, dass du uns deinen Code zeigst (bzw. die relevanten Teile davon).

9

22.01.2017, 19:48

Hmm, dann kommen wir wohl nicht drum herum, dass du uns deinen Code zeigst (bzw. die relevanten Teile davon).


Okay hier dann mal die relevanten Code Stellen:

Kleiner Klassenüberblick:
BlockSystem: Diese Klasse erstellt Instanzen der Klasse Block und erstellt daraus die Tile Based Map
Block: Ein Block oder auch eine Kachel der Tile Based Map

BlockSystem:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void malen(Graphics2D g2d){

...

    for(int z=0;z<levelGrösseY;z++){
        for(int s=Math.max(-scroll_X/100, 0);s<Math.min(-scroll_X/100+sizeX/100+2, levelGrösseX);s++){
            if(bloecke[z][s]!=null)
                bloecke[z][s].malen(g2d);
            }
        }
    }

...

}


Block:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.awt.Graphics2D;
    import java.awt.Image;
    import javax.swing.ImageIcon;
    
    
    public class Block {
    
        int x,y;
        int size = 100;
        int blockSort;
        char ID;
        String name;
        Image texture;
        Image uncovi;
        BlockSystem blockSys;
        
        public Block(BlockSystem blockSys) {
            
            this.blockSys = blockSys;
        }
        
        public Block(String texturenName) {
            
            texture = new ImageIcon(this.getClass().getResource(texturenName)).getImage();
        }
        
        public void malen(Graphics2D g2d){

            int posx = x + blockSys.scroll_X;
            int posy = y + blockSys.scroll_Y;
            
            if(texture != null){
                g2d.drawImage(texture, posx, posy, size, size, null);
            }
            else if(uncovi != null){
                g2d.drawImage(uncovi, posx, posy, size, size, null);
            }
        }

    }


Wenn jemand noch andere Codestellen zum Verstehen benötigt möge er Bescheid sagen :D

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

23.01.2017, 07:18

Kannst du noch einen Screenshot vom Problem einstellen?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige