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

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

1

05.10.2014, 02:09

[C++ & SFML] Teile eines Tiles flackern unregelmäßig

Ich bin gerade dabei Karten in mein Spiel einzubauen und dabei stört mich seit Tagen ein für mich nicht erklärbarer Fehler:

Immer wenn ich meinen Spieler (und folglich auch den Viewport) bewege flackert beim zweiten Tile (der Baum) in scheinbar willkürlichen Abstäden eine Reihe von Pixeln des ersten Tiles durch. Dies kann ich mir nicht erklären da die Tiles in der Datei alle korrekte Positionen und Größen haben und die dem Programm auch korrekt angegeben sind (eigentlich funktioniert ja auch alles perfekt wäre nur nicht dieser Fehler).

Den "Grundcode" meiner Tilemap habe ich von hier. Diesen habe ich stark erweitert (die eigentlichen Map-Daten können nun aus Dateien ausgelesen werden, Kollisionserkennung mit rotierten Objekten etc.).

Da ich nicht genau weiß welche Teile des Codes relevant sind und welche nicht poste ich hier einfach mal den der Header-Datei:

C-/C++-Quelltext

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#ifndef TILEMAP_HPP
#define TILEMAP_HPP

#define _USE_MATH_DEFINES

#include <SFML\Graphics.hpp>
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>

#include "ConvertString.hpp"

class Tilemap : public sf::Drawable, public sf::Transformable
{

public:

    struct rectangle {
        sf::Vector2f vertex[4];
    };

    Tilemap (){}

    bool load(const std::string& tileset, sf::Vector2u tileSize, std::vector<int> tiles, unsigned int width, unsigned int height);
    bool load(const std::string& tileset, sf::Vector2u tileSize, std::string filePath);
    bool refresh (std::vector<int> tiles);
    bool refresh (int tileNumber, int x, int y);

    bool CheckCollision (sf::Sprite *Sprite);
    bool CheckCollision (sf::Sprite *Sprite, int x, int y);
    bool CheckCollision (sf::Sprite *Sprite, int tileNumber);
    bool CheckCollision (sf::Sprite *Sprite, int tileNumber, sf::Vector2f AlternateHitboxSize, sf::Vector2f Offset);
    bool CheckCollision (float x, float y, int width, int height);
    bool CheckCollision (float x, float y, int width, int height, int xTile, int yTile);
    bool CheckCollision (float x, float y, int width, int height, int tileNumber);

    const unsigned int GetWidth    () {return m_width;};
    const unsigned int GetHeight   () {return m_height;};
    const sf::Vector2u GetTileSize () {return m_tileSize;};

private:

    virtual void draw (sf::RenderTarget& target, sf::RenderStates states) const
    {
    
         // apply the transform
        states.transform *= getTransform();

        // apply the tileset texture
        states.texture = &m_tileset;

        // draw the vertex array
        target.draw(m_vertices, states); 

    }

    void normalize (sf::Vector2f& vector) 
    {
        const float length = sqrt(vector.x * vector.x + vector.y * vector.y); 
        if(length==0)
            return;
        vector.x = vector.x / length;
        vector.y = vector.y / length;
    }

    float dot(sf::Vector2f& vector1, sf::Vector2f& vector2)
    {
        return vector1.x*vector2.x + vector1.y*vector2.y;
    }

    void  project(sf::Vector2f& axis, rectangle* _rectangle, float &min, float &max)
    {
        float _dot = dot(axis, _rectangle->vertex[0]);

        min=_dot;
        max=_dot;

        for(short i=1; i<4; i++)
        {
            _dot = dot(_rectangle->vertex[i], axis);

            if(_dot<min)
                min=_dot;
             else if(_dot>max)
                max=_dot;
        }
    }

    float distance(float minA, float maxA, float minB, float maxB) // Positive return = no hit
    {
        if(minB > maxA) return minB-maxA;
        else return minA-maxB;
    }

    bool CheckCollision (rectangle *one, rectangle *two);

        sf::VertexArray m_vertices;
        sf::Texture m_tileset;
    sf::Vector2u m_tileSize;
    unsigned int m_width, m_height;
    std::vector<int> m_tiles;

};

#endif


Verbesserungsvorschläge sind natürlich wie immer erwünscht und schon mal danke an diejenigen die sich das hier durchlesen.
»Swoerm« hat folgende Datei angehängt:
  • tileset5.bmp (83 kB - 113 mal heruntergeladen - zuletzt: 04.04.2024, 14:45)

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

2

05.10.2014, 11:38

Reden wir hier von 2d oder 3d? Falls es sich um 3d handelt, würde ich vermuten, dass du an der Stelle 2 Flächen sehr nah beieinander hast, die etwas weiter vordere mit dem 2. Tile, die dahinter mit dem 1.

3

05.10.2014, 12:20

setSmooth

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

05.10.2014, 12:30

setSmooth verursacht Texture-Bleeding an den Edges.
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]

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

5

05.10.2014, 14:04

Es handelt sich um 2D. Durch "setSmooth" wurde der Fehler noch schlimmer.

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

6

05.10.2014, 14:15

Es wäre hier klasse, einen Screenshot oder ein Video zu haben, in dem das Problem sichtbar ist. Ich hatte bisher immer einen ähnlichen Fehler mit Tilemaps (Zwischen 2 Tiles tat sich eine Lücke auf, wenn ich mich bewegt habe, auch in willkürlichen Abständen). Konnte den aber bisher nicht beheben, möchte aber wissen, ob es sich hier um dasselbe Problem handelt.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

7

05.10.2014, 14:21

Mit grosser Wahrscheinlichkeit stammt das Problem (wieder einmal) vom OpenGL Rasterizer. Was du versucht kannst ist, dass du a) alle Tiles auf Ganzzahlen positionierst b) beim Verschieben der View nur um Ganzzahlen verschiebst.

Überigens, wer in aller Welt verwendet immer noch BMP Dateien? Schon mal was von PNG gehört? :D
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

05.10.2014, 14:27

Ohne Screenshot kommen wir nicht weiter. Kann diverse Gründe haben und die Beschreibung des Problems ist mehrdeutig.
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]

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

9

05.10.2014, 15:50

Überigens, wer in aller Welt verwendet immer noch BMP Dateien? Schon mal was von PNG gehört?
Ich habe früher immer BMP verwendet doch mittlerweile verwende ich in der Regel PNG (diese Datei entstand aus einer alten Datei die noch das BMP-Format benutzte).

Hier habe ich ein Video (0.5x Geschwindigkeit) in dem der Fehler kurz zu sehen ist (man beachte den Baum).

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

05.10.2014, 15:54

Ich seh überhaupt nichts. Zu welchem Zeitpunkt und wo muss man dafür hinschauen?

Edit: Du meinst der weiße Streifen zwischen den Bäumen? Das ist Texture-Bleeding verursacht durch den Zoom und den Textur-Atlas. Dabei werden die angrenzenden Pixel des nebenliegenden Sprites durch den Textur-Filter mit rein gerechnet. Du wirst dafür 1-2 Pixel außen als Rahmen um jedes Sprite im Atlas definieren müssen.
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