Προς το περιεχόμενο

2D TDS game Engine! (έκδοση 0.2, ρίξτε μια ματιά,ty)


Alchemist`

Προτεινόμενες αναρτήσεις

Δημοσ.

Τσεκάρετε την έκδοση 0.4c!!! ... Επιτέλους είναι έτοιμη!!![/b] :P

 

Screenshots:

-------

dsadast.jpg

-------

dsadas.jpg

-------

Screenshot από προηγούμενες έκδοσεις:

 

bitmap.jpg

dsadas.jpg

 

 

Download Link (v0.4c): http://www.mediafire.com/download.php?aznfzdniitu (2.13Mb)

Download Link (v0.3h): http://www.mediafire.com/download.php?ni2ikyiyiez (2.10Mb)

 

Download Link (v0.3): http://www.mediafire.com/download.php?ml12n4zmmcm (2.02mb)

 

Download Link (v0.2): http://www.fileshost.com/download.php?id=33422F181

 

 

Πως παίζεται:

Ο παίτκης είναι ο μπλέ κύκλος και οι εχθροί οι πράσινοι. Αυτό είναι ένα test demo οπότε δεν έχει κανέναν ιδιαίτερο σκοπό, απλά προσπαθήστε να μείνετε ζωντανοί :P

Κίνηση : WASD, ή με τα βελάκια

Πυροβολισμός: Ο πυροβολισμός γίνεται με το ποντίκι, ο παίκτης σημαδεύει εκεί που δείχνει ο δείκτης του ποντικιού και ρίχνει κρατώντας πατημένο το αριστερό κλικ. Μπορείτε να πυροβολήσετε και με το CTRL.

R: αλλάζει γεμιστήρα στο όπλο (δεν βγάζει κάποιο μύνημα όταν τελειώνει ο γεμιστήρας, απλά δεν πυροβολεί, θα το φτιάξουμε...)

Shift: ο παίκτης τρέχει, δεν λειτουργεί ακόμη

0,1,2....9: Επιλογή όλπου, τα κουμπιά λειτουργούν μόνο εάν έχετε πάρει προηγουμένως το όπλο. Τα οπλα προς το παρόν είναι πεταμένα κάτω :P

 

Version History:

 

 

Version 0.4c

 

*new interface design & implementation

*different weapons have different accuracy

*drastically improved collisions (thanks to iluvfuz from GMC forums)

*objects react to light (i.e. if the player is under a light, he'll get brighter)

*more realistic aiming & shooting for enemies (reaction times, realistic rotation)

*weapons throw cartridges

*bug fix, bullets don't hit pickable items

 

Version 0.4

 

*improvement of dynamic Lights

*improved enemy A.I.

 

Version 0.3h

 

*explosions don't affect objects that take cover behind walls

*enemies don't see the player if he is behind a wall

*weapons' function enhancements, shooting system improved

*different bullet damage according to the weapon used

*minor bug fixes

*improved gfx

*several A.I. enhancements

*dynamic 2D surface lights

 

Version 0.3

 

*added 10 weapons

*new shooting system

*the weapon that the player is holding is now visible (the sprite is just a black square, but coding is done)

*added views (screen follows the player in a bigger room than the window)

*added new sounds

*fixed the position of reloading bars for player & enemies

*bug fix, player was able to shoot before reloading process is finished 100% & reload even without ammo

*bug fix, sometimes the reloading bar was assigned to a different object than the one that was actually reloading

*improved collisions (they are yet kinda buggy)

*fixed some minor glitches

 

Version 0.2

 

*player can target & shoot

*improved player control (WASD movement, use of mouse)

*improved collisions

*improved enemy AI

*improved graphics (still test gfx)

*added sounds & special effects

 

Version 0.1

 

 

Οποιεσδήποτε προτάσεις/ιδέες/παράπονα/σχόλια δεκτά, ευχαριστώ!!!

 

Το αρχικό μύνημα του thread...

 

Καλημέρα... Ξεκινήσαμε με 2 φίλους να φτιάχνουμε ενα 2D Top Down Shooter, προς το παρόν είμαστε ακόμη στην engine και θα ήθελα μερική βοήθεια στο Α.Ι.

 

Στην μηχανή υπάρχουν προς το παρόν 4 αντικείμενα...

-player (μπλέ στην παρακάτω εικόνα)

-enemy (κόκκινο)

-enemy_bullet

-wall (μαύρα τετράγωνα)

 

Θέλω λοιπόν ο enemy, να μην πυροβολεί εφόσον , υπάρχουν εμπόδια (wall) στην διαδρομή που θα κάνει η σφαίρα για να χτυπήσει τον player... Να προβλέπει δλδ εάν ο παίκτης κρύβεται πίσω από κάποιον τοίχο. Προς το παρών χρησιμοποιώ αυτό τον κώδικα:

 

>if ((point_direction(x,y,player.x,player.y)-5<point_direction(x,y,wall.x,wall.y))&&(point_direction(x,y,wall.x,wall.y)<point_direction(x,y,player.x,player.y)+5)) then {
if (point_distance(x,y,wall.x,wall.y)<point_distance(x,y,player.x,player.y)) then{
obstacle = 1
}
}
else {obstacle = 0}

//η μεταβλητή Obstacle δείχνει αν υπάρχει εμπόδιο

 

Αλλά δεν λειτουργεί, και δεν μπορώ να καταλάβω γιατί... Έχει κανείς καμιά ιδέα, έστω και σε μορφή αλγορίθμου για το πώς να γίνει κάτι τέτοιο?

 

Ευχαριστώ προκαταβολικά :-)

 

Αν θέλει κάποιος να δει την engine, ορίστε ένα screenshot και link... Έχει αρκετά προβλήματα, αλλα το δουλεύουμε (κυρίως στο collision του enemy με το wall)...

 

bitmap.jpg

 

Linky Link: http://www.fileshost.com/download.php?id=822351AF1

 

Δημοσ.

Ερώτηση : Η πίστα είναι χωρισμένη με grid? Δηλ. είναι ας πούμε 30x50 και κάθε αντικείμενο καταλαμβάνει τουλάχιστον ένα τετράγωνο και κάθε κίνηση είναι τουλάχιστον ένα τετράγωνο; Αν είναι έτσι θα ήταν πολύ βολικό να έχεις ένα Array σαν χάρτη για την πίστα σου το οποίο θα κάνεις update real time όσο παίζει το παιχνίδι.

 

Ερώτηση 2η : Εφόσον ισχύει το παραπάνω, οι εχθροί πυροβολούν μόνο κάθετα και οριζόντια; Γίνεται να πυροβολήσουν προς οποιαδήποτε κατεύθυνση;

 

Τις 2 πρώτες παραμέτρους από την point_direction δεν τις πιάνω. Μπορείς να εξηγήσεις λίγο τι κάνει;

 

Δώσε λίγες πληροφορίες ακόμη (απαντώντας στα παραπάνω) και θα βρούμε μια λύση.

Δημοσ.
Ερώτηση : Η πίστα είναι χωρισμένη με grid? Δηλ. είναι ας πούμε 30x50 και κάθε αντικείμενο καταλαμβάνει τουλάχιστον ένα τετράγωνο και κάθε κίνηση είναι τουλάχιστον ένα τετράγωνο; Αν είναι έτσι θα ήταν πολύ βολικό να έχεις ένα Array σαν χάρτη για την πίστα σου το οποίο θα κάνεις update real time όσο παίζει το παιχνίδι.

 

Ερώτηση 2η : Εφόσον ισχύει το παραπάνω, οι εχθροί πυροβολούν μόνο κάθετα και οριζόντια; Γίνεται να πυροβολήσουν προς οποιαδήποτε κατεύθυνση;

 

Τις 2 πρώτες παραμέτρους από την point_direction δεν τις πιάνω. Μπορείς να εξηγήσεις λίγο τι κάνει;

 

Δώσε λίγες πληροφορίες ακόμη (απαντώντας στα παραπάνω) και θα βρούμε μια λύση.

 

Καταρχήν ευχαριστώ για τον χρόνο σου :)

 

Δεν είναι grid-based η κίνηση... Δεν υπάρχουν καν grids... Η κίνηση είναι εντελώς ελεύθερη και πυροβολούν προς οποιαδήποτε κατεύθυνση...

 

point_direction(x1,y1,x2,y2) δίνει ως αποτέλεσμα την κατεύθυνση σε μοίρες (δλδ μπορεί να έχει ακεραιες τιμές απο 0 μέχρι 359)...

Θα μπορούσε να γραφεί το παραπάνω και ως point_direction(self.x,self.y,player.x,player.y) για να γίνει πιο κατανοητό...

Δημοσ.

Το έτρεξα λίγο παρατήρησα ότι αν με κρύβει κάποιο wall οι σφαίρες δεν περνάνε.

Ίσως θα μπορούσες πριν ρίξεις την σφαίρα να ρίξεις μία αόρατη ή οποία αν βρει σε wall να κάνει το obstacle 1.

Δημοσ.

Δοκιμάζω τώρα μια άλλη μέθοδο με την συνάρτηση collision_line, αλλά πάλι τζίφος :/

 

Βασικά όλος ο κώδικας για το enemy, σε περίπτωση που ενδιαφέρεται κανείς να βοηθήσει, η απλά και να δει πως γίνεται κάτι τέτοιο...

 

CREATE event

>obstacle_check = -1
obstacle = 0
bullet_count = 0
stop_fire = 0
direction_previous = 0
fire_direction = 0
battle_engage = 0
fire_counter = 0
direction = 0
ammo = 299
cover_possible = false
cover_id = 0
profile = 1 //(1,2,3 --->harder)
react_count = 0
step_counter = 0
turn = 0
reloading = 0
//collision with wall
dir = 0

 

STEP event

>//-------------------------------------
//When Battle is engaged
//easy enemy
if (profile = 1) then{
if (distance_to_object(player)<180) then {
react_count = react_count + 1
if (react_count = 30) then{
battle_engage = 1
stop_fire = 0
}
}
}
//medium enemy
if (profile = 2) then{
if (distance_to_object(player)<200) then {
react_count = react_count + 1
if (react_count = 20) then{
battle_engage = 1
stop_fire = 0
}
}
}
//hard enemy
if (profile = 3) then{
if (distance_to_object(player)<220) then {
react_count = react_count + 1
if (react_count = 10) then{
battle_engage = 1
stop_fire = 0
}
}
}
//END of when battle engaged
//-------------------------------------------------------
//FIRING  
if (stop_fire=0) then {
if (battle_engage = 1) then {
if (fire_direction < point_direction(x,y,player.x,player.y)) then {
fire_direction = fire_direction + 1
}
if (fire_direction > point_direction(x,y,player.x,player.y)) then {
fire_direction = fire_direction - 1
}
fire_counter = fire_counter + 1
if (ammo > 0) then{
if (((fire_counter)mod(5)) = 0) then{
 if (bullet_count = 15) then {
 stop_fire = 1
 reloading = 1
 instance_create(x,y,reloading_OBJ)
 bullet_count = 0
   }
 if (not(instance_exists(reloading_OBJ))) then {
 stop_fire = 0
 reloading = 0
 }
if ((stop_fire = 0)&&(reloading = 0)&&(obstacle=0)) then {
instance_create(x,y,en_bullet_OBJ)
bullet_count = bullet_count + 1
}
}
}
}
}
//MOVEMENT if battle engage = 1 
if (battle_engage = 1) then {
if (((fire_counter)mod(5))= 0) then{
 speed = 5
 direction = point_direction(x,y,player.x,player.y) + 180
 if (distance_to_object(player)>150) then {
 speed = 0
 }
 if ((distance_to_object(player)>250)) then {
 stop_fire = 1
 speed = 5
 direction = point_direction(x,y,player.x,player.y) 
}
}
}
//refire if distance becomes again small
if (battle_engage = 1) then{
if (profile = 1) then{
 if (distance_to_object(player)<251) then {
 stop_fire = 0
}
}
}
if (battle_engage = 2) then{
if (profile = 1) then{
 if (distance_to_object(player)<251) then {
 stop_fire = 0
}
}
}
if (battle_engage = 1) then{
if (profile = 3) then{
 if (distance_to_object(player)<251) then {
 stop_fire = 0
}
}
}

//keep fire counter small
if (fire_counter = 5000) then {
fire_counter = 0
}  
//check if obstacles on the way (not working)
obstacle_check = collision_line(x,y,player.x,player.y,wall,true,all)
if (obstacle_check > 0) then {
obstacle=1}
else {obstacle=0}

 

COLLISION event (WALL)

>direction_previous = direction 
x = xprevious
y = yprevious
dir = choose(1,2)
if (dir=1) then{
move_contact_solid(direction+180,2)
move_outside_solid(direction+90,1)
direction = direction_previous + 90
speed = 5
}
if (dir=2) then {
move_contact_solid(direction+180,2)
move_outside_solid(direction-90,1)
direction = direction_previous - 90
speed = 5
}

COLLISION event (ENEMY)

>direction_previous = direction 
x = xprevious
y = yprevious
dir = choose(1,2)
if (dir=1) then{
move_contact_solid(direction+180,1)
move_outside_solid(direction+180,1)
direction = direction_previous + 90
}
if (dir=2) then {
move_contact_solid(direction+90,1)
move_outside_solid(direction+180,1)
direction = direction_previous - 90
}

 

---------- Το μήνυμα προστέθηκε στις 16:25 ----------

 

Το έτρεξα λίγο παρατήρησα ότι αν με κρύβει κάποιο wall οι σφαίρες δεν περνάνε.

Ίσως θα μπορούσες πριν ρίξεις την σφαίρα να ρίξεις μία αόρατη ή οποία αν βρει σε wall να κάνει το obstacle 1.

 

Χμμ, καλή ιδέα, αλλά πως θα δουλεύει ακριβώς? γιατί το ότι η σφαίρα θα βρεί σε τοίχο είναι σίγουρο, ακόμη και αν αυτός δεν βρίσκεται ανάμεσα στους 2...

Η σφαίρα σαν αντικείμενο όταν ακουμπάει στον τοίχο αυτοκαταστρέφεται, γ αυτό και δεν περνάνε όπως παρατήρησες... Πως θα του πεις όμως εαν ο τοίχος στον οποίο ακούμπησε η αόρατη σφαίρα αποτελέι εμπόδιο και δεν είναι π.χ. ο ακριανός του δωματίου?

Δημοσ.

Λοιπόν ο παρακάτω κώδικας ελέγχει αν υπάρχει τοίχος ανάμεσα από τον εχθρό και τον παίχτη και είναι πολύ γρήγορος :

 

>[color="#8000ff"]bool[/color] IsWallBetween([color="#2b91af"]PointF[/color] player, [color="#2b91af"]PointF[/color] enemy, [color="#2b91af"]PointF[/color] wall)
{
   [color="#0000ff"][b]if[/b][/color] ([color="#2b91af"]Math[/color].Abs((enemy.Y - player.Y) * (wall.X - player.X) - (wall.Y - player.Y) * (enemy.X - player.X)) >= [color="#2b91af"]Math[/color].Max([color="#2b91af"]Math[/color].Abs(enemy.X - player.X), [color="#2b91af"]Math[/color].Abs(enemy.Y - player.Y)))
       [color="#0000ff"][b]return[/b][/color] [color="#0000ff"][b]false[/b][/color];

   [color="#0000ff"][b]if[/b][/color] ((enemy.X < player.X && player.X < wall.X) || (enemy.Y < player.Y && player.Y < wall.Y))
       [color="#0000ff"][b]return[/b][/color] [color="#0000ff"][b]false[/b][/color];

   [color="#0000ff"][b]if[/b][/color] ((wall.X < player.X && player.X < enemy.X) || (wall.Y < player.Y && player.Y < enemy.Y))
       [color="#0000ff"][b]return[/b][/color] [color="#0000ff"][b]false[/b][/color];

   [color="#0000ff"][b]if[/b][/color] ((player.X < enemy.X && enemy.X < wall.X) || (player.Y < enemy.Y && enemy.Y < wall.Y))
       [color="#0000ff"][b]return[/b][/color] [color="#0000ff"][b]false[/b][/color];

   [color="#0000ff"][b]if[/b][/color] ((wall.X < enemy.X && enemy.X < player.X) || (wall.Y < enemy.Y && enemy.Y < player.Y))
       [color="#0000ff"][b]return[/b][/color] [color="#0000ff"][b]false[/b][/color];
   [color="#0000ff"][b]return[/b][/color] [color="#0000ff"][b]true[/b][/color];
}

 

Τον χρησιμοποιείς ως εξής :

 

>[color="#008000"][i]//Esto oti[/i][/color]
[color="#2b91af"]PointF[/color] player = [color="#0000ff"][b]new[/b][/color] [color="#2b91af"]PointF[/color]([color="#ff8000"]10.0f[/color], [color="#ff8000"]5.0f[/color]);
[color="#2b91af"]PointF[/color] enemy = [color="#0000ff"][b]new[/b][/color] [color="#2b91af"]PointF[/color]([color="#ff8000"]10.0f[/color], [color="#ff8000"]50.0f[/color]);

[color="#8000ff"]bool[/color] canShoot = [color="#0000ff"][b]true[/b][/color];
[color="#0000ff"][b]for[/b][/color] ([color="#8000ff"]int[/color] i=[color="#ff8000"]0[/color]; i<walls.Lengh(); i++)
   [color="#0000ff"][b]if[/b][/color] (IsWallBetween(player, enemy, walls[i]))
   {
       canShoot = [color="#0000ff"][b]false[/b][/color];
       [color="#0000ff"][b]break[/b][/color];
   }

[color="#0000ff"][b]if[/b][/color] (canShoot)
{
   [color="#008000"][i]//BANG![/i][/color]
}

 

Βέβαια το όλο σκεπτικό βλέπει τον τοίχο ως ένα σημείο, ενώ στην πραγματικότητα ο τοίχος είναι ένα ορθογώνιο. Θα σου στείλω σε λίγο κώδικα για να το ελέγχεις και αυτό.

 

Υ.Γ. η ρουτίνα είναι από το βιβλίο Graphics Gems 1

 

---------- Το μήνυμα προστέθηκε στις 18:35 ----------

 

Όπως σου είπα, ακολουθεί κώδικας για να ελέγχεις αν ένας ορθογώνιος τοίχος είναι ανάμεσα από τον εχθρό και τον παίχτη.

Το σκεπτικό είναι ότι ελέγχουμε εάν το ευθύγραμμο τμήμα που σχηματίζουν η θέση του εχθρού και του παίχτη τέμνει κάποια από τις πλευρές του ορθογωνίου του τοίχου.

Ακολουθεί ρουτίνα που ελέγχει αν 2 ευθύγραμμα τμήματα τέμνονται :

 

>[color="#8000ff"]bool[/color] SameSigns([color="#8000ff"]float[/color] num1, [color="#8000ff"]float[/color] num2)
{
   [color="#0000ff"][b]return[/b][/color] (num1 < [color="#ff8000"]0[/color] && num2 < [color="#ff8000"]0[/color]) || (num1 >= [color="#ff8000"]0[/color] && num2 >= [color="#ff8000"]0[/color]);
}

[color="#8000ff"]bool[/color] LinesIntersect([color="#2b91af"]PointF[/color] point1, [color="#2b91af"]PointF[/color] point2, [color="#2b91af"]PointF[/color] point3, [color="#2b91af"]PointF[/color] point4)
{
   [color="#8000ff"]float[/color] a1, a2, b1, b2, c1, c2; [color="#008000"][i]/* Coefficients of line eqns. */[/i][/color]
   [color="#8000ff"]float[/color] r1, r2, r3, r4; [color="#008000"][i]/* 'Sign' values */[/i][/color]

   [color="#008000"][i]/* Compute a1, b1, c1, where line joining points 1 and 2
   * is "a1 x  +  b1 y  +  c1  =  0".
   */[/i][/color]

   a1 = point2.Y - point1.Y;
   b1 = point1.X - point2.X;
   c1 = point2.X * point1.Y - point1.X * point2.Y;

   [color="#008000"][i]/* Compute r3 and r4.
   */[/i][/color]

   r3 = a1 * point3.X + b1 * point3.Y + c1;
   r4 = a1 * point4.X + b1 * point4.Y + c1;

   [color="#008000"][i]/* Check signs of r3 and r4.  If both point 3 and point 4 lie on
   * same side of line 1, the line segments do not intersect.
   */[/i][/color]

   [color="#0000ff"][b]if[/b][/color] (r3 != [color="#ff8000"]0[/color] &&
       r4 != [color="#ff8000"]0[/color] &&
       SameSigns(r3, r4))
       [color="#0000ff"][b]return[/b][/color] [color="#0000ff"][b]false[/b][/color];

   [color="#008000"][i]/* Compute a2, b2, c2 */[/i][/color]

   a2 = point4.Y - point3.Y;
   b2 = point3.X - point4.X;
   c2 = point4.X * point3.Y - point3.X * point4.Y;

   [color="#008000"][i]/* Compute r1 and r2 */[/i][/color]

   r1 = a2 * point1.X + b2 * point1.Y + c2;
   r2 = a2 * point2.X + b2 * point2.Y + c2;

   [color="#008000"][i]/* Check signs of r1 and r2.  If both point 1 and point 2 lie
   * on same side of second line segment, the line segments do
   * not intersect.
   */[/i][/color]

   [color="#0000ff"][b]if[/b][/color] (r1 != [color="#ff8000"]0[/color] &&
       r2 != [color="#ff8000"]0[/color] &&
       SameSigns(r1, r2))
       [color="#0000ff"][b]return[/b][/color] [color="#0000ff"][b]false[/b][/color];

   [color="#0000ff"][b]return[/b][/color] [color="#0000ff"][b]true[/b][/color];
}

 

και το χρησιμοποιείς ως εξής :

>            [color="#008000"][i]//Esto oti[/i][/color]
           [color="#2b91af"]PointF[/color] player = [color="#0000ff"][b]new[/b][/color] [color="#2b91af"]PointF[/color]([color="#ff8000"]10.0f[/color], [color="#ff8000"]5.0f[/color]);
           [color="#2b91af"]PointF[/color] enemy = [color="#0000ff"][b]new[/b][/color] [color="#2b91af"]PointF[/color]([color="#ff8000"]10.0f[/color], [color="#ff8000"]50.0f[/color]);

           [color="#8000ff"]bool[/color] canShoot = [color="#0000ff"][b]true[/b][/color];

           [color="#0000ff"][b]for[/b][/color] ([color="#8000ff"]int[/color] i = [color="#ff8000"]0[/color]; i < walls.Lengh(); i++)
               [color="#0000ff"][b]if[/b][/color] (LinesIntersect(enemy, player, [color="#0000ff"][b]new[/b][/color] [color="#2b91af"]PointF[/color](walls[i].X, walls[i].Y), [color="#0000ff"][b]new[/b][/color] [color="#2b91af"]PointF[/color](walls[i].X, walls[i].Y + walls[i].Height)) ||  [color="#008000"][i]//aristeri pleura[/i][/color]
                   LinesIntersect(enemy, player, [color="#0000ff"][b]new[/b][/color] [color="#2b91af"]PointF[/color](walls[i].X + walls[i].Width, walls[i].Y + walls[i].Height), [color="#0000ff"][b]new[/b][/color] [color="#2b91af"]PointF[/color](walls[i].X, walls[i].Y + walls[i].Height)) ||  [color="#008000"][i]//kato pleura[/i][/color]
                   LinesIntersect(enemy, player, [color="#0000ff"][b]new[/b][/color] [color="#2b91af"]PointF[/color](walls[i].X + walls[i].Width, walls[i].Y), [color="#0000ff"][b]new[/b][/color] [color="#2b91af"]PointF[/color](walls[i].X + walls[i].Width, walls[i].Y + walls[i].Height)) ||  [color="#008000"][i]//deksia pleura[/i][/color]
                   LinesIntersect(enemy, player, [color="#0000ff"][b]new[/b][/color] [color="#2b91af"]PointF[/color](walls[i].X, walls[i].Y), [color="#0000ff"][b]new[/b][/color] [color="#2b91af"]PointF[/color](walls[i].X + walls[i].Width, walls[i].Y)))  [color="#008000"][i]//pano pleura[/i][/color]
               {
                   canShoot = [color="#0000ff"][b]false[/b][/color];
                   [color="#0000ff"][b]break[/b][/color];
               }

           [color="#0000ff"][b]if[/b][/color] (canShoot)
           {
               [color="#008000"][i]//BANG![/i][/color]
           }

 

Δηλαδή για κάθε τοίχο, ελέγχεις αν κάποια πλευρά τέμνει το ευθύγραμμο τμήμα παίχτη-εχθρού. Αν το τέμνει κάποιο σημαίνει ότι κάποιο εμπόδιο είναι μπροστά.

 

Υ.Γ. και πάλι ο κώδικας είναι από το Graphics Gems II

Δημοσ.

Ευχαριστώ πολύ παιδιά για όλα τα μυνήματα... Το πρόβλημα το έλυσα χτες τελικά με την χρήση της συνάρτησης collision_line ... Κράτησα βέβαια τους δικούς σας κώδικες για μελέτη, αλλά όσων αφορά τον κώδικα του kagelou το PointF τι είναι ακριβώς? :P

 

Y.Γ. δεν γράφω σε C++, (που λογικά είναι η γλώσσα που μου απαντάς) ξέρω μόνο GML και λίγη java... Η engine είναι γραμμένη σε GML.

 

Y.Γ. μετά από αυτό το πρόβλημα και μερικές ακόμα βελτιώσεις, τόσο στην συμπεριφορά όσο και στον τομέα γραφικών που έχουν γίνει φτάνουμε σε λίγο στην έκδοση 0.2, λογικά σε μερικές ώρες θα είναι έτοιμο... Θα φαίνεται εκεί και το Gameplay... Θα κάνω post με νεώτερα... Ευχαριστώ και πάλι πάρα πολύ για το ενδιαφέρον! :-)

Δημοσ.

Τί είναι η GML? Πρώτη φορά την ακούω. Το PointF είναι απλά ένας τύπος της C# που έχει x & y. Ένα σημείο δηλαδή. Το F εννοεί float, ότι τα χ & y δηλ. είναι δεκαδικοί.

Δημοσ.
Τί είναι η GML? Πρώτη φορά την ακούω. Το PointF είναι απλά ένας τύπος της C# που έχει x & y. Ένα σημείο δηλαδή. Το F εννοεί float, ότι τα χ & y δηλ. είναι δεκαδικοί.

 

τώρα το έπιασα :P ... GML = Game Maker Language.

 

Παρεπιπτώντως ανέβασα την έκδοση 0.2, το έβαλα στο post #1, αν θέλετε ρίξτε μια ματιά, περιμένω οποιεδήποτε γνώμες και ιδέες!!! Ευχαριστώ και πάλι! :)

 

Υ.Γ. πιάνει μόνο 1273KB

Δημοσ.

έπαιξα λίγο το παιχνίδι, αρκετά διασκεδαστικό θα έλεγα :-)

 

αυτό που είναι λίγο ενοχλητικό(για εμένα τουλάχιστον), είναι όταν ο παίκτης ακουμπάει στο τοίχο τότε πρέπει να αφήσεις το πλήκτρο και να το ξανα πατήσεις για να κουνηθείς, λες και έχει κόλα ενα πράγμα και δεν "γλιστράει" :P

 

μία ιδέα που είχα είναι να το κάνεις σε επίπεδα, stage 1, 2 κτλ με πόντους ;)

όσο μεγαλύτερο είναι το επίπεδο τόσο ποιο δύσκολο να γίνετε και σε κάθε επίπεδο να έχει διαφορετική πίστα κάθε φορά. ίσος με χιόνι που να σε κάνει να πηγαίνεις ποιό αργά κτλ.

Δημοσ.

Ωραία προσπάθεια! Μπράβο! Εγώ θα το έκανα με ένα υψηλής ανάλυσης grid και για το path-finding των εχθρών και πυρών θα βασιζόμουν σε A*.

 

Καλή συνέχεια στην προσπάθεια σας!!

:)

Δημοσ.

Πολύ ωραία προσπάθεια.

 

Αυτά που θα ήθελα να πω (περί της σαδιστικής collision και της ανάγκης βελτίωσης της AI) τα έχετε ήδη βρει μόνοι σας και τα έχετε βάλει στην to-do list. Άρα, περιμένουμε τις επόμενες βελτιώσεις!

 

Μπράβο σας πάντως.

Δημοσ.

Ωραία δουλειά!

Πάντως, ενημερωτικά, εκεί που έπαιζα, μου πέταξε ένα:

 

>ERROR in
action number 1
of Collision Event with object reloading_OBJ
for object pl_bullet_OBJ:

Error in code at line 3:
  other.hp = other.hp - 10

at position 19: Unknown variable hp

 

  • 1 μήνα μετά...
Δημοσ.

Ευχαριστώ όλους για τα καλά σας λόγια...

 

Φτάσαμε στην επόμενη έκδοση 0.3 ... Περισσότερες πληροφορίες καθώς και το Link για να το δείτε, υπάρχουν στο πρώτο ποστ...

 

Τα κυριοτερα χαρακτηριστηκα αυτής της έκδοσης είναι ότι προσθέθηκαν όπλα τα οποία μπορεί ο παίκτης να επιλέξει με τα 0,1,2...9 (όπως τα κλασσικά fps), εκ των οποίων το καθένα έχει διαφορετική συμπεριφορά και ήχο.

Επίσης υποστηρίζονται μεγαλύτερες "πιστες" και χρησιμοποείται μια "κάμερα" που ακολουθεί τις κινήσεις του παίκτη στον χώρο. Έγιναν επίσης και αρκετές μικροβελτιώσεις, ιδιαίτερα στο θέμα των collisions...

 

Y.Γ. δυστηχώς δεν ασχοληθήκαμε καθόλου με το Α.Ι.

 

Υ.Γ.2. γτ δεν μπορώ να αλλάξω τον τίτλο του θέματος??? efefeC...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.
  • Δημιουργία νέου...