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

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

11

15.05.2013, 16:16

Jap. Mein meint gar nicht was sowas bringen kann:)
Wenn du deinen Spieler nicht auf die letzte Position setzt sondern genau an den Rand, dann ist deine Kollision schon mal sauberer. Ansonsten kann der Spieler leicht über dem Boden schweben. Als nächstes wäre es hilfreich wenn du eine Funktion schreiben würdest die testet ob der Spieler steht oder fällt. Im Prinzip reicht es hier den Pixel unter dem Spieler abzufragen. Ist hier ein kollidierendes Objekt so steht der Spieler. Ansonsten fällt er. Dann sollte dein Wackeleffekt auch verschwinden.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

12

15.05.2013, 16:27

ok werde es mir nacher genau anschauen.


Ich bin grad dran etwas zu prüfen, bin mir aber nicht genau sicher ob das klappt.

Ich frage hier jetzt einfach mal ^^

Es gibt ja Vererbung von Klassen.

So in den meisten Spielen gibt es ja Inventorys also Einen Rucksack z.b mit allerlei dingen, die der Spieler so braucht.

Ich müsste ja jetzt für jedes Item was hineinkommt in den Rucksack eine Klasse erstellen, das ganze will ich mit einer Hauptklasse umgehen.

Der Punkt ist bloss, ich hab mir gedacht, wenn du eine Hauptklasse hast, und eine Klasse die das Inventory darstellt, so könnte man ja einen vector nehmen, der alle momentan aktiven Items ausgibt und verwaltet.

Mein Punkt ist nur wenn ich sage

CItem *Item;
Item=new CMesser; nur zum Beispiel jetzt mal.

So würde er ja private und nicht in der Item liegende Funktionen ja garnicht abrufen können, weil der Vektor ja nur CItem Funktionen aufrufen kann.


Gibt es da eine Methode, ohne für jedes Item einen Vektor zu schaffen?


Gruß Leri ^^

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

13

15.05.2013, 16:47

Du hast im Prinzip zwei Möglichkeiten. Entweder du schaffst es jedes Item durch die selbe Klasse darzustellen, oder du arbeitest mit einer Basisklasse wie du es schon sagst.
Im ersten Fall könnte man zum Beispiel sagen jedes Item hat ein Icon, bestimmte Eigenschaften (Heilungswert, Angriffsschaden etc). Was das Item nicht benötigt wird hier einfach auf 0 gesetzt. Bei deiner Basisklasse musst du eine Schnittstelle für jedes Item schaffen. In deine Basisklasse kommt nun auch alles rein was jedes Item benötigt, solche Werte die nur von bestimmten Items benutzt werden kommen aber nicht hier rein. Die einzelnen Items erweitern die Basisklasse um diese Werte und implementieren bestimmte Methoden die von der Basisklasse vorgegeben werden. Beispiel.
Es handelt sich um ein Rollenspiel mit rundenbasierten Kämpfen. Man kann Items nur in den Kämpfen einsetzen. Es gibt immer nur einen Spieler und einen Gegner. Die Basisklasse für Items legt fest dass es eine Funktion gibt die beim benutzen des Items aufgerufen wird "use(Player *player, Enemy *enemy)". Diese Funktion wird jetzt von jedem Item überschrieben. Ein Heiltrank als Beispiel könnte in der Funktion dafür sorgen, dass Player geheilt wird. Eine Bombe könnte dem Gegner Schaden zufügen und so weiter. Wie diese Basisklasse gestaltet wird hängt stark davon ab, was Items alles können sollen. Im Prinzip müssen hier die Methoden angegeben werden die ein Item benutzt und das Item selbst überschreibt diese. Das ganze Thema nennt sich Polymorphie, falls du da noch mal auffrischen möchtest.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

14

15.05.2013, 16:58

ich habs mir im Buch nochmal angeschaut, werde aber aus dem ganzen nicht schlau.

Nehmen wir mal an ich habe eine Basisklasse Item, die eine ID besitzt für jedes Item.

So würde jetzt z.b Holz ID 1 sein und Stein ID 2.

Jedes dieser Klasse bekommt also die Klasse Item Vererbt.

Der Punkt bei mir ist nur, ich habe das eben ausprobiert und versucht zu sagen
vector<CItem> m_Item;
CItem *Item;

Item = new CHolz;

CItem Item2;
Item2=new CStein;

m_Item.push_back(*item);
m_Item.push_back(*Item2);

Der Punkt dabei ist nur, das ja Stein sagen wir mal eine Funktion hat die Stein werfen heißt und die von Holz z.b Holz anzünden.

Diese kennt er ja dann logischerweise beim abfragen der Elemente nicht oder?

Jedenfall hat er mir das angegeben.

Das Problem was sich mir jetzt stellen würde, wenn ich eine Basisklasse schreibe, mit allen erdenklichen möglichkeiten die Items haben können anzünden etc also alles in CItem wird das dann nicht zuviel für die Klasse? Ich erstelle ja mehrere Instanzen dann davon und das frisst ja dann auch ordentlich Speicher.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

15

15.05.2013, 17:03

Nein das geht natürlich nicht. Das würde gehen wenn du die Objekte casten würdest. Das heißt du machst aus dem Item Objekt wieder ein Stein Objekt. Du könntest Item eine Funktoin geben wie GibMirDeinenTyp und je nach Typ dann casten. Das ist aber nicht besonders schön und davon würde ich abraten. Du könntest Item aber eine Funktion geben wie TuWasDuTunMusst und dabei könnte Stein dann intern seinen Code zum werfen aufrufen und Holz zum anzünden.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

16

15.05.2013, 17:08

hm da würde mir jetzt kurz eine Idee wie Primär und Sekundäre Funktion einfallen.

Es wird ja speziell zwei voneinander getrennte Items geben Quest Items und normale Items, wie Material Waffen etc.

17

15.05.2013, 17:31

also klappt soweit alles, allerdings wenn ich auf nem Tile stehe schaltet er die fall funktion aus, was ja auch sein soll.

Der fehler dabei ist, gehe ich jetzt neber das Tile wird halt die Fallfunktion nicht eingeschaltet.

Ich weiß nicht wie ich das überprüfen soll, das wenn die x und y achse nicht mehr auf einen Tile steht er dann fallen soll.

In dem Vektor sind 480 Tiles, aber nicht als 2d vektor sondern nur 1d und die Tiles geben mir das Rect dann in die Collisionsüberprüfung.


Hier mal die komplette Collisionsdatei

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
#include "LXCollision.hpp"



void LXCollision::Init(CPlayer *Playly,CTMng *TileMng,LXPhysX2D *HandlePhysX)
{

    MyTileMNG=TileMng;
    MyPhysX=HandlePhysX;
    MyPlayer=Playly;
}
void LXCollision::SetCollisionData()
{

    vector<CTile> ThisTiles;
    vector<CTile>::iterator ItColli;
    ThisTiles=MyTileMNG->GetVektor();
    SDL_Rect First;
    First=MyPlayer->GetExaktRect();
    SDL_Rect Second;



    for(ItColli=ThisTiles.begin();ItColli!=ThisTiles.end();)
    {
    bool left=false;
    bool right=false;
    bool top=false;
    bool bottom=false;
      Second=ItColli->GetRect();
    if(CheckDifferenceFlall(First,Second)==true)
    {
        MyPhysX->SetFalling(true);
    }
    if(CheckCollisionLeft(First,Second)==true)
    {
        left=true;
    }


    if(CheckCollisionRight(First,Second)==true)
    {
        right=true;
    }
    if(CheckCollisionTop(First,Second)==true)
    {

        top=true;


    }

    if(CheckCollisionBottom(First,Second)==true)
    {
        bottom=true;
    }
        ItColli++;

        MyPlayer->SetPlayer(left,right,top,bottom);
    }


}
bool LXCollision::CheckCollisionLeft(SDL_Rect first, SDL_Rect second)
{

    return false;
}
bool LXCollision::CheckCollisionRight(SDL_Rect first, SDL_Rect second)
{

    return false;
}
bool LXCollision::CheckCollisionTop(SDL_Rect first, SDL_Rect second)
{

    if(first.y+first.h+5>second.y&&first.x<second.x+second.w&&first.x+first.w>second.x)
    {
        MyPhysX->SetFalling(false);
    }



    if(first.y<second.y+second.h&&first.y+first.h>second.y&&first.x<second.x+second.w&&first.x+first.w>second.x)
    {
        return true;
    }
    return false;


}
bool LXCollision::CheckCollisionBottom(SDL_Rect first, SDL_Rect second)
{
    return false;
}

bool LXCollision::CheckDifferenceFlall(SDL_Rect first,SDL_Rect second )
{



    return false;

}




Das ist der ausschnitt an dem die Fallfunktion ausgestellt wird.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool LXCollision::CheckCollisionTop(SDL_Rect first, SDL_Rect second)
{

    if(first.y+first.h+5>second.y&&first.x<second.x+second.w&&first.x+first.w>second.x)
    {
        MyPhysX->SetFalling(false);
    }



    if(first.y<second.y+second.h&&first.y+first.h>second.y&&first.x<second.x+second.w&&first.x+first.w>second.x)
    {
        return true;
    }
    return false;


}


Ich hoffe das jemand eine Idee hat, bin mit meinem latein da echt am ende

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »leridan« (15.05.2013, 20:40)


Werbeanzeige