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

26.01.2011, 13:01

C++ SideScroller Koords Vergleich

Hallo,
ich bin dabei ein 2D Sidescrollerspiel zu programmieren. Nur hänge ich jetzt bei ner wirklich simplen Sache fest. Ich habe schon seit ein paar Jahren keine Koordinaten verglichen. Könnt ihr mir da weiter helfen. es geht darum meinen Runner nicht in Traps also Fallen (Bodenlöcher) reinlaufen zu lassen. Der Runner rennt permanent auf einer Position und der Jump ist wie der Runner ebenfalls Animiert und wird auf Touch aktiviert und Springt demzufolge. Nun nur noch die Frage wie kann ich die Koordinaten des Runners mit den Traps vergleichen? Fakt ist jedenfalls das dieser Vergleich in die "void GameScreen::onUpdate()" rein muss. Hier mal Teile meines Codings:

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 "DragonFireSDK.h"
#include "WTlib.h"
#include "Data.h"
#include <math.h>
#include "MyApp.h"

int jumping1, jump_status, JumpSound;
int OnTouchArea(int juTou, int event, int xTou, int yTou);
...
static int RunAnimTable[32] =  { 1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7 }; 
static int JumpAnimTable[24] = { 1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5 };

GameScreen::GameScreen()  { pName = "GameScreen"; }
GameScreen::~GameScreen() { }

void GameScreen::enterScreen() {
TouchAdd(0, 0, 480, 320, OnTouchArea, 0); 
...
trsX = 0; 
trsY = 237;

trapS.init(RES_Trap_S_PNG,(int)trsX,0,0,0,pVM->view(cv++));

runX = 60; runY = 222;
xAccel = yAccel = 0;

run.init(RES_Run_01_PNG,(int)runX,(int)runY,(EF_CX|EF_CY),TRUE,pVM->view(cv++));
run.setAnim(RES_Run_01_PNG,RunAnimTable,ARRAY_LENGTH(RunAnimTable),TRUE);

jump.init(RES_Jump_01_PNG,runX,runY,(EF_LX|EF_TY),TRUE,pVM->view(cv++));
jump.setAnim(RES_Jump_01_PNG, JumpAnimTable,ARRAY_LENGTH(JumpAnimTable),TRUE);
...
trapS.moveBy(480,0);
...
trapS.moveTo(x+480,trsY);
...
trsX -= 7; if(trsX < -480) trsX += (480 * 2);
trapS.moveTo(trsX+380,trsY);
...
void GameScreen::onUpdate() {
updateBackground();
int OnButton(int juid); 

char scoreBuffer[16];
score += 1; 
sprintf(scoreBuffer,"%05d",score);
TextSetText(textLines[0],scoreBuffer);

run.updateAnim();
...
int cv = firstView;
int *pJumpAnimTable = JumpAnimTable;


if(jumping1 == 1) { 
printf("test01");
if (jump_status == 3){
jump_status = 1;
run.setVisible(FALSE);
jump.setVisible(TRUE);
jump.setAnim(RES_Jump_01_PNG, JumpAnimTable,ARRAY_LENGTH(JumpAnimTable),TRUE);
}
jump.updateAnim();
if(jump_status == 1) {
printf("4Befor Up \n");
runY -= 15; 
if(runY < 120) {
if(runY < 50) { 
jump_status = 2;
printf("Up \n");
SoundPlay(JumpSound); 
}
}
}

if(jump_status == 2) {
runY += 8; 
printf("Air'n'Down \n");
if(runY > 145) { 
jumping1 = 0;
jump_status = 0;
printf("Down \n");
run.setVisible(TRUE);
jump.setVisible(FALSE);
}
}
jump.moveTo(runX, runY);
}
}

int OnTouchArea(int juTou, int event, int x, int y) {
JumpSound = SoundAdd("Sounds/JumpSound.snd");
if(juTou == 0) {
jump_status = 3;
jumping1 = 1;
printf("JumpStatus = 1 \n");
}
return 0;
}

...
GameOverScreen::GameOverScreen()  { pName = "GameOverScreen"; }
GameOverScreen::~GameOverScreen() { }
...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Waldfee« (26.01.2011, 13:15)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

26.01.2011, 14:30

ich glaub nicht, dass dir hier jemand so einfach helfen kann. versuch den code zu kommentieren, formatieren und den code in module aufzuteiln. du packst alles mögliche in eine methode und klasse und benutzt globale (statische) variablen die nicht konstant sind. da ist es kein wunder, dass du früher oder später probleme bekommst und keiner bei deinem code durchblickt.

vielleicht hast du ja glück und jemand macht sich trotzdem die mühe.

edit: willkommen im forum :thumbsup:
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »NachoMan« (26.01.2011, 14:36)


3

26.01.2011, 14:46

nicht wirklich...hab nur punkte da zwischen gemacht...dann poste ich mal alles von meiner MyApp.cpp alle headers etc. denke ich mal sind für den vergleich von koordinaten nicht von belangen..^^



edit:
code entfernt

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Waldfee« (27.01.2011, 15:14)


Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

26.01.2011, 14:56

Könntest du mir noch mal detailliert erklären, was du möchtest? 500 Zeilen guck ich mir sicher nicht an oO
Poste doch dne betreffenden Teil bzw. erklär mir erstmal genau, was du möchtest :)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

26.01.2011, 14:56

die punkte hab ich bemerkt. das verwirrt aber nur. so ists schon viel besser^^
allerdings versteh ich dein problem nicht. könntest du versuchen es nochmal verständlich zu erklären? ^^
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

6

26.01.2011, 15:01

Jetzt mal ohne den ganzne Code gelesen zu haben - sorry, aber so viel ist einfach völlig sinnlos, vor allem wenn der Großteil für uns davon unrelevant ist. Wenn du Hilfe im Code haben willst, musst du uns den Code zeigen, der für dein Vorhaben relevant ist und nicht einfach alles und wir suchen und dann entsprechend die wichtigen Teile raus.
Und nebenbei halte ich es für einen schlechten Designansatz unkonstante, globale Variablen zu verwenden. Auch die Verwendung von globalen Funktionen, wie "onTouchArea" halte ich für etwas seltsam. Das wirkt auf mich alles irgendwie unkoordiniert. Aber gut, das ist ein anderes Kapitel.

Ich weiß nicht, ob ich dein Problem richtig verstehe, aber wenn du verhindern willst, dass der Spieler irgendwo rein rennt, kannst du doch einfach die Position des Spielers vergleichen mit der Position der Objekte, die diese beim nächsten Schritt haben werden. Und wenn die Spieler-Position mit der Position eines solchen Objekts übereinstimmt, dann wird er eben entweder gestoppt oder es wird im nächsten Frame geprüft, ob die Kollsion stattfindet und dann wird eben das entsprechende Event ausgeführt.

7

26.01.2011, 15:23

Das woran ich mich seit neustem versuche ist IOS programmierung, also iPhone Apps. Und dank DragonFire kann man das sogar in C++ auf Windowssystemen. Doch hat Dragonfire große nachteile was den Code angeht, Beispielsweise, darf ich mein Array nicht befüllen wie üblich und diese OnButton funktion ist auch nur eins von vielen beispielen.

Es wurde ja nach dem "ganze" Code gefragt. weiter oben ist ja nur das relevante zu finden.
Wobei es bei mir happert. Ich weiss nicht direkt wie ich nun mein Runner (runX, runY) und meine TrapSmall(trsX, trsY) vergleichen soll, sowas hab ich nun wirklich noch nicht geschrieben..oder ich stell mir das zu kompliziert vor und mein Hirn blockiert alle Lösungsansätze automatisch gleich weg.

ok also zu den Fallen, die bewegen sich in das Spiel rein, und haben dank der DragonfireSDK ein Bildbekommen was ich entsprechend ansprechen kann. Mit den koordinaten trsX und trsY und mein Runner hat ja die Koordinaten runX und runY.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

26.01.2011, 15:28

du solltest dir ne eigene klasse für deinen "Runner" und die trap schreiben. damit erreichst du eine bessere übersicht weil jedes objekt sich selbst verwalten kann. ein objekt(runner und trap) besteht ja nicht nur aus einem 2dvektor(wofür sich auch eine eigene klasse lohnt), sondern mindestens noch aus einem bild, das eine höhe und breite hat. wenn du die position und die höhe und breite hast kannst du ohne probleme einen recttest machen.
der sieht z.b. so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
bool Rect::checkCollision(const Rect &rect) const
{
    return (rect.Left <= Right &&
            rect.Right >= Left &&
            rect.Top <= Bottom &&
            rect.Bottom >= Top);
}
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

9

26.01.2011, 15:39

mein runner und meine trap sind doch in klassen mit ihren jeweiligen eigenschaften.
sieht man ja an run.init()...oder jump.init()...oder auch trap.moveTo()....
ist nur etwas schwer dieses vermurkste DragonFireSDK c++ coding zu erklären oder sinnvoll rüberzubringen...und ich kann ja nun nicht auch noch meine headers mit posten wo meine klassen alle drin sind^^

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

26.01.2011, 15:46

wofür brauchst du denn runX und runY? run und jump ist das gleiche objekt aber mit verschiedenen animationen? das könntest du auch einfacher und vorallem logischer lösen.
jedenfalls kannst du den objekten eine methode wie checkCollision in meinem letzten post geben. dem übergibst du einfach das rect des anderen objekts und schon weißt du ob die objekte sich treffen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige