Skip to content

Repository files navigation

Tanks

My attempt to build modern tanks with old pygame.

Whatch demo:

Screnshots:

sc1sc2

After dealing with pygame, I consider myself overqualified for Google Maps.

Challenges:

DANGER: A LOT OF MATHS INVOLVING COS, SIN ANG TRIGONOMETRY FORMULAS
Most of the time working on this game was spent outside the laptop, trying to remember trigonometry and geometry formulas from school
and correlating them to pygame coordinate system. (which made my brain hurt,
still does)
- rotaing: - rotating in pygame is happening not about center, but relative to top left corner of the rectangle the image is in. While the image is rotating,
its rectangle is changing its size. To make it look like the image rotates about
its center you have to change the coordinates of the top left corner of the
image. It's hard to read, it was even harder to code.
It was probably the most challenging part of the project.
- finding center of bottom image to put the tank top in
- tring to change the relative center of tank top -- the point the top is rotating about
- finding exact spots where some of theimages should appear (like fire out of the turret when the tank shoots)
- shooting shells involved rotating too. Despite already having code that handled this kind of stuff quite good, the amount of small bugs accumulated by that time and some inattention made this task increadibly hard.
It forced me to review my code a couple of hundred of times and do some major
refactoring
- time: - creating time in the game, so that images (like explisions) can render
depending on that time
- collision:
- finding the tank area depending on its corners and checking if the point
lies inside that area. Pygame coordinate system made this task even harder.

Code snippets:

defmove_tank_bottom(self, list_of_objects):
radians=self.bottom_angle*math.pi/180add_x=math.cos(radians) *self.speedadd_y=math.sin(radians) *self.speednew_bottom_angle=self.bottom_angle+self.turn_speednew_x=self.x+add_xnew_y=self.y-add_yifself.detect_collision(list_of_objects, self.find_corners(new_bottom_angle, new_x, new_y, self.width, self.height)):
new_x=self.x+add_x/2new_y=self.y-add_y/2new_bottom_angle=self.bottom_angle+self.turn_speed/2ifnotself.detect_collision(list_of_objects, self.find_corners(new_bottom_angle, self.x, self.y, self.width, self.height) ):
self.bottom_angle=new_bottom_angleifnotself.detect_collision(list_of_objects, self.find_corners(self.bottom_angle, new_x, self.y, self.width, self.height) ):
self.x=new_xifnotself.detect_collision(list_of_objects, self.find_corners(self.bottom_angle, self.x, new_y, self.width, self.height) ):
self.y=new_ydefpoint_within_my_area(self, point_coordinates, corners_list):
#x1,y1###############x2,y2## ## ##x4,y4###############x3,y3### straight (line) formula => ax + bx + c = 0 ## or (y1 -y2)x + (x2 - x1)y + (x1y2 - x2y1) = 0x=point_coordinates[0]
y=point_coordinates[1]
foriinrange(len(corners_list)):
x1=corners_list[i][0]
y1=corners_list[i][1]
next_i= (i+1) % (len(corners_list))
x2=corners_list[next_i][0]
y2=corners_list[next_i][1]
a=y1-y2b=x2-x1c=x1*y2-x2*y1ifa*x+b*y+c<0: ## checking if the point lies on the right side returnFalse## of every line, which would mean it's insidereturnTrue## the areadefdetect_collision(self, list_of_objects, my_corners_list):
forobjinlist_of_objects:
ifobj!=self:
ifself.it_within_my_area(obj, my_corners_list) orself.me_within_its_area(obj, my_corners_list ):
returnTruereturnFalse

All in all, even though there were probably thousands of libraries better suited for game developing at that point, I'm incredibly glad I encountered all of those challenges and were able to persevere.

Of course, I wouldn't be able to do this by myself, especially at the start, when this huge pile of problems seemed to be impossible to solve. For guidence and assistence, I'd like to thank all of my mentors and especially Jonathan Martin @nybblr.

About

My attempt to build modern tanks with old pygame.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - illiaChaban/pygame: My attempt to build modern tanks with old pygame. · GitHub
Skip to content

Repository files navigation

Tanks

My attempt to build modern tanks with old pygame.

Whatch demo:

Screnshots:

sc1sc2

After dealing with pygame, I consider myself overqualified for Google Maps.

Challenges:

DANGER: A LOT OF MATHS INVOLVING COS, SIN ANG TRIGONOMETRY FORMULAS
Most of the time working on this game was spent outside the laptop, trying to remember trigonometry and geometry formulas from school
and correlating them to pygame coordinate system. (which made my brain hurt,
still does)
- rotaing: - rotating in pygame is happening not about center, but relative to top left corner of the rectangle the image is in. While the image is rotating,
its rectangle is changing its size. To make it look like the image rotates about
its center you have to change the coordinates of the top left corner of the
image. It's hard to read, it was even harder to code.
It was probably the most challenging part of the project.
- finding center of bottom image to put the tank top in
- tring to change the relative center of tank top -- the point the top is rotating about
- finding exact spots where some of theimages should appear (like fire out of the turret when the tank shoots)
- shooting shells involved rotating too. Despite already having code that handled this kind of stuff quite good, the amount of small bugs accumulated by that time and some inattention made this task increadibly hard.
It forced me to review my code a couple of hundred of times and do some major
refactoring
- time: - creating time in the game, so that images (like explisions) can render
depending on that time
- collision:
- finding the tank area depending on its corners and checking if the point
lies inside that area. Pygame coordinate system made this task even harder.

Code snippets:

defmove_tank_bottom(self, list_of_objects):
radians=self.bottom_angle*math.pi/180add_x=math.cos(radians) *self.speedadd_y=math.sin(radians) *self.speednew_bottom_angle=self.bottom_angle+self.turn_speednew_x=self.x+add_xnew_y=self.y-add_yifself.detect_collision(list_of_objects, self.find_corners(new_bottom_angle, new_x, new_y, self.width, self.height)):
new_x=self.x+add_x/2new_y=self.y-add_y/2new_bottom_angle=self.bottom_angle+self.turn_speed/2ifnotself.detect_collision(list_of_objects, self.find_corners(new_bottom_angle, self.x, self.y, self.width, self.height) ):
self.bottom_angle=new_bottom_angleifnotself.detect_collision(list_of_objects, self.find_corners(self.bottom_angle, new_x, self.y, self.width, self.height) ):
self.x=new_xifnotself.detect_collision(list_of_objects, self.find_corners(self.bottom_angle, self.x, new_y, self.width, self.height) ):
self.y=new_ydefpoint_within_my_area(self, point_coordinates, corners_list):
#x1,y1###############x2,y2## ## ##x4,y4###############x3,y3### straight (line) formula => ax + bx + c = 0 ## or (y1 -y2)x + (x2 - x1)y + (x1y2 - x2y1) = 0x=point_coordinates[0]
y=point_coordinates[1]
foriinrange(len(corners_list)):
x1=corners_list[i][0]
y1=corners_list[i][1]
next_i= (i+1) % (len(corners_list))
x2=corners_list[next_i][0]
y2=corners_list[next_i][1]
a=y1-y2b=x2-x1c=x1*y2-x2*y1ifa*x+b*y+c<0: ## checking if the point lies on the right side returnFalse## of every line, which would mean it's insidereturnTrue## the areadefdetect_collision(self, list_of_objects, my_corners_list):
forobjinlist_of_objects:
ifobj!=self:
ifself.it_within_my_area(obj, my_corners_list) orself.me_within_its_area(obj, my_corners_list ):
returnTruereturnFalse

All in all, even though there were probably thousands of libraries better suited for game developing at that point, I'm incredibly glad I encountered all of those challenges and were able to persevere.

Of course, I wouldn't be able to do this by myself, especially at the start, when this huge pile of problems seemed to be impossible to solve. For guidence and assistence, I'd like to thank all of my mentors and especially Jonathan Martin @nybblr.

About

My attempt to build modern tanks with old pygame.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - illiaChaban/pygame: My attempt to build modern tanks with old pygame. · GitHub
Skip to content

Repository files navigation

Tanks

My attempt to build modern tanks with old pygame.

Whatch demo:

Screnshots:

sc1sc2

After dealing with pygame, I consider myself overqualified for Google Maps.

Challenges:

DANGER: A LOT OF MATHS INVOLVING COS, SIN ANG TRIGONOMETRY FORMULAS
Most of the time working on this game was spent outside the laptop, trying to remember trigonometry and geometry formulas from school
and correlating them to pygame coordinate system. (which made my brain hurt,
still does)
- rotaing: - rotating in pygame is happening not about center, but relative to top left corner of the rectangle the image is in. While the image is rotating,
its rectangle is changing its size. To make it look like the image rotates about
its center you have to change the coordinates of the top left corner of the
image. It's hard to read, it was even harder to code.
It was probably the most challenging part of the project.
- finding center of bottom image to put the tank top in
- tring to change the relative center of tank top -- the point the top is rotating about
- finding exact spots where some of theimages should appear (like fire out of the turret when the tank shoots)
- shooting shells involved rotating too. Despite already having code that handled this kind of stuff quite good, the amount of small bugs accumulated by that time and some inattention made this task increadibly hard.
It forced me to review my code a couple of hundred of times and do some major
refactoring
- time: - creating time in the game, so that images (like explisions) can render
depending on that time
- collision:
- finding the tank area depending on its corners and checking if the point
lies inside that area. Pygame coordinate system made this task even harder.

Code snippets:

defmove_tank_bottom(self, list_of_objects):
radians=self.bottom_angle*math.pi/180add_x=math.cos(radians) *self.speedadd_y=math.sin(radians) *self.speednew_bottom_angle=self.bottom_angle+self.turn_speednew_x=self.x+add_xnew_y=self.y-add_yifself.detect_collision(list_of_objects, self.find_corners(new_bottom_angle, new_x, new_y, self.width, self.height)):
new_x=self.x+add_x/2new_y=self.y-add_y/2new_bottom_angle=self.bottom_angle+self.turn_speed/2ifnotself.detect_collision(list_of_objects, self.find_corners(new_bottom_angle, self.x, self.y, self.width, self.height) ):
self.bottom_angle=new_bottom_angleifnotself.detect_collision(list_of_objects, self.find_corners(self.bottom_angle, new_x, self.y, self.width, self.height) ):
self.x=new_xifnotself.detect_collision(list_of_objects, self.find_corners(self.bottom_angle, self.x, new_y, self.width, self.height) ):
self.y=new_ydefpoint_within_my_area(self, point_coordinates, corners_list):
#x1,y1###############x2,y2## ## ##x4,y4###############x3,y3### straight (line) formula => ax + bx + c = 0 ## or (y1 -y2)x + (x2 - x1)y + (x1y2 - x2y1) = 0x=point_coordinates[0]
y=point_coordinates[1]
foriinrange(len(corners_list)):
x1=corners_list[i][0]
y1=corners_list[i][1]
next_i= (i+1) % (len(corners_list))
x2=corners_list[next_i][0]
y2=corners_list[next_i][1]
a=y1-y2b=x2-x1c=x1*y2-x2*y1ifa*x+b*y+c<0: ## checking if the point lies on the right side returnFalse## of every line, which would mean it's insidereturnTrue## the areadefdetect_collision(self, list_of_objects, my_corners_list):
forobjinlist_of_objects:
ifobj!=self:
ifself.it_within_my_area(obj, my_corners_list) orself.me_within_its_area(obj, my_corners_list ):
returnTruereturnFalse

All in all, even though there were probably thousands of libraries better suited for game developing at that point, I'm incredibly glad I encountered all of those challenges and were able to persevere.

Of course, I wouldn't be able to do this by myself, especially at the start, when this huge pile of problems seemed to be impossible to solve. For guidence and assistence, I'd like to thank all of my mentors and especially Jonathan Martin @nybblr.

About

My attempt to build modern tanks with old pygame.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - illiaChaban/pygame: My attempt to build modern tanks with old pygame. · GitHub
Skip to content

Repository files navigation

Tanks

My attempt to build modern tanks with old pygame.

Whatch demo:

Screnshots:

sc1sc2

After dealing with pygame, I consider myself overqualified for Google Maps.

Challenges:

DANGER: A LOT OF MATHS INVOLVING COS, SIN ANG TRIGONOMETRY FORMULAS
Most of the time working on this game was spent outside the laptop, trying to remember trigonometry and geometry formulas from school
and correlating them to pygame coordinate system. (which made my brain hurt,
still does)
- rotaing: - rotating in pygame is happening not about center, but relative to top left corner of the rectangle the image is in. While the image is rotating,
its rectangle is changing its size. To make it look like the image rotates about
its center you have to change the coordinates of the top left corner of the
image. It's hard to read, it was even harder to code.
It was probably the most challenging part of the project.
- finding center of bottom image to put the tank top in
- tring to change the relative center of tank top -- the point the top is rotating about
- finding exact spots where some of theimages should appear (like fire out of the turret when the tank shoots)
- shooting shells involved rotating too. Despite already having code that handled this kind of stuff quite good, the amount of small bugs accumulated by that time and some inattention made this task increadibly hard.
It forced me to review my code a couple of hundred of times and do some major
refactoring
- time: - creating time in the game, so that images (like explisions) can render
depending on that time
- collision:
- finding the tank area depending on its corners and checking if the point
lies inside that area. Pygame coordinate system made this task even harder.

Code snippets:

defmove_tank_bottom(self, list_of_objects):
radians=self.bottom_angle*math.pi/180add_x=math.cos(radians) *self.speedadd_y=math.sin(radians) *self.speednew_bottom_angle=self.bottom_angle+self.turn_speednew_x=self.x+add_xnew_y=self.y-add_yifself.detect_collision(list_of_objects, self.find_corners(new_bottom_angle, new_x, new_y, self.width, self.height)):
new_x=self.x+add_x/2new_y=self.y-add_y/2new_bottom_angle=self.bottom_angle+self.turn_speed/2ifnotself.detect_collision(list_of_objects, self.find_corners(new_bottom_angle, self.x, self.y, self.width, self.height) ):
self.bottom_angle=new_bottom_angleifnotself.detect_collision(list_of_objects, self.find_corners(self.bottom_angle, new_x, self.y, self.width, self.height) ):
self.x=new_xifnotself.detect_collision(list_of_objects, self.find_corners(self.bottom_angle, self.x, new_y, self.width, self.height) ):
self.y=new_ydefpoint_within_my_area(self, point_coordinates, corners_list):
#x1,y1###############x2,y2## ## ##x4,y4###############x3,y3### straight (line) formula => ax + bx + c = 0 ## or (y1 -y2)x + (x2 - x1)y + (x1y2 - x2y1) = 0x=point_coordinates[0]
y=point_coordinates[1]
foriinrange(len(corners_list)):
x1=corners_list[i][0]
y1=corners_list[i][1]
next_i= (i+1) % (len(corners_list))
x2=corners_list[next_i][0]
y2=corners_list[next_i][1]
a=y1-y2b=x2-x1c=x1*y2-x2*y1ifa*x+b*y+c<0: ## checking if the point lies on the right side returnFalse## of every line, which would mean it's insidereturnTrue## the areadefdetect_collision(self, list_of_objects, my_corners_list):
forobjinlist_of_objects:
ifobj!=self:
ifself.it_within_my_area(obj, my_corners_list) orself.me_within_its_area(obj, my_corners_list ):
returnTruereturnFalse

All in all, even though there were probably thousands of libraries better suited for game developing at that point, I'm incredibly glad I encountered all of those challenges and were able to persevere.

Of course, I wouldn't be able to do this by myself, especially at the start, when this huge pile of problems seemed to be impossible to solve. For guidence and assistence, I'd like to thank all of my mentors and especially Jonathan Martin @nybblr.

About

My attempt to build modern tanks with old pygame.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - illiaChaban/pygame: My attempt to build modern tanks with old pygame. · GitHub
Skip to content

Repository files navigation

Tanks

My attempt to build modern tanks with old pygame.

Whatch demo:

Screnshots:

sc1sc2

After dealing with pygame, I consider myself overqualified for Google Maps.

Challenges:

DANGER: A LOT OF MATHS INVOLVING COS, SIN ANG TRIGONOMETRY FORMULAS
Most of the time working on this game was spent outside the laptop, trying to remember trigonometry and geometry formulas from school
and correlating them to pygame coordinate system. (which made my brain hurt,
still does)
- rotaing: - rotating in pygame is happening not about center, but relative to top left corner of the rectangle the image is in. While the image is rotating,
its rectangle is changing its size. To make it look like the image rotates about
its center you have to change the coordinates of the top left corner of the
image. It's hard to read, it was even harder to code.
It was probably the most challenging part of the project.
- finding center of bottom image to put the tank top in
- tring to change the relative center of tank top -- the point the top is rotating about
- finding exact spots where some of theimages should appear (like fire out of the turret when the tank shoots)
- shooting shells involved rotating too. Despite already having code that handled this kind of stuff quite good, the amount of small bugs accumulated by that time and some inattention made this task increadibly hard.
It forced me to review my code a couple of hundred of times and do some major
refactoring
- time: - creating time in the game, so that images (like explisions) can render
depending on that time
- collision:
- finding the tank area depending on its corners and checking if the point
lies inside that area. Pygame coordinate system made this task even harder.

Code snippets:

defmove_tank_bottom(self, list_of_objects):
radians=self.bottom_angle*math.pi/180add_x=math.cos(radians) *self.speedadd_y=math.sin(radians) *self.speednew_bottom_angle=self.bottom_angle+self.turn_speednew_x=self.x+add_xnew_y=self.y-add_yifself.detect_collision(list_of_objects, self.find_corners(new_bottom_angle, new_x, new_y, self.width, self.height)):
new_x=self.x+add_x/2new_y=self.y-add_y/2new_bottom_angle=self.bottom_angle+self.turn_speed/2ifnotself.detect_collision(list_of_objects, self.find_corners(new_bottom_angle, self.x, self.y, self.width, self.height) ):
self.bottom_angle=new_bottom_angleifnotself.detect_collision(list_of_objects, self.find_corners(self.bottom_angle, new_x, self.y, self.width, self.height) ):
self.x=new_xifnotself.detect_collision(list_of_objects, self.find_corners(self.bottom_angle, self.x, new_y, self.width, self.height) ):
self.y=new_ydefpoint_within_my_area(self, point_coordinates, corners_list):
#x1,y1###############x2,y2## ## ##x4,y4###############x3,y3### straight (line) formula => ax + bx + c = 0 ## or (y1 -y2)x + (x2 - x1)y + (x1y2 - x2y1) = 0x=point_coordinates[0]
y=point_coordinates[1]
foriinrange(len(corners_list)):
x1=corners_list[i][0]
y1=corners_list[i][1]
next_i= (i+1) % (len(corners_list))
x2=corners_list[next_i][0]
y2=corners_list[next_i][1]
a=y1-y2b=x2-x1c=x1*y2-x2*y1ifa*x+b*y+c<0: ## checking if the point lies on the right side returnFalse## of every line, which would mean it's insidereturnTrue## the areadefdetect_collision(self, list_of_objects, my_corners_list):
forobjinlist_of_objects:
ifobj!=self:
ifself.it_within_my_area(obj, my_corners_list) orself.me_within_its_area(obj, my_corners_list ):
returnTruereturnFalse

All in all, even though there were probably thousands of libraries better suited for game developing at that point, I'm incredibly glad I encountered all of those challenges and were able to persevere.

Of course, I wouldn't be able to do this by myself, especially at the start, when this huge pile of problems seemed to be impossible to solve. For guidence and assistence, I'd like to thank all of my mentors and especially Jonathan Martin @nybblr.

About

My attempt to build modern tanks with old pygame.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - illiaChaban/pygame: My attempt to build modern tanks with old pygame. · GitHub
Skip to content

Repository files navigation

Tanks

My attempt to build modern tanks with old pygame.

Whatch demo:

Screnshots:

sc1sc2

After dealing with pygame, I consider myself overqualified for Google Maps.

Challenges:

DANGER: A LOT OF MATHS INVOLVING COS, SIN ANG TRIGONOMETRY FORMULAS
Most of the time working on this game was spent outside the laptop, trying to remember trigonometry and geometry formulas from school
and correlating them to pygame coordinate system. (which made my brain hurt,
still does)
- rotaing: - rotating in pygame is happening not about center, but relative to top left corner of the rectangle the image is in. While the image is rotating,
its rectangle is changing its size. To make it look like the image rotates about
its center you have to change the coordinates of the top left corner of the
image. It's hard to read, it was even harder to code.
It was probably the most challenging part of the project.
- finding center of bottom image to put the tank top in
- tring to change the relative center of tank top -- the point the top is rotating about
- finding exact spots where some of theimages should appear (like fire out of the turret when the tank shoots)
- shooting shells involved rotating too. Despite already having code that handled this kind of stuff quite good, the amount of small bugs accumulated by that time and some inattention made this task increadibly hard.
It forced me to review my code a couple of hundred of times and do some major
refactoring
- time: - creating time in the game, so that images (like explisions) can render
depending on that time
- collision:
- finding the tank area depending on its corners and checking if the point
lies inside that area. Pygame coordinate system made this task even harder.

Code snippets:

defmove_tank_bottom(self, list_of_objects):
radians=self.bottom_angle*math.pi/180add_x=math.cos(radians) *self.speedadd_y=math.sin(radians) *self.speednew_bottom_angle=self.bottom_angle+self.turn_speednew_x=self.x+add_xnew_y=self.y-add_yifself.detect_collision(list_of_objects, self.find_corners(new_bottom_angle, new_x, new_y, self.width, self.height)):
new_x=self.x+add_x/2new_y=self.y-add_y/2new_bottom_angle=self.bottom_angle+self.turn_speed/2ifnotself.detect_collision(list_of_objects, self.find_corners(new_bottom_angle, self.x, self.y, self.width, self.height) ):
self.bottom_angle=new_bottom_angleifnotself.detect_collision(list_of_objects, self.find_corners(self.bottom_angle, new_x, self.y, self.width, self.height) ):
self.x=new_xifnotself.detect_collision(list_of_objects, self.find_corners(self.bottom_angle, self.x, new_y, self.width, self.height) ):
self.y=new_ydefpoint_within_my_area(self, point_coordinates, corners_list):
#x1,y1###############x2,y2## ## ##x4,y4###############x3,y3### straight (line) formula => ax + bx + c = 0 ## or (y1 -y2)x + (x2 - x1)y + (x1y2 - x2y1) = 0x=point_coordinates[0]
y=point_coordinates[1]
foriinrange(len(corners_list)):
x1=corners_list[i][0]
y1=corners_list[i][1]
next_i= (i+1) % (len(corners_list))
x2=corners_list[next_i][0]
y2=corners_list[next_i][1]
a=y1-y2b=x2-x1c=x1*y2-x2*y1ifa*x+b*y+c<0: ## checking if the point lies on the right side returnFalse## of every line, which would mean it's insidereturnTrue## the areadefdetect_collision(self, list_of_objects, my_corners_list):
forobjinlist_of_objects:
ifobj!=self:
ifself.it_within_my_area(obj, my_corners_list) orself.me_within_its_area(obj, my_corners_list ):
returnTruereturnFalse

All in all, even though there were probably thousands of libraries better suited for game developing at that point, I'm incredibly glad I encountered all of those challenges and were able to persevere.

Of course, I wouldn't be able to do this by myself, especially at the start, when this huge pile of problems seemed to be impossible to solve. For guidence and assistence, I'd like to thank all of my mentors and especially Jonathan Martin @nybblr.

About

My attempt to build modern tanks with old pygame.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - illiaChaban/pygame: My attempt to build modern tanks with old pygame. · GitHub
Skip to content

Repository files navigation

Tanks

My attempt to build modern tanks with old pygame.

Whatch demo:

Screnshots:

sc1sc2

After dealing with pygame, I consider myself overqualified for Google Maps.

Challenges:

DANGER: A LOT OF MATHS INVOLVING COS, SIN ANG TRIGONOMETRY FORMULAS
Most of the time working on this game was spent outside the laptop, trying to remember trigonometry and geometry formulas from school
and correlating them to pygame coordinate system. (which made my brain hurt,
still does)
- rotaing: - rotating in pygame is happening not about center, but relative to top left corner of the rectangle the image is in. While the image is rotating,
its rectangle is changing its size. To make it look like the image rotates about
its center you have to change the coordinates of the top left corner of the
image. It's hard to read, it was even harder to code.
It was probably the most challenging part of the project.
- finding center of bottom image to put the tank top in
- tring to change the relative center of tank top -- the point the top is rotating about
- finding exact spots where some of theimages should appear (like fire out of the turret when the tank shoots)
- shooting shells involved rotating too. Despite already having code that handled this kind of stuff quite good, the amount of small bugs accumulated by that time and some inattention made this task increadibly hard.
It forced me to review my code a couple of hundred of times and do some major
refactoring
- time: - creating time in the game, so that images (like explisions) can render
depending on that time
- collision:
- finding the tank area depending on its corners and checking if the point
lies inside that area. Pygame coordinate system made this task even harder.

Code snippets:

defmove_tank_bottom(self, list_of_objects):
radians=self.bottom_angle*math.pi/180add_x=math.cos(radians) *self.speedadd_y=math.sin(radians) *self.speednew_bottom_angle=self.bottom_angle+self.turn_speednew_x=self.x+add_xnew_y=self.y-add_yifself.detect_collision(list_of_objects, self.find_corners(new_bottom_angle, new_x, new_y, self.width, self.height)):
new_x=self.x+add_x/2new_y=self.y-add_y/2new_bottom_angle=self.bottom_angle+self.turn_speed/2ifnotself.detect_collision(list_of_objects, self.find_corners(new_bottom_angle, self.x, self.y, self.width, self.height) ):
self.bottom_angle=new_bottom_angleifnotself.detect_collision(list_of_objects, self.find_corners(self.bottom_angle, new_x, self.y, self.width, self.height) ):
self.x=new_xifnotself.detect_collision(list_of_objects, self.find_corners(self.bottom_angle, self.x, new_y, self.width, self.height) ):
self.y=new_ydefpoint_within_my_area(self, point_coordinates, corners_list):
#x1,y1###############x2,y2## ## ##x4,y4###############x3,y3### straight (line) formula => ax + bx + c = 0 ## or (y1 -y2)x + (x2 - x1)y + (x1y2 - x2y1) = 0x=point_coordinates[0]
y=point_coordinates[1]
foriinrange(len(corners_list)):
x1=corners_list[i][0]
y1=corners_list[i][1]
next_i= (i+1) % (len(corners_list))
x2=corners_list[next_i][0]
y2=corners_list[next_i][1]
a=y1-y2b=x2-x1c=x1*y2-x2*y1ifa*x+b*y+c<0: ## checking if the point lies on the right side returnFalse## of every line, which would mean it's insidereturnTrue## the areadefdetect_collision(self, list_of_objects, my_corners_list):
forobjinlist_of_objects:
ifobj!=self:
ifself.it_within_my_area(obj, my_corners_list) orself.me_within_its_area(obj, my_corners_list ):
returnTruereturnFalse

All in all, even though there were probably thousands of libraries better suited for game developing at that point, I'm incredibly glad I encountered all of those challenges and were able to persevere.

Of course, I wouldn't be able to do this by myself, especially at the start, when this huge pile of problems seemed to be impossible to solve. For guidence and assistence, I'd like to thank all of my mentors and especially Jonathan Martin @nybblr.

About

My attempt to build modern tanks with old pygame.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - illiaChaban/pygame: My attempt to build modern tanks with old pygame. · GitHub
Skip to content

Repository files navigation

Tanks

My attempt to build modern tanks with old pygame.

Whatch demo:

Screnshots:

sc1sc2

After dealing with pygame, I consider myself overqualified for Google Maps.

Challenges:

DANGER: A LOT OF MATHS INVOLVING COS, SIN ANG TRIGONOMETRY FORMULAS
Most of the time working on this game was spent outside the laptop, trying to remember trigonometry and geometry formulas from school
and correlating them to pygame coordinate system. (which made my brain hurt,
still does)
- rotaing: - rotating in pygame is happening not about center, but relative to top left corner of the rectangle the image is in. While the image is rotating,
its rectangle is changing its size. To make it look like the image rotates about
its center you have to change the coordinates of the top left corner of the
image. It's hard to read, it was even harder to code.
It was probably the most challenging part of the project.
- finding center of bottom image to put the tank top in
- tring to change the relative center of tank top -- the point the top is rotating about
- finding exact spots where some of theimages should appear (like fire out of the turret when the tank shoots)
- shooting shells involved rotating too. Despite already having code that handled this kind of stuff quite good, the amount of small bugs accumulated by that time and some inattention made this task increadibly hard.
It forced me to review my code a couple of hundred of times and do some major
refactoring
- time: - creating time in the game, so that images (like explisions) can render
depending on that time
- collision:
- finding the tank area depending on its corners and checking if the point
lies inside that area. Pygame coordinate system made this task even harder.

Code snippets:

defmove_tank_bottom(self, list_of_objects):
radians=self.bottom_angle*math.pi/180add_x=math.cos(radians) *self.speedadd_y=math.sin(radians) *self.speednew_bottom_angle=self.bottom_angle+self.turn_speednew_x=self.x+add_xnew_y=self.y-add_yifself.detect_collision(list_of_objects, self.find_corners(new_bottom_angle, new_x, new_y, self.width, self.height)):
new_x=self.x+add_x/2new_y=self.y-add_y/2new_bottom_angle=self.bottom_angle+self.turn_speed/2ifnotself.detect_collision(list_of_objects, self.find_corners(new_bottom_angle, self.x, self.y, self.width, self.height) ):
self.bottom_angle=new_bottom_angleifnotself.detect_collision(list_of_objects, self.find_corners(self.bottom_angle, new_x, self.y, self.width, self.height) ):
self.x=new_xifnotself.detect_collision(list_of_objects, self.find_corners(self.bottom_angle, self.x, new_y, self.width, self.height) ):
self.y=new_ydefpoint_within_my_area(self, point_coordinates, corners_list):
#x1,y1###############x2,y2## ## ##x4,y4###############x3,y3### straight (line) formula => ax + bx + c = 0 ## or (y1 -y2)x + (x2 - x1)y + (x1y2 - x2y1) = 0x=point_coordinates[0]
y=point_coordinates[1]
foriinrange(len(corners_list)):
x1=corners_list[i][0]
y1=corners_list[i][1]
next_i= (i+1) % (len(corners_list))
x2=corners_list[next_i][0]
y2=corners_list[next_i][1]
a=y1-y2b=x2-x1c=x1*y2-x2*y1ifa*x+b*y+c<0: ## checking if the point lies on the right side returnFalse## of every line, which would mean it's insidereturnTrue## the areadefdetect_collision(self, list_of_objects, my_corners_list):
forobjinlist_of_objects:
ifobj!=self:
ifself.it_within_my_area(obj, my_corners_list) orself.me_within_its_area(obj, my_corners_list ):
returnTruereturnFalse

All in all, even though there were probably thousands of libraries better suited for game developing at that point, I'm incredibly glad I encountered all of those challenges and were able to persevere.

Of course, I wouldn't be able to do this by myself, especially at the start, when this huge pile of problems seemed to be impossible to solve. For guidence and assistence, I'd like to thank all of my mentors and especially Jonathan Martin @nybblr.

About

My attempt to build modern tanks with old pygame.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages