Announcements
description
Transcript of Announcements
![Page 1: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/1.jpg)
LECTURE 7 Announcements
![Page 2: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/2.jpg)
Platformer1 Feedback• Week 1 of 4 is done!• Collision debugger is almost done– Two things left we recommend
implementing in the debugger• By the end of this week, you’ll
completely move your code to your own project
![Page 3: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/3.jpg)
Confusion with Collisions• t-value is in [0, 1], meaning that
the world space ray should have a direction that is equal to (endPos - startPos)– Not normalized!
• Collision code should return a struct, minimally containing:– t-value in [0,1]– Normal– Point of contact
• You may want to put “fancier” stuff in later
• About 2-sided triangles
![Page 4: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/4.jpg)
Running out of space?• Delete old build
directories• Don’t commit build
directories to Git repos
• Last resort: email [email protected]
![Page 5: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/5.jpg)
Final comes out next week!• Start thinking of a game you
might like to make– Built on top of “voxel” or
“geometric”• Or both?• Or neither?
– Add some “advanced” features• Start asking around to see
who you might want to work with
• Specifics coming next week
![Page 6: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/6.jpg)
QUESTIONS?Announcements
![Page 7: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/7.jpg)
LECTURE 7The Geometric Engine II
(Geometric Engine)
![Page 8: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/8.jpg)
REPRESENTATIONThe Geometric Engine II (Geometric Engine)
![Page 9: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/9.jpg)
Last time on 3D Game Engines…• You have some geometric
specific code hanging around in your collision debugger, where to put it?
• It is generalizable to your geometric engine, but not to your minecraft engine
• Can’t put it in the common engine, so what to do?
Common Engine• Screens• Graphics methods• Entity hierarchy• Primitive raycasting
Voxel Engine• Voxel collisions/raycasting and drawing
Geometric Engine• Ellipse-Triangle collisions
![Page 10: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/10.jpg)
Review of Managers• In your common engine,
your World keeps track of some Managers
• Your game specific code initializes a game-specific System, and registers it with your Managers
• Your world simply ticks and draws all its systems
class Manager {public: virtual void onTick(float secs) = 0; virtual void onDraw(Graphics *g) = 0;private: List<Entity *> *entities;}
class VoxelManager :public Manager {public: VoxelManager(List<Entity *entities>, ChunkGenerator *generator); virtual void onTick(float secs); virtual void onDraw(Graphics g);private: ChunkGenerator *generator;}
![Page 11: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/11.jpg)
GeometricManager• Needs to be able to
collide entities with triangles
• The World only draws Entities, so the Manager should draw the triangles as well
• You will be loading the triangles from an OBJ file (coming up next!)
class GeometricManager : public Manager {public: GeometricManager ( List<Entity *> *entities, List<Triangle *> *triangles); virtual void onTick(float secs); // onTick does collisions of entities with triangles virtual void onDraw(Graphics g); // draws trianglesprivate: List<Triangle *> *triangles;}
![Page 12: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/12.jpg)
QUESTIONS?The Geometric Engine II (Geometric Engine) – Representation
![Page 13: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/13.jpg)
LECTURE 7Wavefront OBJ Models
(Common Engine)
![Page 14: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/14.jpg)
EXTERNAL MODELSWavefront OBJ Models (Common Engine)
![Page 15: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/15.jpg)
What is it?• File format specifying a set
of triangles• What do we want them for?
– Character models– Object models– Levels models– Navigation meshes (more on
this next week)• Basically, anything you
wouldn’t want to represent using just code
![Page 16: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/16.jpg)
OBJ format• Universal 3D object format• Stored as plain text– Vertices (v)– Texture coordinates per vertex (vt)– Vertex normals (vn)– Faces (f)–Many, many more things
![Page 17: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/17.jpg)
OBJ Support Code• We provide support code that handles
the following:– Reading an OBJ and generating a VBO from it–Writing OBJ files– Efficient internal representation of triangles:
• Hard to use for collisions!• You should use your own triangle representation
for your game purposes
![Page 18: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/18.jpg)
OBJ Support Code• Treat OBJs as any other resource, like
textures– Only import once– Specific instance properties like scale,
texture, or animation should go in a containing class instead of modifying the OBJ
• Use your Shape/Primitive class to render OBJs!
![Page 19: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/19.jpg)
QUESTIONS?Wavefront OBJ Models (Common Engine)
![Page 20: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/20.jpg)
LECTURE 7Collision Response II(Geometric Engine)
![Page 21: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/21.jpg)
INTEGRATING COLLISIONSCollision Response II (Geometric Engine)
![Page 22: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/22.jpg)
Introduction• Where we left off:
– World is modeled as a set of triangles– Entities are modeled as an ellipsoid– Sweep test: when moving the ellipsoid through a displacement
from A to B, find the ellipsoid position that first intersects the world
• Now we need to respond to the collision– Bounce, slide, or a combination of both
• Remember, the goal is not physical accuracy!– Real people are not ellipsoids– We’re modeling the player’s intentions
![Page 23: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/23.jpg)
Introduction• Ellipse is trying to move by vector • Collision between an ellipse and a triangle should return a
t value between 0 and 1– 0 means the ellipse did not move at all, 1 means the ellipse
moved the full length of • Test for collisions by:
1. Test ellipse against every triangle2. Take the minimum t value that is greater than 03. Move ellipse by
• But we now have “left over” velocity
![Page 24: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/24.jpg)
Bouncing• Remaining velocity can be split into 2 components: one parallel and
one perpendicular to the contact plane• Keep the parallel component the same• Negate the perpendicular component
– Elastic (preserves kinetic energy)• Or multiply by a scalar in the range [-1, 0]
– Inelastic (some energy is lost)
Vbefore
Vparallel
Vperpendicular
Before
Vafter
Vparallel
−Vperpendicular
After
![Page 25: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/25.jpg)
Sliding• Split remaining velocity into 2 components:
one parallel and one perpendicular to the contact plane– Keep the parallel component the same– Zero the perpendicular component
Vbefore
Vparallel
Vperpendicular
Before
Vparallel
After
![Page 26: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/26.jpg)
Sliding for player movement• Move player forward to contact point using time of
collision– But that alone would leave the player stuck (we have
remaining velocity)• As if the ground had infinite friction• Instead, slide the player
– Project the remaining displacement onto the contact plane• Make sure to use the remaining displacement—otherwise players
would speed up after each collision!– Move player again with another collision test
• This is recursive, but 2 or 3 iterations should be enough
![Page 27: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/27.jpg)
Sliding for player movement
A
B
Original displacement
A
B
Original displacement
Leftover displacement
A
B
Displacement for next iteration
A
B
The next iteration could collide with another
surface
A
B
Left-over displacement
A
B
Displacement for next iteration
![Page 28: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/28.jpg)
Computing the contact point• Interior: Use ray-plane
intersection point• Vertex: Use vertex position• Edge:
ray-cylinder intersection point
the contact point• Remember to do this in
sphere space, then convert back to ellipsoid space
D
C
B
A
P
P'
![Page 29: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/29.jpg)
Computing the contact plane• Contact plane: passes
through contact point and is tangent to ellipsoid– Isn’t always the plane containing
the triangle• Computing the contact normal
ellipsoid radius vector , ) ellipsoid center in sphere space contact point in sphere spaceNormal in sphere space Normal in sphere space
Contact planes
![Page 30: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/30.jpg)
Contact plane in ellipsoid space• We have the contact normal in sphere space
– Now we need to convert it to ellipsoid space• First attempt: Multiply by ellipsoid radius
– Works for positions– Doesn’t work for normals!
Sphere space
Multiply by R
Incorrect normal in ellipsoid space
![Page 31: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/31.jpg)
Sphere space Correct normal in ellipsoid space
Divide by R
Contact plane in ellipsoid space• Remember from cs123: always transform
normals by inverse-transpose matrix– Results in dividing by R instead of multiplying– So normal in ellipsoid space
![Page 32: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/32.jpg)
Problem: Floating point imprecision
• Due to finite precision, the ellipsoid is unlikely to be exactly on the plane–May be slightly above–May be slightly penetrating
• Once player overlaps with the world, collision detection in next frame will fail
• Player will fall through the floor
![Page 33: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/33.jpg)
Problem: Floating point imprecision• Solution:– Move the player away
from the plane after every collision
– Move by epsilon along the contact normal
• But this can cause other problems…
![Page 34: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/34.jpg)
Problem: Acute angles• When surfaces
form an acute angle, moving the player by epsilon can push it into a face– And the player will
fall through the floor
![Page 35: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/35.jpg)
Problem: Acute angles• Need to move player out of from
several planes all at once• There are both iterative and analytic
solutions–We’ll talk about an analytic solution next– But you aren’t required to implement it
![Page 36: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/36.jpg)
Analytic solution for acute angles• Find all triangle interiors the player intersects
– Project player center onto plane– Check if projected point is inside triangle bounds– You can ignore vertices and edges
• Create a set of the triangles’ planes– Adjacent, coplanar polygons contribute only one plane
• Solve for new position given old position and plane set
![Page 37: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/37.jpg)
Analytic solution for acute angles• We can get away with handling only the
2-plane and 3-plane cases– 4 or more won’t happen in a reasonable world
Solve
![Page 38: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/38.jpg)
Plane-plane intersection• Given planes as
(normal, distance-from-origin) pairs:
• The line of intersection is where: 𝐶
𝐶+𝐷
𝐵
𝐴
![Page 39: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/39.jpg)
Analytic solution for acute angles• Take the set of planes overlapping the player• Move each plane forward by sphere radius +
epsilon• Use planes’ intersection to find new player
position– 2 planes: Project position onto line of planes’
intersection– 3 planes: Set position to point of planes’ intersection
![Page 40: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/40.jpg)
Collision response: Recap• We now have collision detection and
analytic collision response for an ellipsoidal player– Yay!
• But wait, there’s more!–We can tweak our collision response to better
handle certain scenarios (ramps, ladders, ice, …)
![Page 41: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/41.jpg)
QUESTIONS?Collision Response II (Geometric Engine)
![Page 42: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/42.jpg)
LECTURE 7Player Movement
(Geometric Engine)
![Page 43: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/43.jpg)
THE PLAYER’S INTENTIONS
Player Movement (Geometric Engine)
![Page 44: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/44.jpg)
Before we start…• You do not have to implement all of
these• You are only required to implement
one of your choosing• That said, all of these will make your
movement marginally better– Feel free to play around
![Page 45: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/45.jpg)
Problem: Sliding while standing• Currently, player will accelerate down slopes due to gravity• Doesn’t happen in real life because of static friction
– Force that resists relative motion of two surfaces in contact• Solution: Simulate static friction using a hack
– Split movement into horizontal/vertical components– Only do sliding for horizontal movement– Do 1 collision iteration for y-component (use this to determine if
the player is on the ground)• May want sliding on steep slopes
– Could enable vertical sliding based on steepness of slope (the collision normal)
![Page 46: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/46.jpg)
Problem: Bouncing down ramps• Player bounces if
vertical velocity is set to 0 on contact
• Solution: When on ground, set vertical velocity to a small downward value instead of 0
![Page 47: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/47.jpg)
Problem: Deflection on ramps• Contact normal pushes player up and to the side
![Page 48: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/48.jpg)
Problem: Deflection on ramps
• Player’s intent is to move in a straight line• Current algorithm projects endpoint of
sweep onto the closest point on the plane• Instead, we want to project the endpoint
of the sweep to a point on the plane straight ahead of player
![Page 49: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/49.jpg)
Problem: Deflection on ramps
• Solution: modify horizontal movement– Slide toward point on contact plane straight ahead, but
using the distance that non-hacked collision response would produce
– Given leftover displacement and contact normal :New displacement direction New displacement length
• No sliding for vertical walls ()– Can’t move any further while moving straight– To fix this, set new velocity as before, but only for
vertical walls
![Page 50: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/50.jpg)
Surface types• How do we add ladders, ice, sticky
surfaces, or rotating platforms?• Annotate faces as special surfaces• Surface type is returned as part of
collision detection• Use surface type to adjust collision
response
![Page 51: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/51.jpg)
Frictionless surfaces• On a half pipe, player
should have same speed on enter and exit
• Must approximate curved surfaces with flat polygons when using polygonal collision detection
• Problem: Projecting the velocity when sliding loses energy
![Page 52: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/52.jpg)
Frictionless surfaces• Solution: Scale velocity so
energy is conserved– Same velocity direction as
before– New velocity length:
• Don’t want to always redirect velocity– This hack is only correct for a
polygonal approximation– We shouldn’t redirect when
hitting a surface head-on– Only redirect when
![Page 53: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/53.jpg)
Case study: Hacks in real games• Hack to fix player-world intersections
– If player-world intersection is detected, try nudging slightly along all 3 axes to see if player is now free
– Used in Quake 2 by id Software• Simple method for climbing over steps and small
objects– Before moving, lift player up a small amount– After moving, drop player down that same amount (unless
player intersects an object)– Used in the game MDK2 by BioWare
![Page 54: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/54.jpg)
Case study: Hacks in real games• Easy collision response against a heightfield
– object.height = max(object.height, terrainHeight(object.horizPos))
– Used in many RTS engines• Maximize floating-point precision
– Floats have more precision near the origin– World is divided into sectors, each with its own local coordinate
space– When player moves between sectors, objects positions are
updated to the new origin– Used in Dungeon Siege by Gas Powered Games
![Page 55: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/55.jpg)
Conclusion• Collision response is a pile of hacks– Optimal player movement is not
physically correct– Floating point imprecision is tricky–What we presented is definitely not the
only way to do it
![Page 56: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/56.jpg)
LECTURE 7Tips for Platformer 2
![Page 57: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/57.jpg)
Support Code!• <obj.h> and <obj.cpp> do all things
OBJ-related!– VBO data is calculated for you – use
your Shape/Primitive wrapper class!• Feel free to extend or modify these
classes to your heart’s content
![Page 58: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/58.jpg)
Level files!• 3 obj maps provided:
– Easy: closed world, very few acute angles, great test area in a side room
– Hard: closed world, some acute angles, also has a large test area
– Island: open world, half-pipe approximation, hidden rooms, and more!
• Textures provided!– Janky baked-in lighting and shadows!
• All should allow a reasonable size entity to spawn at the origin
![Page 59: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/59.jpg)
Collision Code Tips• Make your “realism” hack toggleable
so you can check to see it’s actually making a difference
• Watch out for division-by-zero!– Relatedly, watch out for normalizing 0-
length vectors
![Page 60: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/60.jpg)
LECTURE 7C++ Tip of the Week
![Page 61: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/61.jpg)
FRIENDSHIPC++ Tip of the Week
![Page 62: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/62.jpg)
Friend classes• By default, only public variables and
functions in a class are externally visible• Public and protected variables/functions are
visible to subclasses• A friend class gets access to ALL members
of a class, regardless of listed scope
![Page 63: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/63.jpg)
Friendship• Friendship is NOT symmetric by default• It’s also not transitive:– If class C says class B is a friend, and B says A is a
friend, C does not become a friend of A• Subclasses don’t really inherit friendship– If B declares A as a friend, SubA does not inherit that
friendship– SubB’s inherited members from B will still be visible
to A
![Page 64: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/64.jpg)
Making friendsclass TA {
private:gradeStudentGame(Student *s); // Should probably look at the source code
}class Student {
friend class TA; // Grants TA access to all Student’s memberspublic:Game* playtestGame();private:Qfile* accessSourceCode (); // This is now accessible to the TAs!
}
![Page 65: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/65.jpg)
Friend methods• You can also declare a single method as a friend:class TA {
private:gradeStudentGame(Student *s); // Should probably look at the
source codeaccidentallyRmFileSystem(); // Shouldn’t have access to
student’s code}class Student {
public:Game* playtestGame();friend TA::gradeStudentGame(Student *s); // Grants access
only within this functionprivate:
Qfile* accessSourceCode();}
![Page 66: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/66.jpg)
Operator Overloading• Friendship is useful for making
overloaded operators work– Since operators aren’t (usually) member
functions of the classes they are being overloaded for, they won’t have access to private members of those classes
– Solution: declare those operator functions as friends in your class
![Page 67: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/67.jpg)
One more note - Functors• Mysterious C++ ‘function objects’– Just classes with an overloaded ()
operator– Example: pass a comparator object into
a priority queue to sort objects according to comparator()
– http://web.stanford.edu/class/cs106l/course-reader/Ch13_Functors.pdf
– Thanks to mjm9
![Page 68: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/68.jpg)
LECTURE 12C++ Anti-Tip of the
Week
![Page 69: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/69.jpg)
Some fun stuff// What does this do?!ErrorHappened() ??!??! HandleError();// The same thing as this:if (ErrorHappened()) HandleError();
int c = 0;// I love comments yeah wooooo????????????????/c++;// What does this print?printf("%d\n", c);
![Page 70: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/70.jpg)
Preprocessor trigraphs!• ?? is actually an invalid
character sequence in C– Literally not in the dictionary
that defines the language• Gets pre-processed into
some other character based on whatever comes after it
• Great way to obfuscate code even more!
![Page 71: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/71.jpg)
Why would I ever do this?• You wouldn’t!– In fact, you have to specifically enable them to
work• Apparently IBM *really* wanted to keep
them in the language spec– Deprecated for C++0x– Removed from C++17 and forward
• http://en.wikipedia.org/wiki/Digraphs_and_trigraphs
![Page 72: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/72.jpg)
QUESTIONS?C++ Tip of the Week
![Page 73: Announcements](https://reader035.fdocuments.in/reader035/viewer/2022070504/56816793550346895ddcccc3/html5/thumbnails/73.jpg)
NO PLAYTESTING!Sign up for Platformer2
design checks!