Added introduction and images for some projects
@@ -13,4 +13,22 @@
|
||||
static readonly TERAPORT_LOGO = '/assets/logos/teraport_gmbh_logo.jpg';
|
||||
|
||||
static readonly CV: 'assets/cv/andreas-dahm-cv.pdf';
|
||||
|
||||
//project images
|
||||
static readonly EL_MUCHO_1 = '/assets/projects/el-mucho/1.jpg';
|
||||
static readonly EL_MUCHO_2 = '/assets/projects/el-mucho/2.jpg';
|
||||
static readonly EL_MUCHO_3 = '/assets/projects/el-mucho/3.jpg';
|
||||
static readonly EL_MUCHO_4 = '/assets/projects/el-mucho/4.jpg';
|
||||
|
||||
static readonly GAME_JAMS_1 = '/assets/projects/game-jams/1.png';
|
||||
static readonly GAME_JAMS_2 = '/assets/projects/game-jams/2.png';
|
||||
static readonly GAME_JAMS_3 = '/assets/projects/game-jams/3.png';
|
||||
|
||||
static readonly DIPLOMA_1 = '/assets/projects/diploma/1.jpg';
|
||||
static readonly DIPLOMA_2 = '/assets/projects/diploma/2.jpg';
|
||||
static readonly DIPLOMA_3 = '/assets/projects/diploma/3.jpg';
|
||||
static readonly DIPLOMA_4 = '/assets/projects/diploma/4.jpg';
|
||||
static readonly DIPLOMA_5 = '/assets/projects/diploma/5.jpg';
|
||||
static readonly DIPLOMA_6 = '/assets/projects/diploma/6.jpg';
|
||||
|
||||
}
|
||||
|
||||
@@ -116,18 +116,21 @@
|
||||
<div class="company-row">
|
||||
{{ (entry.key + '.DESCRIPTION') | translate }}
|
||||
</div>
|
||||
@if (entry.externalLink) {
|
||||
<div class="link-row">
|
||||
<a class="link-with-icon"
|
||||
href="{{entry.externalLink}}"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer">
|
||||
<mat-icon>open_in_new</mat-icon>
|
||||
{{ (entry.key + '.LINK_EXTERNAL') | translate }}
|
||||
</a>
|
||||
</div>
|
||||
}
|
||||
<div class="link-row">
|
||||
<a class="link-with-icon"
|
||||
href="{{entry.externalLink}}"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer">
|
||||
<mat-icon>open_in_new</mat-icon>
|
||||
{{ (entry.key + '.LINK_EXTERNAL') | translate }}
|
||||
</a>
|
||||
</div>
|
||||
<div class="link-row">
|
||||
<a class="link-with-icon"
|
||||
href="{{entry.internalLink}}"
|
||||
[routerLink]="['/projects']"
|
||||
[queryParams]="{ project: entry.identifier }"
|
||||
rel="noopener noreferrer">
|
||||
<mat-icon>link</mat-icon>
|
||||
{{ (entry.key + '.LINK_INTERNAL') | translate }}
|
||||
|
||||
@@ -8,6 +8,7 @@ import { MatDividerModule } from '@angular/material/divider';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import {UrlConstants} from '../../constants/UrlConstants';
|
||||
import {AssetsConstants} from '../../constants/AssetsConstants';
|
||||
import {RouterLink} from '@angular/router';
|
||||
|
||||
|
||||
@Component({
|
||||
@@ -20,8 +21,9 @@ import {AssetsConstants} from '../../constants/AssetsConstants';
|
||||
MatIconModule,
|
||||
MatButtonModule,
|
||||
MatDividerModule,
|
||||
TranslateModule
|
||||
],
|
||||
TranslateModule,
|
||||
RouterLink
|
||||
],
|
||||
templateUrl: './about.component.html',
|
||||
styleUrl: './about.component.scss'
|
||||
})
|
||||
@@ -71,17 +73,26 @@ export class AboutComponent {
|
||||
{
|
||||
key: 'ABOUT.PROJECT.P2',
|
||||
externalLink: 'https://andreas-dahm.eu/',
|
||||
internalLink: 'projects'
|
||||
internalLink: 'projects',
|
||||
identifier: 'playground',
|
||||
},
|
||||
{
|
||||
key: 'ABOUT.PROJECT.P1',
|
||||
externalLink: 'https://store.steampowered.com/app/1532640/El_Mucho/',
|
||||
internalLink: 'projects'
|
||||
internalLink: 'projects',
|
||||
identifier: 'elmucho',
|
||||
},
|
||||
{
|
||||
key: 'ABOUT.PROJECT.P0',
|
||||
externalLink: 'https://itch.io/c/6628860/lobos-collection',
|
||||
internalLink: 'projects'
|
||||
internalLink: 'projects',
|
||||
identifier: 'gamejams',
|
||||
},
|
||||
{
|
||||
key: 'ABOUT.PROJECT.DIPLOMA',
|
||||
externalLink: '',
|
||||
internalLink: 'projects',
|
||||
identifier: 'diploma',
|
||||
}
|
||||
];
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<mat-accordion class="project-headers-align" multi>
|
||||
@for (project of allProjects; track project.title) {
|
||||
<mat-expansion-panel>
|
||||
<mat-accordion class="project-headers-align">
|
||||
@for (project of allProjects; track project) {
|
||||
<mat-expansion-panel [expanded]="isExpanded(project.identifier)">
|
||||
<mat-expansion-panel-header>
|
||||
<mat-panel-title>{{ project.title | translate }}</mat-panel-title>
|
||||
<mat-panel-description>
|
||||
@@ -8,7 +8,15 @@
|
||||
<mat-icon>{{ project.icon }}</mat-icon>
|
||||
</mat-panel-description>
|
||||
</mat-expansion-panel-header>
|
||||
|
||||
<p>{{ project.introduction | translate }}</p>
|
||||
@if (project.images.length > 0)
|
||||
{
|
||||
<div class="gallery">
|
||||
@for (img of project.images; track img) {
|
||||
<img class="gallery-img" [src]="img" [alt]="project.title | translate" />
|
||||
}
|
||||
</div>
|
||||
}
|
||||
</mat-expansion-panel>
|
||||
}
|
||||
</mat-accordion>
|
||||
|
||||
@@ -6,3 +6,16 @@
|
||||
.project-headers-align .mat-mdc-form-field + .mat-mdc-form-field {
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.gallery {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(384px, 1fr));
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.gallery-img {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
display: block;
|
||||
border-radius: 16px;
|
||||
}
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
import { Component } from '@angular/core';
|
||||
import {Component, inject, signal} from '@angular/core';
|
||||
import {MatAccordion, MatExpansionPanel, MatExpansionPanelDescription, MatExpansionPanelHeader, MatExpansionPanelTitle} from '@angular/material/expansion';
|
||||
import {MatIcon} from '@angular/material/icon';
|
||||
import {TranslatePipe} from '@ngx-translate/core';
|
||||
import {ActivatedRoute} from '@angular/router';
|
||||
import {AssetsConstants} from '../../constants/AssetsConstants';
|
||||
|
||||
export interface Projects {
|
||||
identifier: string;
|
||||
title: string,
|
||||
shortDescription: string,
|
||||
introduction: string,
|
||||
images: string[],
|
||||
icon: string,
|
||||
}
|
||||
|
||||
@@ -18,27 +23,58 @@ export interface Projects {
|
||||
MatExpansionPanelTitle,
|
||||
MatExpansionPanelDescription,
|
||||
MatIcon,
|
||||
TranslatePipe
|
||||
TranslatePipe,
|
||||
],
|
||||
templateUrl: './projects.component.html',
|
||||
styleUrl: './projects.component.scss',
|
||||
})
|
||||
export class ProjectsComponent {
|
||||
|
||||
private readonly route = inject(ActivatedRoute);
|
||||
selectedKey = signal<string | null>(null);
|
||||
|
||||
allProjects: Projects[] = [
|
||||
{
|
||||
identifier: "playground",
|
||||
title: 'PROJECTS.PLAYGROUND.TITLE',
|
||||
shortDescription: 'PROJECTS.PLAYGROUND.SHORT_DESCRIPTION',
|
||||
introduction: 'PROJECTS.PLAYGROUND.INTRODUCTION',
|
||||
images: [],
|
||||
icon: 'web'
|
||||
},
|
||||
{
|
||||
identifier: "elmucho",
|
||||
title: 'PROJECTS.EL_MUCHO.TITLE',
|
||||
shortDescription: 'PROJECTS.EL_MUCHO.SHORT_DESCRIPTION',
|
||||
introduction: 'PROJECTS.EL_MUCHO.INTRODUCTION',
|
||||
images: [AssetsConstants.EL_MUCHO_1, AssetsConstants.EL_MUCHO_2, AssetsConstants.EL_MUCHO_3, AssetsConstants.EL_MUCHO_4],
|
||||
icon: 'sports_esports'
|
||||
},
|
||||
{
|
||||
identifier: "gamejams",
|
||||
title: 'PROJECTS.GAME_JAMS.TITLE',
|
||||
shortDescription: 'PROJECTS.GAME_JAMS.SHORT_DESCRIPTION',
|
||||
introduction: 'PROJECTS.GAME_JAMS.INTRODUCTION',
|
||||
images: [AssetsConstants.GAME_JAMS_1, AssetsConstants.GAME_JAMS_2, AssetsConstants.GAME_JAMS_3],
|
||||
icon: 'videogame_asset'
|
||||
},
|
||||
{
|
||||
identifier: "diploma",
|
||||
title: 'PROJECTS.DIPLOMA.TITLE',
|
||||
shortDescription: 'PROJECTS.DIPLOMA.SHORT_DESCRIPTION',
|
||||
introduction: 'PROJECTS.DIPLOMA.INTRODUCTION',
|
||||
images: [AssetsConstants.DIPLOMA_1, AssetsConstants.DIPLOMA_2, AssetsConstants.DIPLOMA_3, AssetsConstants.DIPLOMA_4, AssetsConstants.DIPLOMA_5, AssetsConstants.DIPLOMA_6],
|
||||
icon: 'history_edu'
|
||||
}
|
||||
]
|
||||
|
||||
constructor() {
|
||||
this.route.queryParamMap.subscribe(params => {
|
||||
this.selectedKey.set(params.get('project'));
|
||||
});
|
||||
}
|
||||
|
||||
isExpanded(projectKey: string): boolean {
|
||||
return this.selectedKey() === projectKey;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -176,6 +176,16 @@
|
||||
"P2": "Lernen, fokussiert und effizient unter strengen Zeitvorgaben zu arbeiten.",
|
||||
"P3": "Die Freude zu erleben, in kurzer Zeit ein spielbares Projekt zu erstellen und andere damit spielen zu sehen."
|
||||
}
|
||||
},
|
||||
"DIPLOMA": {
|
||||
"TITLE": "Diplomarbeit - Kollisionserkennung und Behandlung von komplexen Kleidungsstücken.",
|
||||
"DESCRIPTION": "Die Diplomarbeit handelt von der Erkennung und der Behandlung von Kollisionen zwischen, sowie innerhalb, einzelnen Kleidungsstücken in Echtzeit. Das ist gerade aufgrund der Flexibilität von Stoffen und deren unterschiedlichen Eigenschaften besonders herausfordernd.",
|
||||
"LINK_INTERNAL": "Projektdetails",
|
||||
"HIGHLIGHTS": {
|
||||
"P1": "Echtzeit behandlung von Kollisionserkennung und Behandlung.",
|
||||
"P2": "Verstehen und Einschätzen von wissenschaftlichen Arbeiten.",
|
||||
"P3": "Adaption und Weiterentwicklung von vorausgegangenen Forschungsarbeiten."
|
||||
}
|
||||
}
|
||||
},
|
||||
"EDUCATION": {
|
||||
@@ -219,15 +229,23 @@
|
||||
"PROJECTS": {
|
||||
"PLAYGROUND": {
|
||||
"TITLE": "Playground Website",
|
||||
"SHORT_DESCRIPTION": "Hier geht es um diese Webseite."
|
||||
"SHORT_DESCRIPTION": "Hier geht es um diese Webseite.",
|
||||
"INTRODUCTION": "Dieses Projekt ist hauptsächlich als eine Art 'Spielwiese' gestartet, daher der Name. Es ist geplant, die Seite mit der Zeit weiter auszubauen. Dabei werden hier neue Projekte auftauchen, oder ich werde die Seite an für sich weiter ausbauen, weil ich neue Sachen im Rahmen von Web Technologien ausprobieren möchte."
|
||||
},
|
||||
"EL_MUCHO": {
|
||||
"TITLE": "El Mucho",
|
||||
"SHORT_DESCRIPTION": "Hier geht es um mein ersten Spiel auf Steam."
|
||||
"SHORT_DESCRIPTION": "Hier geht es um mein ersten Spiel auf Steam.",
|
||||
"INTRODUCTION": "El Mucho ist ein rundenbasiertes taktisches RPG in einer fiktiven Welt namens Liberika. Es ist angelehnt an alte Klassiker wie Langrisser aka Warsong. In El Mucho geht es darum, die Welt gegen die Angriffe der fiesen Monster zu verteidigen."
|
||||
},
|
||||
"GAME_JAMS": {
|
||||
"TITLE": "Game Jams",
|
||||
"SHORT_DESCRIPTION": "Hier geht es meine Teilnahme an mehreren Game Jams."
|
||||
"SHORT_DESCRIPTION": "Hier geht es meine Teilnahme an mehreren Game Jams.",
|
||||
"INTRODUCTION": "Da ich mich für die Entwicklung von Spielen interessiert, sind Game Jams für mich optimal, um fokussiert an neuen Ideen zu arbeiten und dabei Prototypen zu entwickeln, um zu sehen, ob Spielideen funktionieren oder nicht. In den letzten Jahren habe ich an einigen Game Jams teilgenommen und fasse das hier zusammen."
|
||||
},
|
||||
"DIPLOMA": {
|
||||
"TITLE": "Diplomarbeit",
|
||||
"SHORT_DESCRIPTION": "Kollisionserkennung und Behandlung von komplexen Kleidungsstücken.",
|
||||
"INTRODUCTION": "Die Diplomarbeit handelt von der Erkennung und der Behandlung von Kollisionen zwischen, sowie innerhalb, einzelnen Kleidungsstücken in Echtzeit. Das ist gerade aufgrund der Flexibilität von Stoffen und deren unterschiedlichen Eigenschaften besonders herausfordernd."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,6 +166,16 @@
|
||||
"P2": "Learning to stay focused and work effectively under strict time constraints.",
|
||||
"P3": "Experiencing the joy of creating a playable game in a short timeframe and seeing others enjoy it."
|
||||
}
|
||||
},
|
||||
"DIPLOMA": {
|
||||
"TITLE": "Diploma thesis - Collision detection and handling of complex garments.",
|
||||
"DESCRIPTION": "The thesis deals with the detection and handling of collisions between and within individual items of clothing in real time. This is particularly challenging due to the flexibility of fabrics and their varying properties.",
|
||||
"LINK_INTERNAL": "Project details",
|
||||
"HIGHLIGHTS": {
|
||||
"P1": "Real-time handling of collision detection and response.",
|
||||
"P2": "Understanding and evaluating scientific papers.",
|
||||
"P3": "Adaptation and further development of previous research work."
|
||||
}
|
||||
}
|
||||
},
|
||||
"EDUCATION": {
|
||||
@@ -209,15 +219,23 @@
|
||||
"PROJECTS": {
|
||||
"PLAYGROUND": {
|
||||
"TITLE": "Playground Website",
|
||||
"SHORT_DESCRIPTION": "This is about this website."
|
||||
"SHORT_DESCRIPTION": "This is about this website.",
|
||||
"INTRODUCTION": "This project was mainly started as a kind of “playground”, hence the name. The plan is to expand the site over time. New projects will appear here, or I will continue to expand the site itself because I want to try out new things in the field of web technologies."
|
||||
},
|
||||
"EL_MUCHO": {
|
||||
"TITLE": "El Mucho",
|
||||
"SHORT_DESCRIPTION": "This is about my first game on steam."
|
||||
"SHORT_DESCRIPTION": "This is about my first game on steam.",
|
||||
"INTRODUCTION": "El Mucho is a turn-based tactical RPG set in a fictional world called Liberika. It is inspired by old classics such as Langrisser, also known as Warsong. El Mucho is about defending the world against attacks from nasty monsters."
|
||||
},
|
||||
"GAME_JAMS": {
|
||||
"TITLE": "Game Jams",
|
||||
"SHORT_DESCRIPTION": "This is about my participation at several game jams."
|
||||
"SHORT_DESCRIPTION": "This is about my participation at several game jams.",
|
||||
"INTRODUCTION": "Since I am interested in game development, game jams are ideal for me to focus on new ideas and develop prototypes to see whether game ideas work or not. I have participated in several game jams over the past few years and summarise my experiences here."
|
||||
},
|
||||
"DIPLOMA": {
|
||||
"TITLE": "Diploma thesis",
|
||||
"SHORT_DESCRIPTION": "Collision detection and handling of complex garments.",
|
||||
"INTRODUCTION": "The thesis deals with the detection and handling of collisions between and within individual items of clothing in real time. This is particularly challenging due to the flexibility of fabrics and their varying properties."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BIN
src/assets/projects/diploma/1.jpg
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
src/assets/projects/diploma/2.jpg
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
src/assets/projects/diploma/3.jpg
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
src/assets/projects/diploma/4.jpg
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
src/assets/projects/diploma/5.jpg
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
src/assets/projects/diploma/6.jpg
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
src/assets/projects/el-mucho/1.jpg
Normal file
|
After Width: | Height: | Size: 426 KiB |
BIN
src/assets/projects/el-mucho/2.jpg
Normal file
|
After Width: | Height: | Size: 202 KiB |
BIN
src/assets/projects/el-mucho/3.jpg
Normal file
|
After Width: | Height: | Size: 739 KiB |
BIN
src/assets/projects/el-mucho/4.jpg
Normal file
|
After Width: | Height: | Size: 742 KiB |
BIN
src/assets/projects/game-jams/1.png
Normal file
|
After Width: | Height: | Size: 104 KiB |
BIN
src/assets/projects/game-jams/2.png
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
src/assets/projects/game-jams/3.png
Normal file
|
After Width: | Height: | Size: 29 KiB |