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

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

21

07.10.2015, 18:14

Irgendwie klappt es noch nicht ganz. So habe ich den Code implementiert:

C-/C++-Quelltext

1
2
3
    mPlayerView.setCenter(
        std::max(310.f, std::min(2150.f, mPlayerSprite.getPosition().x)), 
        std::max(310.f, std::min(1000.f, mPlayerSprite.getPosition().y)));



Es klappt nicht, wenn:
1) x <= 310.f ist
2) y <= 310.f ist


Der Rest klappt alles. Ich könnt verzweifeln...


EDIT: Es klappt nur nicht, wenn die View schon gestoppt hat und man danach noch eine Taste drückt.





BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

22

07.10.2015, 18:14

Was heißt "klappt nicht"? Die Funktionen liefern genau das, was sie liefern sollen. Ob das Deinen Richtwerten entspricht oder an der richtigen Position im Code steht, das wissen wir aktuell natürlich nicht.
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]

23

07.10.2015, 18:16

Nutz doch endlich mal den Debugger..

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

24

07.10.2015, 18:22

@BC: Die Methode wird in der Run-Schleife so aufgerufen: (ProcessEvents())

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    while (App.isOpen())
    {
        //ProcessEvents();
        timeSinceLastUpdate += clock.restart();

        while (timeSinceLastUpdate > TimePerFrame)
        {
            timeSinceLastUpdate -= TimePerFrame;

            //ProcessEvents();
            Update(timeSinceLastUpdate);
        }

        UpdateStatistics(timeSinceLastUpdate);
        ProcessEvents();
        Render();
    }

Die View stoppt prinzipiell schon, aber wenn sie gestoppt hat und ich dann nochmal eine Taste drücke, dann bewegt sich die View wieder.

@anti-freak: Den habe ich schon benutzt, seit du den Post geschrieben hast. Ich kann natürlich zu blöd sein, den Debugger zu benutzen, aber mehr als Tutorials anschauen und in Büchern nachlesen kann ich nicht...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »cojo2015« (07.10.2015, 18:28)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

25

07.10.2015, 18:53

Da sehe ich aber jetzt nicht, wo genau da der View korrigiert wird. Klingt für mich aber komisch erst alle Updates zu fahren und danach auf die Events zu reagieren.
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]

26

07.10.2015, 19:37

Nochmal zum mitschreiben: Du willst die Kamera nur innerhalb eines bestimmten Bereiches halten?

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

27

07.10.2015, 20:38

Nochmal zum mitschreiben: Du willst die Kamera nur innerhalb eines bestimmten Bereiches halten?
Ja, denn ich kenne niemanden, der einen hässlichen schwarzen Bereich sehen will :)

Da sehe ich aber jetzt nicht, wo genau da der View korrigiert wird. Klingt für mich aber komisch erst alle Updates zu fahren und danach auf die Events zu reagieren.


Das habe ich nur auskommentiert, da ich ein wenig herumexperimentiert habe. Leider Erfolglos...
EDIT: Die View wird in ProcessEvents() korrigiert. Dort rufe ich die ProcessEvents() des aktuellen States auf.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »cojo2015« (07.10.2015, 20:47)


28

07.10.2015, 20:56

Angenommen die Position der Kamera bestimmt die Mitte des sichtfeldes:

C-/C++-Quelltext

1
2
3
4
5
6
7
cam.x = player.x;
cam.y = player.y
if(cam.x-screen.w/2 < clipleft)
  cam.x = clipleft+screen.w/2
if(cam.x+screen.w/2 > clipright)
  cam.x = clipright-screen.w/2
//dasselbe auch vertikal

So schwer ist es doch nicht, oder? ;)

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

29

07.10.2015, 20:58

Angenommen die Position der Kamera bestimmt die Mitte des sichtfeldes:

C-/C++-Quelltext

1
2
3
4
5
6
7
cam.x = player.x;
cam.y = player.y
if(cam.x-screen.w/2 < clipleft)
  cam.x = clipleft+screen.w/2
if(cam.x+screen.w/2 > clipright)
  cam.x = clipright-screen.w/2
//dasselbe auch vertikal

So schwer ist es doch nicht, oder? ;)
Tut mir leid für die dumme Fragen, aber was meinst du mit "clipleft" bzw. "clipright"?

30

07.10.2015, 21:01

Die Grenzen links und rechts.
In deinem Fall 310 und 2150

Im Übrigen ist das genau das Gleiche wie wir dir hier schon vorgeschlagen haben (std::min und std::max). Nur eben eine wesentlich längere und unübersichtlichere Methode.

Werbeanzeige