Menu

Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Show posts Menu

Messages - mode7

#1
Quote from: Indra Anagram on Mon 08/08/2022 19:45:31
Hello, AGS Community!

Has anyone seen this on YouTube?  8-0



I wonder if something real was ever published.

My question is: Any ideas how this was made? Ledge detection is particularly interesting.


Hey Indra, thanks for your question. I made this as a prototype. As CaptainD pointed out already these experiments turned into Concurrence my "biggest hit"  :grin:. If I can manage to find the source I will let you know but note that was made for an old AGS version by someone who wasn't a professional coder yet (I'd like to think of myself of being one now).
I remember what helped me extremely was this article: https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/the-guide-to-implementing-2d-platformers-r2936/. The second most important piece for doing a platformer is using a state machine. Just google "platformer state machine" it's not so complicated. Basically it's a big switch-case/else-if statement where you manage the different states the player can be in. What really made AGS a good choice is it's blocking code mechanic (something I really miss in other engines). Cinematic Platformers basically work like: Wait for input - Play animation - Wait for input again. AGS' blocking animations combined with the tween plugin worked like a charm. As for the ledges. I remember it basically worked like this: Concurrence is grid based (I think 16px). Each gird cell can have an attribute (e.g. ground, ledge etc...). When the Player is in standing state and hits jump key, check at a fixed coordinate above and a little in front. If this coordinate is part of a ledge, play the "jump to ledge" animation and move the player to the appropriate coordinates. Afterwards player will enter the "hanging on ledge" state where other options are available for input. If you have any more questions feel free to ask :)
#2
I tried to fix some of the issues- Not sure about the head bobbing though...
#3
Thank you for posting this. The articles you pointed out look really promising!
Well honsetly I actually never played, IF. When I got my first Computer the era of grafic adventures had already begun, and later I never really got into the genre. Using parsers and reading tons of text on a monitor just never seemed fun. Although I have a feeling I'm missing out on something.
#4
So did I say sideviews are easier? Well they aren't really. Actually I didn't quite work out as well as I expected it to. I think the problem is, that the torso has to move too.
I'll fix this eventually. Anyway, here is the animation - it took from painting the sprite to importing it into AGS about 90min. So be aware that there's some refinement missing.
I did a recording of it which is currently uploading to youtube. You can see it here. Feel free to ask any questions.
#5
I'll have a look at the shoulder and head animations. Of course you could combine this animations with frame animation. For example I could a draw a few frames for the head and use them inside the animation. It depends how much time you want to invest.
The software I'm using is Anime Studio Pro. Basically because that's what I always used. Actually I don't need most of its features.
Interesting alternatives which do the same are Spine by Esoteric Software or Brashmonkey's Spriter. The last two are especially targeted at games developement and realtime rendering, but they also render to images.
If you're interested how I do these maybe I'll record some footage of me doing the sideways animations.
#6
Very good point. I didn't think of that. Actually a lot of games try to imitate that branching mechanic of monkey island. That prevents being stuck to a certain degree - yet you can still get stuck when you completed all branches except for one. I think there are some other pitfalls too. It always felt a bit constructed to me which is okay for a humorous game I guess, I also felt like the main parts of the story were only progressing between chapters. Another downside is that it can be confusing because you sometimes don't know which hint or item belongs to which branch. If you avoid these pitfalls it can be great. I think its Indy 4 which solves this by seperating the branches geographically.
#7
Still have to do the sideways ones. But I've done plenty of them for games before - they're not a problem.

Concurrence is not dead don't you worry. I'm just in a job situation that gives me little time to work on it - will take a little more time.
#8
Thx magnitz, this was really interesting and also thanks for the articles you pointed out. Very insightful.
Also thank you qptain nemo for pointing out Vacuum a great game which I probaby overlooked due to rather bleak presentation.

This really showed me what adventures are all about: Storytelling and what's even more important being part of the story yourself. You keep playing because you want to know what's going on to solve the mystery, become a pirat, save the princess.
I also agree by the point that adventures, if pulled of correctly, provide the most living, most emersive off all game worlds. Let's take Skyrim for example, it promises a great open world to explore and have you're own adventure there, but after the first 'Wow' moments it really quickly starts to feel like a stage. Finding a new location in Skyrim will never have the same sense of wonder as visiting an unknown island in Monkey Island or opening a secret entrance to a tomb in Broken Sword. Yet this comes with a huge price: Linearity of storytelling (which i think is a good thing) and non-emergent game mechanics (which brings us back to the main crticism on adventure games - trying to guess what the designer prepared for you).
I think we all agree on that loosing or removing the puzzle aspect is not really an option. Most games that tried have made things worse (Damn you broken combat system! - what have you done to Dreamfall??). Still what I think we have to lose is the competive aspect of "beating" a game. Worst example are these Sierra games that randomly kill you and then make fun of you. Seriously, if you're a game designer, arent players customers? Is this how you treat customers? Thank god, games are not like this anymore. Yet there has to be an element of challenge right, it's no fun to rush through a game with mindlessly easy puzzles (Yet still better than being stuck on an illogical one for hours). The challenge will be to provide interesting involving an logical puzzles, that challenge players without loosing some on the way which can't progress on the linear chain of events because they just can't figure out the solution to A SINGLE puzzle.
This is the big problem adventures designers have yet to solve - yet I doubt there is a full solution.
What we can do however is avoiding these situations by proper planing and design. But what makes a good puzzle?
Anybody up for a list?
I'll start:
- Must derive from the story, preferably an obstacle the hero has to overcome to achieve his goal.
#9
I've recently been thinking again about how much I love point and click adventures and how much I want to do one someday.
The biggest problem for me have always been animations. They're tedious to do and if you're not into pixel animations like me doing them the traditional way takes a lot of patience and practice. I have neither of which so I've always been looking for ways to cheat ;)
Modular animations are such a way. Why draw a leg 15 time when you can draw it once and translate it into the right position? Have a look at Odin's Sphere to see this pulled of perfectly klick! The problem with these animations is that you can't do foreshortening so  you're perfectly fine as long as you do a side view but when it comes to the front and back views it will look weird.
Still the advantadges are so tempting: Keyframing, Unlimted frames, Very detailed sprites and most importantly: You can reuse animations. So down there you can see the same animations with three different characters applied - all made from a template. Took me each about 45min for the template and another 5 to tweak the animation to the character. The animation itself took about 90mins.

You probably also see the disadvantages - yet tell me: Would you play a game with such animations (Side view will look much better!) or is it rather anoying?
#10
I wanted to join the background blitz for a long time now. Finally made it. Not quite finished and still quite loose but it's the best I can do with the time I can currently spare.

It's supposed to be some kind of wooden cathedral, a shrine of a ancient pagan religion.

#11
I think what Radiant means is checking if the x/y tile is on screen before actually drawing it. This should make your performance independent from the map size and should give you sufficient performance. What frame rates are you getting? Ags draw image function should be fast enough for resolutions up to 640 (with a 32 tile size or bigger) Dropping the alpha-channel should also give you a performance boost.
#12
The Rumpus Room / Re: *Guess the Movie Title*
Sat 14/01/2012 13:48:59
Quote from: Chrille on Sat 14/01/2012 11:13:29
It's Derzu Uzala! Or however it's spelled ;)

Thats correct!
Your turn, I guess
#13
Well this is more of a math question than a technical one. I still think it fits here best.

Basically I want to have a line which has a fixed origin and length to point towards the mouse pointer.
I already put everything together to the point that i only need to supply an angle for the line-pointing-thingy.

I found this formula which I used somewhere else which i think can be resolved to output the angle
Code: ags

mouse.x = originx + 'r'  * cos(angle)

will resolve to

cos(angle) = (mouse.x-originx) /r

//r is is the distance from he origin to the mousetip - calculated with the good old pythagoras and thats also where my math skills end



So my simple, yet probably naive, question is
How do I get the angle out of the the Cosinus

DAMN YOU TRIGONOMETRY!!!

#14
The Rumpus Room / Re: *Guess the Movie Title*
Fri 13/01/2012 22:49:52
Nope, it's much older!

BTW: It's "Frohe Weihnachten"
#15
The Rumpus Room / Re: *Guess the Movie Title*
Fri 13/01/2012 20:17:54
OMG! Can't belive I got one right this time. I've been lurking in this thread for ages.
Nice movie btw - I like the whole feel of these wes anderson movies. They have this dreamy nostaligic feeling to it. Must be the music,yes..

Well, here's the revenge. A true masterpiece

#16
The Rumpus Room / Re: *Guess the Movie Title*
Fri 13/01/2012 18:37:33
Royal Tennenbaums?
#17
Thanks Khris, you saved my day once again. Even though this is a kind of workaround its perfectly suitable for my structs as data structs are handled internal and only passed through to the public struct.

I didnt knew you could use structs this way.

Now everthing works fine.
#18
It is a compile error but I've tracked to the extend that it only occurs when I try to access a member of Rectangle

I think i did it right..
have a look

Header
Code: ags

struct Rectangles
{
  import function Move(int ID, int toX, int toY, float seconds);
  import bool IsIntersecting(int left1,int top1,int right1,int bottom1,int left2,int top2,int right2,int bottom2);
  import function HandleCollision(int ID1,  int ID2);
};

import Rectangles Rectangle;


Script (partial)
Code: ags


Rectangles Rectangle;
export Rectangle;

function Rectangles::Move(int ID, int toX, int toY, float seconds)
{
  float time = IntToFloat(GetGameSpeed())*seconds;
  float xoffset = IntToFloat(toX)-IntToFloat(Rect.GetX(ID));
  float yoffset = IntToFloat(toY)-IntToFloat(Rect.GetY(ID));
  
  if (time < 1.0) time = 1.0;
  
  float xrate = xoffset/time; 
  float yrate = yoffset/time;
  
  Rect.AddMovement(ID, xrate, yrate, FloatToInt(time));
}


bool Rectangles::IsIntersecting(int left1,int top1,int right1,int bottom1,int left2,int top2,int right2,int bottom2)
{
	return !(left1 > right2 || right1 < left2 ||
		top1 > bottom2 || bottom1 < top2);
}


function Rectangles::HandleCollision(int ID1,  int ID2)
{
  int stepsX = Rect.GetNextX(ID1)-Rect.GetX(ID1);
  int stepsY = Rect.GetNextY(ID1)-Rect.GetY(ID1);
  
  int Top1 = Rect.GetNextY(ID1);
  int Top2 = Rect.GetNextY(ID2);
  int Bottom1 = Rect.GetNextY(ID1)+Rect.GetHeight(ID1);
  int Bottom2 = Rect.GetNextY(ID2)+Rect.GetHeight(ID2);
  int Left1 = Rect.GetNextX(ID1);
  int Left2 = Rect.GetNextX(ID2);
  int Right1 = Rect.GetNextX(ID1)+Rect.GetWidth(ID1);
  int Right2 = Rect.GetNextX(ID1)+Rect.GetWidth(ID2); 
  if (Rectangle.IsIntersecting(Left1, Top1, Right1, Bottom1, Left1, Top1, Right2, Bottom2)) Display ("Collision!");
}
#19
It was only a type it's spelled correctly in the script

The complete error reads

"script link failed: Runtime Error: Unresolved import 'Rectangle'"

it's if rectangle was never properly exported...
#20
I opened a thread yesterday about getting null pointer errors with falsely exported struct variables.

I went on and changed it and it worked fine - in one script. I did exactly the same thing in another and get a script link error
I have three modules with the following hierachy

- Rectangle.asc/h
-Rectangle_Operation.asc/h
-GlobalScript.asc/h

the headers contain struct declarations and struct variable imports

Well lets take a look at it
Rectangle.ash
Code: ags

struct Rects
{
...
};

import Rects Rect;

Rectangle.asc
Code: ags

Rects Rect;

...lots of fancy stuff...

(end of script)
export Rect;


This works perfect so far (thanks again khris!)

Now I did this in the rectangle_operations script as well
Rectangle_operations.ash
Code: ags

struct Rectangles
{
...
};

import Rectangles Rectangle;

Rectangle_operations.asc
Code: ags

Rectangles Rectangle;

...lots of fancy stuff...

(end of script)
export Rectangle;


As you see this is done in exactly the same manner as the first one, however when
GlobalScript.asc calls any memeber function of Rectangle ags throws a script link failed error at me.

It seems completely random as i can access members of Rect without a problem. Please Help!
SMF spam blocked by CleanTalk