Nyt spil i C++

Tags:    c++

<< < 12 > >>
Hey alle sammen

Jeg skal lave et spil med C++ sproget og er kun nybegynder. Jeg har forstand på funktioner, arrays, lidt klasser osv af det som man lærer i en nybegynder bog.
Men jeg har virkelig svært ved at komme igang med mit spil. Jeg ved ikke helt hvordan logikken skal være i det, men jeg ved hvordan spillet skal være:
Det hedder box racer, man kører i en racer-bil og skal undgå at ramme de kasser der kommer på vejen. Der er så 3 forskellige hastigheder som man kan vælge imellem.
Spillet skal være sådan, at der er 3 vognbaner. Da spillet er i 2D, kommer kasserne ovenfra og på vej mod bilen som er nedenunder. Mht. hastighederne, er det så kun kasserne der skal blive hurtigere og langsommere.
Ved siden af alt det, kan man så se hvor mange "liv" man har tilbage og hvor mange point man har samlet. Point samles ved at lade kasserne forbi bilen uden at blive ramt.

Som kode, har jeg det her som start:
--------------------------------------------------
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

using namespace std;

int main(void)
{
Beep(440, 100); //lyd eksempel

int box_tilstand [100];
int box_x[100];
int box_y[100];

int n1 = 0; // n1 er en tæller
for(n1=0; n1 <= 100; n1++) // resetning af variabler
{
box_tilstand[n1] = 0;
box_x[n1] = 0;
box_y[n1] = 0;
}

while(1==1) // 1 lig 1 er sandt, derfor kører while uendeligt!
{
system("cls");

void vis_grafik(void)
{
}

void bruger_input(void)
{
}

void ryk_bil(void)
{
}
}
system("PAUSE");
return n1;
}

--------------------------------------------------

Jeg håber at nogle kan hjælpe mig igang. Jeg har læst så meget på nettet, og søgt efter engelske tutorials som det altid er bedst anbefalet når man skal lave spil, men det hjalp ikke.

Tak på forhånd!
-------------------
Der findes ingenting der så let slår fejl, som tanker

[Redigeret d. 02/01-06 23:08:40 af Hitman Joe]



Man kunne starte med noget i stil med:

Fold kodeboks ind/udKode 


Kasserne er de røde #, "bilen" er en grøn @



Man kunne starte med noget i stil med:

Fold kodeboks ind/udKode 


Kasserne er de røde #, "bilen" er en grøn @


Okay, det ser rigtigt godt ud! Jeg kan sagtens viderudvikle det og tilføje en menu til den osv. Men jeg skal skrive en rapport om det spil, og jeg forstår ikke selv alle de der koder, så det lærer jeg jo ikke meget af! Har du selv skrevet hele koden? Kan du forklare de allervigtigste ting?

------------------
Der findes ingenting der så let slår fejl, som tanker



Og hvordan får jeg spillet til at køre i fuld skærm?

----------------------------
Der findes ingenting der så let slår fejl, som tanker



Ja, jeg har selv skrevet hele koden, dele af koden er fra et andet spil jeg har lavet:
http://home20.inet.tele.dk/midgaard/sample.html#pacman

Hele logikken i "spillet" er i main().

BoxList er en std::vector af Point, disse punkter definerer placering af kasser.

I main starter man med diverse initialisering, og går ind i en løkke der fortsætter indtil man trykker Esc.

I loopen starter man med at checke om der er mindre end 10 kasser, hvis der er, trækker man et tilfældigt tal mellem 0 og 3 (Random(3)), hvis dette tal er 0, tilføjer man en ny kasse.

Så kører man en loop over alle kasser (for(n = 0; n < BoxList.size(); ))
Her starter man med at slette kassen, derpå flyttes den en tak ned.
Hvis boxen har nået bunden af skærmen sletter man den, ellers tegner man den igen.

Så checker man om brugeren trykker på Pil Til Venstre eller Pil Til Højre, og flytter "bilen" hvis en af disse taster er trykket.

Resten er simple hjælpe funktioner der bruger standard windows funktioner, som du kan læse om her:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/console_functions.asp



Og hvordan får jeg spillet til at køre i fuld skærm?


Put denne linie ind øverst i filen:
#define _WIN32_WINNT 0x0501

Så burde denne linie i main() få det til at køre i full-screen:
SetConsoleDisplayMode(StdOut, CONSOLE_FULLSCREEN_MODE, 0);

Put den ind lige efter:
StdOut = GetStdHandle(STD_OUTPUT_HANDLE);

Det er en ret ny feature, det virker kun på XP og kun med nyere compilere.



Tusind tak for alt ;-)
Men gad vide hvordan jeg skal forklare alt det i min rapport til læreren, når jeg ikke selv har forstået hvad der foregår!! Hehe det bliver en stor og spændende udfordring for mig, som er virkelig nybegynder, men jeg prøver! Stiller ellers spørgsmål undervejs! Tak igen!

Ang. fuld skærm, det virkede ikke hos mig. Bruger Dev-C++ 4.9.9.2 fra Bloodsheet.



Du skal muligvis have en nyere version af compileren, prøv at instalere den nyeste fra:
http://mingw.org/

MinGW er den compiler som Dev-Cpp bruger.

Jeg går ud fra at du får en fejl i stil med:
car.cpp:57: error: `CONSOLE_FULLSCREEN_MODE' undeclared (first use this function)

Og du spørger bare løs hvis der er noget du er i tvivl om.



Hej igen! Ja, nu har jeg kigget meget på den kode du gav mig, men skal lige have noget på plads:

Hvad er disse?:

HANDLE StdOut, StdIn;
int YOffset;
void GotoXY(int x, int y);
void GetXY(int &x, int &y);
BOOL IsKeyPressed(int Key);
void OutCharXY(int x, int y, char ch, WORD attr);
BOOL KeyHit(); // er dette også en variabel? "BOOL" ??
WORD GetChar(); // hvad med denne? "WORD" ??
void ShowCaret(BOOL on);
int GetYOffset();
int GetYSize();
int GetXSize();
void ClearScreen();

Er det bare nogle varibler som du har oprettet? Dvs. jeg kan fx skifte deres navne?

Hvad er det her så?

int Random(int Range)
{
return (rand() >> 3)%Range;
}

Er det den der funktion som sender "kasserne" tilfældigt ned?

Og så det sidste:

class Point
{
public:
Point(int x_, int y_) : x(x_), y(y_) // WHAT??
{} // hvad laver de der tuborg klapper her?
Point() : x(0), y(0) {}
int x;
int y;
};

std::vector <Point> BoxList; // hvad er det her?

Håber jeg kan få en forklaring på de ting der, så jeg ved hvad der sker resten af koden!
Tak igen på forhånd!

--------------------
Der findes ingenting der så let slår fejl, som tanker



Her har vi en handle til hhv stdout og stdin:
HANDLE StdOut, StdIn;

Denne indholder y-scroll-offset:
int YOffset;

Dette er prototyper på funktioner, de er defineret efter main():
void GotoXY(int x, int y);
void GetXY(int &x, int &y);
BOOL IsKeyPressed(int Key);
void OutCharXY(int x, int y, char ch, WORD attr);
BOOL KeyHit(); // er dette også en variabel? "BOOL" ??
WORD GetChar(); // hvad med denne? "WORD" ??
void ShowCaret(BOOL on);
int GetYOffset();
int GetYSize();
int GetXSize();
void ClearScreen();

BOOL er en windows boolean type.
WORD er en windows type, det er svjv det samme som en short.

int Random(int range) returnerer en "tilfældig" int i intervallet 0..range-1

Point class'en kunne også skrives som:
Fold kodeboks ind/udKode 

Jeg havde implementeret funktionerne inde i class'en

Point:: Point er constructor.

Dette er en stl vector, der bruges til at holde styr på kasserne
std::vector <Point> BoxList;

[Redigeret d. 03/01-06 19:57:10 af Bertel Brander]



Hej igen Bertel

Hmm jeg har kæmpet og kæmpet med at forstå den kode du gav mig til mit spil, men jeg når ikke frem til det vigtige. Jeg har dog eksperimenteret lidt, ændret i nogle ting for at se hvad der sker, og det lærte lidt.

Hvad er det her fx?

Fold kodeboks ind/udKode 


Spørgsmålet er: Er ordet "size" efter "Boxlist" en funktion i <windows.h>? Eller "push_back"?

Du har defineret en class point:

Fold kodeboks ind/udKode 


Hvad er dens opgave? Hvad laver den egentlig?

Hvordan gør jeg kasserne større, så spillet er stort nok med kun 3 vognbaner? Det var jo meningen at der kun skulle være 3 vognbaner til bilen.
Hvor begrænser jeg bredden af kassernes fald? Jeg ved godt at det er random, men den må ku' få sig en bredde grænse!

Takker igen...
---------------------------
Der findes ingenting der så let slår fejl, som tanker



<< < 12 > >>
t